Binding Python various formats configurations to classes with type validation, environment variables, and nested classes.
Project description
config-binder
Simple configuration parsing with recursive class binding, environment variables resolution and types safety.
Installation
pip install config-binder
Simple example
input.yaml
host: ${MYAPP_HOST:localhost}
port: 5432
username: admin
password: ${MYAPP_PASSWORD}
ENV exposure
export MYAPP_PASSWORD=123
With binding:
class MySettings:
host: str
port: int
username: str
password: str
source_urls: List[str]
config = ConfigBinder.load('input.yaml')
print(f"type: {type(config).__name__}, config: host:{config.host} port:{config.port} source_urls:{config.source_urls}")
# Output:
# type: MySettings, config: host:localhost port:5432 source_urls:['some-url.com', 'another-url.com']
Without binding
in this case data will be returned in dict with just all the environment variables resolved
config = ConfigBinder.load('input.yaml')
print(f"type: {type(config).__name__}, config: {config}")
# Output:
# type: dict, config: {'host': 'localhost', 'port': 5432, 'username': 'admin', 'password': '123', 'source_urls': ['some-url.com', 'another-url.com']}
More complex example
input.yaml
name: MyApplication
logging_level: INFO
redis_config:
host: ${MYAPP_REDIS_HOST:127.0.0.1}
post: ${MYAPP_REDIS_PORT:6379}
password: ${MYAPP_REDIS_PASS}
encryption_Key: ${MYAPP_REDIS_ENCRYPTION_KEY}
sources_configs:
orders:
url: some-url.com/orders
token: ${MYAPP_ORDERS_SOURCE_TOKEN}
retry_policy:
max_attempts: 5
backoff_seconds: 10
products:
url: another-url.com/products
token: ${MYAPP_ORDERS_products_TOKEN}
retry_policy:
max_attempts: 3
backoff_seconds: 5
ENV exposure
export MYAPP_REDIS_PASS=redis_pass
export MYAPP_REDIS_ENCRYPTION_KEY=very_strong_key
export MYAPP_ORDERS_SOURCE_TOKEN=orders_token
export MYAPP_ORDERS_PRODUCTS_TOKEN=products_token
Config classes definition
class RedisConfig:
host: str
port: int
password: str
encryption_key: str
class RetryPolicy:
max_attempts: int
backoff_seconds: int
class SourceConfig:
url: str
token: str
retry_policy: RetryPolicy
class AppConfig:
name: str
logging_level: Literal['DEBUG', 'INFO', 'ERROR']
redis_config: RedisConfig
sources_configs: Dict[str, SourceConfig]
Binding from file
config = ConfigBinder.load('input.yaml', AppConfig)
Binding from str
variable
input_yaml is variable with the same yaml specified above
config = ConfigBinder.read(ConfigType.yaml, input_yaml, AppConfig)
Results
input yaml is now bound to AppConfig class with env variables resolution and types validation
print(config.name)
print(config.logging_level)
print(f"type: {type(config.redis_config).__name__}, config: {str(vars(config.redis_config))}")
print(f"type: {type(config.sources_configs['orders']).__name__}, config: {str(vars(config.sources_configs['orders']))}")
print(f"type: {type(config.sources_configs['products']).__name__}, config: {str(vars(config.sources_configs['products']))}")
# Output:
# MyApplication
# INFO
# type: RedisConfig, config: {'host': '127.0.0.1', 'port': 6379, 'password': 'redis_pass', 'encryption_key': 'None'}
# type: SourceConfig, config: {'url': 'some-url.com/orders', 'token': 'orders_token', 'retry_policy': <__main__.RetryPolicy object at 0x7f268fe2fe00>}
# type: SourceConfig, config: {'url': 'another-url.com/products', 'token': 'products_token', 'retry_policy': <__main__.RetryPolicy object at 0x7f268fe2fe30>}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
config_binder-0.1.2.tar.gz
(5.2 kB
view details)
Built Distribution
File details
Details for the file config_binder-0.1.2.tar.gz
.
File metadata
- Download URL: config_binder-0.1.2.tar.gz
- Upload date:
- Size: 5.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.9.12-200.fc40.x86_64
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 62495578c9de8f3e1bdee092145c8ede8ba92b7545993a9397158d664ed1cec6 |
|
MD5 | 68c0a8d49db48672ed478c98a7f8fd07 |
|
BLAKE2b-256 | ec837aedc97377c473463e5cdce1edc31dd798c320af1f126eda595021bfa358 |
File details
Details for the file config_binder-0.1.2-py3-none-any.whl
.
File metadata
- Download URL: config_binder-0.1.2-py3-none-any.whl
- Upload date:
- Size: 5.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.9.12-200.fc40.x86_64
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0068f732749e9ee7f8e8b4d2566a79c260962f75002bd3b793943d3f63956199 |
|
MD5 | 5db5714e0b6a3cd9e4c1b1fcb942f87c |
|
BLAKE2b-256 | c5c310721c8acf5f95eda6e02895642087e5cc4c4de597eddb0cf28c221f590a |