Skip to main content
Join the official 2019 Python Developers SurveyStart the survey!

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

Files for 12factor-configclasses, version 0.2.4
Filename, size File type Python version Upload date Hashes
Filename, size 12factor_configclasses-0.2.4-py3-none-any.whl (6.2 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size 12factor-configclasses-0.2.4.tar.gz (6.2 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page