Smart environment loader with robust casting/normalization. Layers: decouple → dotenv → os.environ.
Project description
castenv
castenv is a smart environment loader with robust casting/normalization, that uses python-decouple (if installed), python-dotenv with a Fallback to os.environ
current_version = "v0.0.1"
- python-decouple (if installed)
- python-dotenv (if installed; auto-discovers
.env,.env.local,.env.{env},.env.{env}.localacross cwd+parents) - Fallback to os.environ
No per-call config — just castenv.get_env("KEY"), like os.environ.get but smarter.
Quick start
Install
pip install castenv
# Optional extras:
pip install "castenv[dotenv]"
pip install "castenv[decouple]"
Example
import castenv as env
# Optional one-time setup (else: auto cwd+parents):
# env.configure(search_dirs=[BASE_DIR], env_name="prod")
DATABASE_URL = env.get_env("DATABASE_URL", None)
DEBUG = env.env_bool("DEBUG", False)
DEBUG2 = env.get_env("DEBUG2", True)
TIMEOUT_SECS = env.get_env("TIMEOUT", "1m30s") # -> seconds float (90.0)
TIMEOUT_HOURS = env.get_env("HOURS", "2d1h") # -> seconds float (176400.0)
CACHE_BYTES = env.get_env("CACHE", "256MB") # -> bytes int (256000000)
ALLOWED = env.get_env(
"ALLOWED_HOSTS",
"localhost,127.0.0.1",
normalize_kwargs={"parse_lists": True}
)
PORT = env.get_env("PORT", 8080) # -> 8080 (int)
OPTS = env.get_env("OPTS", {"x": 1}) # -> {"x": 1} (dict)
SCALE = env.get_env("SCALE", "50%", normalize_kwargs={"percent_mode": "fraction"})
TAX = env.get_env("PORT", 15.5) # -> 15.5 (float)
print("DATABASE_URL:", DATABASE_URL)
print("DEBUG (bool) [env_bool]:", DEBUG)
print("DEBUG2 (bool) [get_env]:", DEBUG2)
print("TIMEOUT (secs):", TIMEOUT_SECS)
print("TIMEOUT_HOURS (secs):", TIMEOUT_HOURS)
print("CACHE (bytes):", CACHE_BYTES)
print("ALLOWED_HOSTS (list):", ALLOWED)
print("PORT (int):", PORT)
print("OPTS (dict):", OPTS)
print("SCALE (float) [0-1]:", SCALE)
print("TAX (float):", TAX)
Normalization highlights
Nonevia missing/empty/null/none- Booleans (
true/false/on/off/yes/no/1/0) - Numbers (int/float/sci +
0x/0b/0o) - Durations (
1h30m,500ms) → seconds (float) - Sizes (
256MB,1GiB,512k) → bytes (int) - JSON (
{"a":1}/["x","y"]) - Lists (
a,b,c) with recursive normalization - Percentages (
50%) as string/number/fraction (configurable) - Env interpolation (
URL=${BASE:-http://localhost}/v1) ~expansion
Testing overrides
from pathlib import Path
import castenv as env
with env.using(search_dirs=[Path("tests/envs")], env_name="test"):
assert env.get_env("SOME_KEY") == "value"
Development
Virtual Environments
python -m venv venv
Mac/Linux
source venv/bin/activate
Windows
venv/scripts/activate
Install Requirements
pip install poetry
poetry install
Install Optional Requirements
poetry install --extras "decouple"
poetry install --extras "dotenv"
poetry install --extras "decouple dotenv"
Test
pytest
coverage run -m pytest
coverage report
coverage html
mypy --html-report mypy_report .
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --format=html --htmldir="flake8_report/basic" --exclude=venv
flake8 . --count --exit-zero --max-complexity=11 --max-line-length=127 --statistics --format=html --htmldir="flake8_report/complexity" --exclude=venv
BumpVer
With the CLI command bumpver, you can search for and update version strings in your project files. It has a flexible pattern syntax to support many version schemes (SemVer, CalVer or otherwise).
Run BumbVer with:
bumpver update --major --dry
bumpver update --major
bumpver update --minor --dry
bumpver update --minor
bumpver update --patch --dry
bumpver update --patch
Build
poetry build
Publish
poetry publish
License
Project details
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file castenv-0.0.1.tar.gz.
File metadata
- Download URL: castenv-0.0.1.tar.gz
- Upload date:
- Size: 14.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.12.2 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4b15f06820c71d91224e812de83b3435d9c750ea02f1316fe1bcf61e18a0acd
|
|
| MD5 |
7f47c6235bf23e52472e6b75bf209855
|
|
| BLAKE2b-256 |
e5f1591b5db97fd72d73f6206423c683a862d4ad0cb93994cb7e76fb583d3c06
|
File details
Details for the file castenv-0.0.1-py3-none-any.whl.
File metadata
- Download URL: castenv-0.0.1-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.12.2 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6623299fac661efded8c022e1a55febbd83b28694eed39bfc31d199ac77ad21
|
|
| MD5 |
4fbc86315841bcc73267a591209fa564
|
|
| BLAKE2b-256 |
a90d22d2df6e1643c389fa64c8bda236038050092dba8e11d775bdfb9db69c7c
|