confoid

Configuration Management for Python.


Keywords
configuration-management, python, yaml
License
MIT
Install
pip install confoid==0.2.0

Documentation

Confoid

Configuration Management for Python.

image image GitHub license

GitHub Actions (Python package)

Average time to resolve an issue Percentage of issues still open

Install

$ pip install confoid

Loading a single config file

import confoid

new_settings = confoid.Config("application.yml")

Loading multiple config file

Multiple files can be provided in order and will merge with the previous configuration.

import confoid

config_files = ["application.yml", "application.development.yml"]

new_settings = confoid.Config(
    config_files, 
    base_dir="config",
)

Autoload based on provided environment

import confoid

new_settings = confoid.Config("application.yml", current_env="development")
# this will load application.yml and application.{current_env}.yml

Reading the settings

settings.username == "admin"  # dot notation with multi nesting support
settings['password'] == "secret123"  # dict like access
settings.get("nonexisting", "default value")  # Default values just like a dict
settings.databases.name == "mydb"  # Nested key traversing

Config merging

application.yml

default:
  prefix:
    otp: "user-otp"
    auth: "auth-tokens"
  type: inmemory
  redis:
    url: 

application.development.yml

default:
  type: redis
  redis:
    url: redis://saviof.com
    encoding: "utf8"

Will resolve to the following final config

default:
  prefix:
    otp: "user-otp"
    auth: "auth-tokens"
  type: redis
  redis:
    url: redis://saviof.com
    encoding: "utf8"

Config environment vars

All fields can use environment variables with a fallback default value

password: ${TEST_SERVICE_DEFAULT_PASSWORD:test}

Validators can be added for pre checks on loaded config

from confoid import Validator

config_files = ["application.yml", "application.development.yml"]

new_settings = confoid.Config(
    config_files, 
    base_dir="config",
    validators=[
        Validator("default", "default.redis.password", must_exist=True)
        Validator("otp.length", gte=6, lte=20)
        Validator("default.type", values=["inmemory", "redis"])
    ]
)