Skip to content

Configuration from Environment embedded in Yaml

License

Notifications You must be signed in to change notification settings

pennsignals/cfgenvy

Repository files navigation

Overview

Code style: black

Release

Test

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.

Install

pip install "."

Develop, Lint & Test

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, Lint & Test

docker compose up test
docker compose up pre-commit
docker compose up build-wheel && docker compose up install-wheel
...
docker compose down

About

Configuration from Environment embedded in Yaml

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages