Catalog PyPI
Back to packageRELEASE DETAILS

2.0.1

PyPI

12factor-configclasses

Like dataclasses but for config.

Published18 Oct 2023
Direct dependencies3
Transitive dependenciesNot calculated

README

Version 2.0.1 documentation

configclasses

PyPI codecov Downloads Downloads

Like dataclasses but for config.

Specify your config with a class and load it with your env vars or env files.

# .env
HOST=0.0.0.0
PORT=8000
...
import httpx
from configclasses import configclass


@configclass
class ClientConfig:
    host: str
    port: int


class UserAPIClient(httpx.AsyncClient):
    def __init__(self, config: ClientConfig, *args, **kwargs):
        self.config = config
        ...
        

config = ClientConfig.from_path(".env")
async with UserAPIClient(config) as client:
    ...

Features

  • Fill your configclasses with existent env vars.
  • Define default values in case these variables have no value at all.
  • Load your config files in env vars following 12factor apps recommendations.
  • Support for .env, yaml, toml, ini and json.
  • Convert your env vars with specified type in configclass: int, float, str or bool.
  • Use nested configclasses to more complex configurations.
  • Specify a prefix with @configclass(prefix="<PREFIX>") to append this prefix to your configclass' attribute names.
  • Config groups (TODO): https://cli.dev/docs/tutorial/config_groups/

Requirements

Python 3.8+

Installation

Depending on your chosen config file format you can install:

  • .env -> pip install 12factor-configclasses[dotenv]
  • .yaml -> pip install 12factor-configclasses[yaml]
  • .toml -> pip install 12factor-configclasses[toml]
  • .ini -> pip install 12factor-configclasses
  • .json -> pip install 12factor-configclasses

Or install all supported formats with:

pip install 12factor-configclasses[full]

Usage

There are three ways to use it.

Loading an .env file:

# .env
HOST=0.0.0.0
PORT=8000
DB_URL=sqlite://:memory:
GENERATE_SCHEMAS=True
DEBUG=True
HTTPS_ONLY=False
GZIP=True
SENTRY=False
#config.py
from configclasses import configclass


@configclass
class DB:
    user: str
    password: str
    url: str


@configclass
class AppConfig:
    host: str
    port: int
    db: DB
    generate_schemas: bool
    debug: bool
    https_only: bool
    gzip: bool
    sentry: bool
# app.py
from api.config import AppConfig

app_config = AppConfig.from_path(".env")
app = Starlette(debug=app_config.debug)

if app_config.https_only:
    app.add_middleware(
        HTTPSRedirectMiddleware)
if app_config.gzip:
    app.add_middleware(GZipMiddleware)
if app_config.sentry:
    app.add_middleware(SentryAsgiMiddleware)

...

register_tortoise(
    app,
    db_url=app_config.db.url,
    modules={"models": ["api.models"]},
    generate_schemas=app_config.generate_schemas,
)

if __name__ == "__main__":
    uvicorn.run(app, host=app_config.host, port=app_config.port)

Loading predefined environmental variables:

The same than before, but instead of:

app_config = AppConfig.from_path(".env")

You will do:

app_config = AppConfig.from_environ()

Loading a file from a string:

test_env = """HOST=0.0.0.0
PORT=8000
DB_URL=sqlite://:memory:
GENERATE_SCHEMAS=True
DEBUG=True
HTTPS_ONLY=False
GZIP=True
SENTRY=False"""
app_config = AppConfig.from_string(test_env, ".env")

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 3

Native requirements
3 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
tomlkit
Environment
{
  "extras": "toml",
  "marker": "extra == \"toml\" or extra == \"full\"",
  "requires_python": ">=3.9,<4.0",
  "evaluation": "NOT_EVALUATED"
}
tomlkit[toml] (>=0.12,<0.13) ; extra == "toml" or extra == "full"runtime
python-dotenv
Environment
{
  "extras": "dotenv",
  "marker": "extra == \"dotenv\" or extra == \"full\"",
  "requires_python": ">=3.9,<4.0",
  "evaluation": "NOT_EVALUATED"
}
python-dotenv[dotenv] (>=1.0,<2.0) ; extra == "dotenv" or extra == "full"runtime
pyyaml
Environment
{
  "extras": "yaml",
  "marker": "extra == \"yaml\" or extra == \"full\"",
  "requires_python": ">=3.9,<4.0",
  "evaluation": "NOT_EVALUATED"
}
pyyaml[yaml] (>=6,<7) ; extra == "yaml" or extra == "full"runtime

Distribution files

2 collected
12factor_configclasses-2.0.1-py3-none-any.whl

bdist_wheel · 7.44 KB · Python py3

Source file
12factor_configclasses-2.0.1.tar.gz

sdist · 6.29 KB · Python source

Source file

Repository

PENDING
kingoodie/configclasses

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 15:12 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:186d54ec0871e7de42e9516eef5e038fe9e6fcfad1b8b6a02ee14c8fedc8de7c

Other collected versions

View all collected versions →