Skip to main content

Like dataclasses but for config.

Project description

configclasses

PyPI codecov

Like dataclases but for config.

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

>>> import httpx
... from configclasses import configclass
>>> class UserAPIClient(httpx.AsyncClient):
...     def __init__(self, config: ClientConfig, *args, **kwargs):
...         self.config = config
...         super().__init__(*args, **kwargs)
... 
...     async def get_users(self, headers: Optional[Headers] = None) -> Dict[str, Any]:
...         response = await self.get(f"{self.path}/users", auth=headers)
...         response.raise_for_status()
...         return response.json()
...     
>>> @configclass
... class ClientConfig:
...     host: str
...     port: int
...
>>> config = ClientConfig.from_path(".env")
... async with UserAPIClient(config) as client:
...     users = await client.get_users(auth_headers)
...   

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

pip install 12factor-configclasses

Supported formats

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

Install all dependencies with:

pip install 12factor-configclasses[full]

Example

# .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)

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

12factor-configclasses-0.2.7.tar.gz (6.3 kB view hashes)

Uploaded Source

Built Distribution

12factor_configclasses-0.2.7-py3-none-any.whl (6.5 kB view hashes)

Uploaded Python 3

Supported by

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