Sources¶
The built-in sources are:
argparse¶
-
class
multiconfparse.ArgparseSource(actions, 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(actions, 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(actions, none_values=None, priority=10, env_var_prefix='', env_var_force_upper=True) 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"".env_var_force_upper(optional, keyword): force the environment variable name to be in upper case. Default isTrue.
Note that:
- 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(actions, 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(actions, 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]. Using a differentnone_valuesis 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(actions, priority=0) Abstract base for classes that parse config sources.
All config source classes should:
Inherit from
Source.Have a
source_nameclass attribute containing the name of the source.Provide an implementation for the
parse_config()method.Have an
__init__()method that forwards itsactionsandpriorityarguments toSource.__init__().Source.__init__()will createactionsandpriorityattributes to make them available to subclass methods.actionsis adictwith config item names as the keys andActionobjects as the values. TheActionattributes that are most useful for source classes to use are:name: the name of the config item to which theActionapplies. The source class should use this to determine whichActionobject corresponds with each config item mention in the source. Thenameatribute of anActionhas the same value as the key in theactionsdict.nargs: this specifies the number of arguments/values that a config item should have when mentioned in the source.
-
parse_config() Read the values of config items for this source.
This is an abstract method that subclasses must implement to return a
listcontaining aConfigMentionelement for each config item mentioned in the source, in the order in which they appear (unless order makes no sense for the source).The implementation of this method will need to make use of the
actionsandpriorityattributes created by theActionbase class.-
class
ConfigMention(action, args, priority) A
ConfigMentionobject represents a single mention of a config item in a source.The arguments are:
-
class