Sources¶
The built-in sources are:
argparse¶
-
class
multiconfparse.ArgparseSource(config_specs, priority=20) Obtains config values from an
argparse.ArgumentParser.Do not create
ArgparseSourceobjects directly, add them to aConfigParserobject usingConfigParser.add_source(). For example:parser = multiconfparse.ConfigParser() parser.add_config("config_item1") parser.add_config("config_item2", nargs=2, type=int) parser.add_config("config_item3", action="store_true") argparse_source = parser.add_source("argparse") argparse_parser = argparse.ArgumentParser() argparse_parser.add_argument("arg1") argparse_parser.add_argument("--opt1", type=int, action="append") argparse_source.add_configs_to_argparse_parser(argparse_parser) args = argparse_parser.parse_args(( "arg1_value --config-item1 v1 --config-item2 1 2 --opt1 opt1_v1 " "--config-item-3 --opt1 opt1_v2" ).split()) argparse_source.notify_parsed_args(args) config_parser.parse_config() # -> multiconfparse.Namespace { # "config_item1": "v1", # "config_item2": [1, 2], # "config_item3": True, # }
The
argparsesource does not create anargparse.ArgumentParserfor you. This is to allow extra command line arguments to be added to anargparse.ArgumentParserthat are not config items. InsteadArgparseSource, which implements theargparsesource provides two methods to provide communication with theargparse.ArgumentParser:-
add_configs_to_argparse_parser(argparse_parser) Add arguments to an
argparse.ArgumentParserfor config items.
-
notify_parsed_args(argparse_namespace) Notify the
argparsesource of theargparse.Namespaceobject returned byargparse.ArgumentParser.parse_args().
If you don’t need to add command line arguments other than for config items, see
SimpleArgparseSourcewhich implements thesimple_argparsesource.The arguments of
ConfigParser.add_source()for theargparsesource are:source(required, positional):"argparse"priority(optional, keyword): The priority for the source. The default priority for anargparsesource is20.
Note that:
- The name of the command line argument for a config item is the config
item’s name with underscores (
_) converted to hyphens (-) and prefixed with--.
-
simple_argparse¶
-
class
multiconfparse.SimpleArgparseSource(config_specs, argument_parser_class=<class 'argparse.ArgumentParser'>, priority=20, **kwargs) Obtains config values from the command line.
The
simple_argparsesource is simpler to use than theargparsesource but it doesn’t allow adding arguments that are not config items.Do not create objects of this class directly - create them via
ConfigParser.add_source()instead. For example:parser = multiconfparse.ConfigParser() parser.add_config("config_item1") parser.add_config("config_item2", nargs=2, type=int) parser.add_config("config_item3", action="store_true") parser.add_source("simple_argparse") config_parser.parse_config() # If the command line looks something like: # PROG_NAME --config-item1 v1 --config-item2 1 2 --config-item-3 # The result would be: # multiconfparse.Namespace { # "config_item1": "v1", # "config_item2": [1, 2], # "config_item3": True, # }
The arguments of
ConfigParser.add_source()for thesimple_argparsesource are:source(required, positional):"simple_argparse"argument_parser_class(optional, keyword): a class derived fromargparse.ArgumentParserto use instead ofArgumentParseritself. This can be useful if you want to overrideargparse.ArgumentParser.exit()orargparse.ArgumentParser.error().priority(optional, keyword): The priority for the source. The default priority for asimple_argparsesource is20.- Extra keyword arguments to pass to
argparse.ArgumentParser. E.g.prog,allow_help. Don’t use theargument_defaultoption though - thesimple_argparsesources sets this internally. See theconfig_defaultoption forConfigParserinstead.
Note that:
- The name of the command line argument for a config item is the config
item’s name with underscores (
_) converted to hyphens (-) and prefixed with--.
environment¶
-
class
multiconfparse.EnvironmentSource(config_specs, none_values=None, priority=10, env_var_prefix='') Obtains config values from the environment.
Do not create
EnvironmentSourceobjects directly, add them to aConfigParserobject usingConfigParser.add_source(). For example:# For demonstration purposes, set some config values in environment # variables os.environ["MY_APP_CONFIG_ITEM1"] = "v1" os.environ["MY_APP_CONFIG_ITEM2"] = "1 2" os.environ["MY_APP_CONFIG_ITEM3"] = "" parser = multiconfparse.ConfigParser() parser.add_config("config_item1") parser.add_config("config_item2", nargs=2, type=int) parser.add_config("config_item3", action="store_true") parser.add_source("environment", env_var_prefix="MY_APP_") parser.parse_config() # -> multiconfparse.Namespace { # "config_item1": "v1", # "config_item2": [1, 2], # "config_item3": True, # }
The arguments of
ConfigParser.add_source()for theenvironmentsource are:source(required, positional):"environment"none_values(optional, keyword): a list of values that, when seen in environment variables, should be treated as if they were not present (i.e. values for config items withnargs == 0ornargs == "?"(where theconstvalue should be used rather than the value from the dict).The default
none_valuesis[""]. using a different value fornone_valuesis useful you want the empty string to be treated as a valid config value.priority(optional, keyword): The priority for the source. The default priority for anenvironmentsource is10.env_var_prefix(optional, keyword): a string prefixed to the environment variable names that the source will look for. The default value is"".
Note that:
- The name of the environment variable for a config item is the config
item’s name, converted to upper case, then prefixed with
env_var_prefix. - Values in environment variables for config items with
nargs == 0ornargs == "?"(where theconstvalue should be used rather than the value from the environment variable) should be values from thenone_valueslist described above. - Values in environment variables for config items with
nargs >= 2,nargs == "+"ornargs == "*"are split into arguments byshlex.split()(i.e. like arguments given on a command line via a shell). See theshlexdocumentation for full details.
json¶
-
class
multiconfparse.JsonSource(config_specs, path=None, fileobj=None, none_values=None, json_none_values=None, priority=0) Obtains config values from a JSON file.
Do not create objects of this class directly - create them via
ConfigParser.add_source(). For example:parser = multiconfparse.ConfigParser() parser.add_config("config_item1") parser.add_config("config_item2", nargs=2, type=int) parser.add_config("config_item3", action="store_true") fileobj = io.StringIO(''' { "config_item1": "v1", "config_item2": [1, 2], "config_item3": null } ''') parser.add_source("json", fileobj=fileobj) config_parser.parse_config() # -> multiconfparse.Namespace { # "config_item1": "v1", # "config_item2": [1, 2], # "config_item3": True, # }
The arguments of
ConfigParser.add_source()forjsonsources are:source(required, positional):"json".priority(optional, keyword): The priority for the source. The default priority for ajsonsource is0.path(optional, keyword): path to the JSON file to parse. Exactly one of thepathandfileobjoptions must be given.fileobj(optional keyword): a file object representing a stream of JSON data. Exactly one of thepathandfileobjoptions must be given.none_values(optional, keyword): a list of python values that, when seen as config item values after JSON decoding, should be treated as if they were not present (i.e. values for config items withnargs == 0ornargs == "?"(where theconstvalue should be used rather than the value from the dict). The defaultnone_valuesis[].json_none_values(optional, keyword): a list of JSON values (as strings) that are decoded into Python values and added tonone_values. The defaultjson_none_valuesis["null"].
Notes:
The data in the JSON file should be a JSON object. Each config item value should be assigned to a field of the object that has the same name as the config item.
Fields in the JSON object for config items with
nargs == 0ornargs == "?"(where theconstvalue should be used rather than the value from the dict) should either have values from thejson_none_valueslist or should decode to values in thenone_valueslist.Fields in the JSON object for config items with
nargs >= 2,nargs == "+"ornargs == "*"should be JSON arrays with an element for each argument of the config item.In the special case where
nargs == "+"ornargs == "*"and there is a single argument for the config item, the value may be given without the enclosing JSON array, unless the argument is itself an array.
dict¶
-
class
multiconfparse.DictSource(config_specs, values_dict, none_values=None, priority=0) Obtains config values from a Python
dictobject.Do not create
DictSourceobjects directly, add them to aConfigParserobject usingConfigParser.add_source(). For example:parser = multiconfparse.ConfigParser() parser.add_config("config_item1") parser.add_config("config_item2", nargs=2, type=int) parser.add_config("config_item3", action="store_true") values_dict = { "config_item1": "v1", "config_item2": [1, 2], "config_item3": None, } parser.add_source("dict", values_dict) parser.parse_config() # -> multiconfparse.Namespace { # "config_item1": "v1", # "config_item2": [1, 2], # "config_item3": True, # }
The arguments of
ConfigParser.add_source()for thedictsource are:source(required, positional):"dict".values_dict(required, positional): thedictcontaining the config values.Note that:
Values in
values_dictfor config items withnargs == 0ornargs == "?"(where theconstvalue should be used rather than the value from the dict) should be values from thenone_valueslist described below.Values in
values_dictfor config items withnargs >= 2,nargs == "+"ornargs == "*"should belistobjects with an element for each argument of the config item.In the special case where
nargs == "+"ornargs == "*"and there is a single argument for the config item, the value may be given without the enclosinglist, unless the argument is itself alist.
none_values(optional, keyword): a list of values that, when seen invalues_dict, should be treated as if they were not present (i.e. values for config items withnargs == 0ornargs == "?"(where theconstvalue should be used rather than the value from the dict).The default
none_valuesis[None, multiconfparse.MENTIONED_WITHOUT_VALUE]. usingnone_values=[multiconfparse.MENTIONED_WITHOUT_VALUE]is useful if you wantNoneto be treated as a valid config value.priority(optional, keyword): The priority for the source. The default priority for adictsource is0.
Creating your own source classes¶
To create your own source class, create a subclass of Source:
-
class
multiconfparse.Source(priority=0) Abstract base for classes that parse config sources.
All config source classes should inherit from
Source, have anameclass attribute containing the name of the source, and provide an implementation for theparse_config()method.-
parse_config() Read the values of config items for this source.
This is an abstract method that subclasses must implement to return a
Namespaceobject where:The returned
Namespacehas an attribute for each config item found. The name of the attribute for a config item must be the config item’snameas specified by thenameattribute of itsAction.The value for each attribute is a list, where each element of the list is a value given for the config item in the source. The elements should be ordered so that values appearing earlier in the source are earlier in the list. In the common case where only a single value for the config item is given in the source, the attribute’s value should be a list with a single element.
For example, if
config_item1is mentioned in the source once with value"v1"andconfig_item2is mentioned in the source twice with values"v2"and then"v3", the returnedNamespaceobject would have an attributeconfig_item1with value["v1"]and an attributeconfig_item2with value["v2", "v3"].If a config item with
nargs == 0ornargs == "?"is mentioned in the source without a value (or possibly with a source-specific value that meansNone/nullfor sources where a value must always be given for a config item), the value for that mention of the config item should be given in the list of values asMENTIONED_WITHOUT_VALUE.If a config item with
nargs == None,nargs == 1ornargs == "?"is mentioned in the source with a value, the value for that mention of the config item should be given in the list of values as the value itself.If a config item with
nargs >= 2,nargs == "*"ornargs == "+"is mentioned in the source, the value for that mention of the config item should be given in the list of values as a list of the values/arguments given in that mention.For example, if a config item
config_item1withnargs == 2appears in the source first with values/arguments of"v1a"and"v1b"and then again with values/arguments of"v2a"and"v2b", theconfig_item1attribute in theNamespaceshould have a value of[["v1a", "v1b"], ["v2a", "v2b"]].None of the values returned should yet have been coerced into the types specified by the user in
ConfigParser.add_config().
-