Skip to main content

Configuration with typed env vars

Project description

cabina

Codecov PyPI PyPI - Downloads Python Version

Installation

pip3 install cabina

Usage

import cabina
from cabina import computed, env


class Config(cabina.Config):
    class Main(cabina.Section):
        API_HOST: str = env.str("API_HOST", default="localhost")
        API_PORT: int = env.int("API_PORT", default=8080)

        @computed
        def API_URL(cls) -> str:
            return f"http://{cls.API_HOST}:{cls.API_PORT}"
assert Config.Main.API_URL == "http://localhost:8080"
assert Config["Main"]["API_URL"] == "http://localhost:8080"

Recipes

Root Section

export API_HOST=localhost;
export API_PORT=8080;
import cabina
from cabina import env


class Config(cabina.Config, cabina.Section):  # <- inherited from cabina.Section
    API_HOST = env.str("API_HOST")
    API_PORT = env.int("API_PORT")


assert Config.API_HOST == "localhost"
assert Config.API_PORT == 8080

Computed Values

export API_HOST=localhost;
export API_PORT=8080;
import cabina
from cabina import computed, env


class Config(cabina.Config, cabina.Section):
    API_HOST: str = env.str("API_HOST")
    API_PORT: int = env.int("API_PORT")

    @computed
    def API_URL(cls) -> str:
        return f"http://{cls.API_HOST}:{cls.API_PORT}"


assert Config.API_URL == "http://localhost:8080"

Default Values

export API_HOST=127.0.0.1;
import cabina
from cabina import env


class Config(cabina.Config, cabina.Section):
    API_HOST = env.str("API_HOST", default="localhost")  # <- default arg
    API_PORT = env.int("API_PORT", default=8080)


assert Config.API_HOST == "127.0.0.1"
assert Config.API_PORT == 8080

Raw Values

export DEBUG= yes;
#            ^ extra space
import cabina
from cabina import env


class Config(cabina.Config, cabina.Section):
    DEBUG_RAW = env.raw("DEBUG")  # <- alias to env("DEBUG")
    DEBUG_STR = env.str("DEBUG")


assert Config.DEBUG_RAW == ""  # True
assert Config.DEBUG_STR == "yes"  # Error

Custom Parsers

export HTTP_TIMEOUT=10s;
import cabina
from cabina import env
from pytimeparse import parse as parse_duration  # <- external package


class Config(cabina.Config, cabina.Section):
    HTTP_TIMEOUT: int = env("HTTP_TIMEOUT", parser=parse_duration)


assert Config.HTTP_TIMEOUT == 10

JSON Parser

export IMAGE_SETTINGS='{"AllowedContentTypes": ["image/png", "image/jpeg"]}';
import json

import cabina
from cabina import env


class Config(cabina.Config, cabina.Section):
    IMAGE_SETTINGS = env("IMAGE_SETTINGS", parser=json.loads)  # <- json.loads


assert Config.IMAGE_SETTINGS == {
    'AllowedContentTypes': ['image/png', 'image/jpeg']
}

Prefetch Env Vars

export DEBUG=yes;
export API_PORT=80a;  # <- extra "a"
import cabina
from cabina import env


class Config(cabina.Config, cabina.Section):
    DEBUG = env.bool("DEBUG")
    API_HOST = env.str("API_HOST")
    API_PORT = env.int("API_PORT")


Config.prefetch()  # <- prefetch method

# ConfigEnvError: Failed to prefetch:
# - Config.API_HOST: 'API_HOST' does not exist
# - Config.API_PORT: Failed to parse '80a' as int

Env Vars Prefix

export APP_HOST=localhost;
export APP_PORT=8080;
import cabina

env = cabina.Environment(prefix="APP_")


class Config(cabina.Config, cabina.Section):
    API_HOST = env.str("HOST")  # <- No "APP_" prefix
    API_PORT = env.int("PORT")


assert Config.API_HOST == "localhost"
assert Config.API_PORT == 8080

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

cabina-0.5.2.tar.gz (13.5 kB view details)

Uploaded Source

Built Distribution

cabina-0.5.2-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

File details

Details for the file cabina-0.5.2.tar.gz.

File metadata

  • Download URL: cabina-0.5.2.tar.gz
  • Upload date:
  • Size: 13.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for cabina-0.5.2.tar.gz
Algorithm Hash digest
SHA256 312acb709023be74b5ef42f06b4ef0b1ce48c21743a1ac5b5a4845b9eb76b6fb
MD5 b7d7637b6c3c7643a7024a0a459674a9
BLAKE2b-256 2585adb464edef04ac4ff77aa93e030c03164470bbfe25bec10e5bcbfa6352b6

See more details on using hashes here.

File details

Details for the file cabina-0.5.2-py3-none-any.whl.

File metadata

  • Download URL: cabina-0.5.2-py3-none-any.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for cabina-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8bb6836d2082768ba53c0b4cdbd397f3f9d3bb96716293beb0953e74168b30bb
MD5 012ed4a713fb0bb5e3fa71c361da6e30
BLAKE2b-256 756d18cb77c59973a868857c5dfaec5ea3f706d4e805cc5304fa34e6e67e1ca9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page