Skip to main content

Confucius

A simpler, clearer approach to configuration.

Quick Start

from confucius import BaseConfig

class Config(BaseConfig)
    HOST = '127.0.0.1'
    PORT : int = 8000

    DEBUG : bool = False
from myapp import Server
from config import Config


server = Server(Config.HOST, Config.PORT)
$ python app.py
- Starting server: 127.0.0.1:8000

$ PORT=80 python app.py
- Starting server: 127.0.0.1:80

$ DEBUG=y python app.py
- Starting debug server: 127.0.0.1:80

Types

Any ANGRY_SNAKE_CASE attributes of a BaseConfig sub-class will be intercepted by the meta-class, and checked for in the environment using os.getenv.

Their type will be determined by their annotation in the class, or fall back to str.

Methods will automatically behave like a property, with access to self.

Handling of type casting can be overridden [as it is for bool] by adding it to the __types__ dict:

class Config(BaseConfig):
    __types__ = {
        json: lambda v: json.loads(v) if isinstance(v, str) else v,
    }

    LOGGING : json = {'version': 1 ...}

All types defined on parent Config classes will be merged with this dict.

Inheritance

Classes, as usual, inherit from their parents. If the type of an attribute is changed, it will raise an AssertionError.

Methods

Method in all-caps will be invoked, and can access self as usual:

class Config(BaseConfig):
   DB_ENGINE = 'postgresql'
   DB_HOST = 'localhost'
   DB_PORT : int = 5432
   DB_USER = 'test_user'
   DB_PASS = 'secret'
   DB_NAME = 'test-db'

   def CONNECTION_STRING(self):
       return f'{self.DB_ENGINE}://{self.DB_USER}:{self.DB_PASS}@{self.DB_HOST}/{self.DB_NAME}'

Using in Django

In your settings.py, put your settings class (or classes), then use the following code to select one to use:

import os
MODE = os.getenv('DJANGO_MODE', 'Local')
globals().update(globals()[f'{ MODE.title() }Settings'].as_dict())

With Python 3.7

In Python 3.7, a new feature was added which allowed you to define __getattr__ for a module (See PEP 562 <https://www.python.org/dev/peps/pep-0562/>).

The BaseConfig metaclass provides a module_getattr_factory factory method to provide a __getattr__ that will look up the Config object.

from confucius import BaseConfig

class Config(BaseConfig):
    DB_HOST = 'localhost'
    DB_PORT = 5432

__getattr__ = Config.module_getattr_factory()

After importing this module, attempts to access attributes will resolve normally and, if they’re not found, call __getattr__, just like on an object.

Release files for confucius 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for confucius 1.0.3
File Size Uploaded
confucius-1.0.3.tar.gz 3.4 kB Details

Release files / confucius-1.0.3.tar.gz

Download URL confucius-1.0.3.tar.gz
Size 3.4 kB
Tags Source
SHA-256 checksum
How to use checksums
eb2f920513a2a1876b7140c6e0d675b28606c517b42687725dd54a39f331d7db
BLAKE2b-256 checksum
How to use checksums
1447aa206dfe70a7f7f6d962cd504e6b67046f37df0b2b636b0d756acb3e735e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2+

Release history Release notifications | RSS feed

This release

1.0.3 This release

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page