Keep secrets out of env variables in production by using env files. Merge env files into configuration dynamically. Keep env file and env variable handling out of the application by making application dependent only on the configuration file. Prefer deserilization from yaml over configuration of partially initialized objects.
An argument parser that accepts:
- A required yaml file for configuration/deserialization.
- An optional env file for secrets.
Features:
- MIT license
- Interpolate environment variables directly into yaml configuration.
- Optional replacement of environment variables with an environment variable file.
- Use C Yaml safe load/dump or yaml safe load/dump.
- Pass in env to parser with os.environ as a default.
- Pass in argv to parser with sys.argv[1:] as a default.
- Yaml type registration functions.
Relative configargparse, python-dotenv, envyaml, and yamlenv:
- Dependency injection through depth-first deserialization of yaml is better than two-pass, breadth-first initialization followed by a configuration.
- Contract for env variables is between configuration file and env xor the env file, the app no longer cares much about env or secrets as it uses the interpolated configuration file.
- No ${MY_VAR:my-default} --unexpected env var syntax for default values, an expensive pattern match, and allows typos of MY_VAR to pass silently--.
- No "N/A" or null default when environment variable does not exist --allows configuration errors to pass silently to become runtime errors--.
- Env file is optional, but when provided it does not merge with existing environment variables --better tracability in production deployment--.
- Yaml type registration retains the registered yaml tag in a closure.
- Env yaml type registration retains the registered env variable set in a closure.
pip install "."
Setup virtual environment:
python3.10 -m venv .venv
Or setup homebrew environment:
brew install [email protected]
python3.12 -m venv .venv
Once virtual environment is setup:
. .venv/bin/activate
pip install -U pip setuptools wheel
pip install -e ".[dev]"
pre-commit install
Session:
. .venv/bin/activate
...
pytest
...
pre-coommit run --all-files
...
git commit -m 'Message'
...
deactivate
docker compose up test
docker compose up pre-commit
docker compose up build-wheel && docker compose up install-wheel
...
docker compose down