Merge your config files and set parameters from the command line in a simple way.
Project description
CLI Config
Lightweight library to merge your configs (optionally nested) and set parameters from command line.
Documentation :memo: here
Installation
In a new virtual environment, install the package with:
pip install cliconfig
Quick start
First create a default config that can be split in multiple files that will be merged
(from left to right in make_config
function):
# default1.yaml
param1: 1
param2: 0
letters:
letter1: a
letter2: b
# default2.yaml
param1: 1
param2: 2 # will override param2 from default1.yaml
letters.letter3: c # add a new parameter
Now you can set up your program to use the config:
# main.py
from cliconfig import make_config, show_config
config = make_config('default1.yaml', 'default2.yaml')
show_config(config)
Then add one or multiple additional config files that will override the default values.
Be careful, the additional config files cannot bring new parameters by default.
If you want to add new parameters (not advised for retro-compatibility, readability
and security), you can add allow_new_keys=True
in make_config
function.
# exp1.yaml
letters:
letter3: C
# exp2.yaml
param1: -1
letters.letter1: A
Now you can launch the program with additional configurations and parameters.
The additional configurations are indicated with --config
(separate with comma,
without space) and the parameters with --<param_name>
. The default configuration
will be merged with the additional configurations (from left to right), then the
parameters will be set.
python main.py --config exp1.yaml,exp2.yaml --param2=-2 --letters.letter2='B'
Will show:
[CONFIG] Merge 2 default configs, 2 additional configs and 2 CLI parameter(s).
Config:
param1: -1
param2: -2
letters:
letter1: A
letter2: B
letter3: C
Note that the configurations are native python dicts.
Manipulate configs
To merge configs, you can use cliconfig.merge
function.
It supports unflatten (or nested) dicts like {'a': {'b': 1, 'c': 2}}
,
flatten dicts like {'a.b': 1, 'a.c': 2}
, and a mix of both. The dicts will be flatten
before merging. Sometimes you can have conflicts in flatten operation for instance with
{'a.b': 1, 'a': {'b': 2}}
that have two different values for a.b
. That's why you
can use a priority
parameter to choose which value to keep before merging.
You can also save, load and display configs with cliconfig.save_config
,
cliconfig.load_config
and cliconfig.show_config
functions.
How to contribute
For development, install the package dynamically and dev requirements with:
pip install -e .
pip install -r requirements-dev.txt
Everyone can contribute to CLI Config, and we value everyone’s contributions. Please see our contributing guidelines for more information 🤗
Todo
To do:
- add json and ini support
- avoid changing keys order in merge
License
Copyright (C) 2023 Valentin Goldité
This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This project is free to use for COMMERCIAL USE, MODIFICATION, DISTRIBUTION and PRIVATE USE as long as the original license is include as well as this copy right notice at the top of the modified files.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for cliconfig-0.1.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 181cc9c2715b956770a81e365e68af901d705719446b781a51e50825e2200b07 |
|
MD5 | 25deccd911ff9ca4460f22ad225bf5d3 |
|
BLAKE2b-256 | 59ede530642aa70efc77257f1462d00f09990639f13a1a3ece127f3d7f366f57 |