Skip to content

Easily configure Python apps via defaults, environment variables, YAML, and AWS SSM Param Store.

License

Notifications You must be signed in to change notification settings

emann/flex-config

Repository files navigation

Flex Config

codecov Code style: black Generic badge MIT license

Configure your applications as easily as possible.

Main Features

Load config from wherever

  • Comes with built in support for loading from dicts, environment variables, JSON/YAML/TOML files, and AWS SSM Parameter Store.
  • Super easy to set up a custom source and load from anywhere.

Type conversion, validation, and hints via Pydantic

# "ConfigSchema" is pydantic's BaseModel renamed and re-exported for easier use 
from flex_config import ConfigSchema, construct_config

class Config(ConfigSchema):
    a_string: str
    an_int: int

# Raises ValidationError
my_bad_config = construct_config(Config, {"a_string": ["not", "a", "string"], "an_int": "seven"})

my_good_config = construct_config(Config, {"a_string": "my_string", "an_int": "7"})
assert isinstance(my_good_config.an_int, int)

Dynamic loading of config values

from pathlib import Path
from typing import Dict, Any

# "ConfigSchema" is pydantic's BaseModel renamed and re-exported for easier use 
from flex_config import ConfigSchema, construct_config, AWSSource, YAMLSource, EnvSource, ConfigSource

class Config(ConfigSchema):
    env: str
    my_thing: str

def get_ssm_params(config_so_far: Dict[str, Any]) -> ConfigSource:
    # env is set to live or dev via environment variables in the deployment environment
    env = config_so_far.get("env")
    if env == "local":  # Not a live deployment, my_thing is in a local yaml file
        return {}
    return AWSSource(f"my_app/{config_so_far['env']}")


my_config = construct_config(Config, [EnvSource("MY_APP_"), YAMLSource(Path("my_file.yaml")), get_ssm_params])

Installation

Basic install: poetry install flex_config With all optional dependencies (support for AWS SSM, YAML, and TOML): poetry install flex_config -E all

For a full tutorial and API docs, check out the hosted documentation