Skip to main content

envwrap

CI coveralls codecov codacy

releases pypi/envwrap conda-forge::envwrap

Override parameter defaults via environment variables & config files.

import envwrap

@envwrap.envwrap("name", "app")
def func(a=1):
    ...

Lookup precedence

In descending order:

  • call (func(a=3))
  • environment (NAME_APP_FUNC_A=2, NAME_FUNC_A=2, NAME_APP_A=2, NAME_A=2)
    • UPPER_CASE env vars -> lower_case param names
    • other cases aren't supported because Windows ignores case
  • config file:
    • ./{name}.{toml,yaml,yml,json,ini,cfg}::{app.func.a,func.a,app.a,a}
    • platformdirs.{user,site}_config_path(name, False)/
      • {app}.{toml,yaml,yml,json,ini,cfg}::{func.a,a}
      • {name}.{toml,yaml,yml,json,ini,cfg}::{app.func.a,func.a,app.a,a}
    • ./pyproject.toml::tool.name.{app.func.a,func.a,app.a,a}
  • signature (def foo(a=1))

Typecasting precedence

In descending order:

  • if envwrap.envwrap(convert_config=False): unconverted config file value,
  • if convert_config=False: unconverted config file value
  • signature value's typehint
  • signature default value's type
  • envwrap.envwrap(types={'param_name': type})
  • unconverted
type accepted string values
bool true, yes, on, 1, y, t / false, no, off, 0, n, f, `` (empty)
None none, null, `` (empty)

[!TIP] Containers (list, dict, ...) aren't parsed to avoid mangling strings; use e.g. types={'param_name': ast.literal_eval} instead.

Installation

Any one of:

  • pip install envwrap
  • conda install -c conda-forge envwrap
  • pip install "git+https://github.com/tqdm/envwrap@main"

[!TIP] Note that tqdm ships with a basic tqdm.utils.envwrap, which falls back to the original env-var-only (no config file support) implementation if import envwrap fails.

Advanced Usage

CLI integration

"""CLI example program using envwrap for configuration management.

Usage:
  myapp.py [options] <arg1> [<arg2>]

Options:
  -h, --help    Show this help message and exit.
  -o=<value>, --option=<value>  An option [default: foo].

Arguments:
  <arg1>         An argument.
  <arg2>         An integer argument [default: 2:int].

Defaults above may be overridden by environment variables or config files:
- `MYAPP[_CLI]_*`
- `{.,~/.config/myapp,/etc/xdg/myapp}/myapp[/cli].{toml,yml,json,ini}::[cli.]*`
- `pyproject.toml::tool.myapp[.cli]*`
"""
import argopt, shtab, envwrap

ONLY_PASS_VALID = True # trim envwrap defaults based on parser's valid actions

if __name__ == "__main__":
    parser = argopt.argopt(__doc__)
    shtab.add_argument_to(parser)

    defaults = envwrap.get_defaults("myapp", "", "cli")
    if ONLY_PASS_VALID:
        valid = {i.dest for i in parser._actions}
        defaults = {k: defaults[k] for k in defaults.keys() & valid}

    parser.set_defaults(**defaults)
    args = parser.parse_args()
    print(args)

Live-reload

To force re-reading config files & environment variables without restarting the process:

envwrap.get_defaults.cache_clear()

Debugging

A CLI tool can print defaults. For example, with this config:

# config file: foo.toml
[test]
a = 1337
b = 2
python -m envwrap --help
FOO_A=42 python -m envwrap foo test

will print:

>>> @envwrap.envwrap('foo', '')
>>> def test(...):
...    ...
will use defaults:
{'a': '42', 'b': 2, ...}

contributors

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

envwrap-1.1.0.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

envwrap-1.1.0-py3-none-any.whl (7.9 kB view details)

Uploaded Python 3

File details

Details for the file envwrap-1.1.0.tar.gz.

File metadata

  • Download URL: envwrap-1.1.0.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for envwrap-1.1.0.tar.gz
Algorithm Hash digest
SHA256 2d5be51ce9a4c84e46f67077cc36aa57a80474a438c78ddf8f9932e2aa282b76
MD5 8b272a5457c94b8c0df26f8d75184171
BLAKE2b-256 11958050ba81c9f936cc53c5437de48424be785325cfca0a3fd02cc9aee814cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for envwrap-1.1.0.tar.gz:

Publisher: test.yml on tqdm/envwrap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file envwrap-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: envwrap-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 7.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for envwrap-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fea55aa52bbc24dd420f5d921e7ee10f8356bda0ce691be24b02a32d7bd9db68
MD5 ab964a835719e0c817dbbb5b02860005
BLAKE2b-256 5805b3359c8a0cfacb004c70d0d0ae21868dd8c736c59ba01f51637c966e770a

See more details on using hashes here.

Provenance

The following attestation bundles were made for envwrap-1.1.0-py3-none-any.whl:

Publisher: test.yml on tqdm/envwrap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 files

1.0.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page