Skip to main content

config-binder

downloads PyPI version License versions

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

Metadata

Release files for config-binder 0.4.1

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

Source distribution (sdist)

Source distribution for config-binder 0.4.1
File Size Uploaded Provenance
config_binder-0.4.1.tar.gz 5.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for config-binder 0.4.1
File Interpreter ABI Platform
config_binder-0.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 11.6 kB

Release files / config_binder-0.4.1.tar.gz

Download URL config_binder-0.4.1.tar.gz
Size 5.5 kB
Tags Source
SHA-256 checksum
How to use checksums
dde8c4fa46318b6ec0e0f8ebe4b16f0f59984a4ccd073a49e1f67868a3205914
BLAKE2b-256 checksum
How to use checksums
13985da2323dcf714d7958a4dabe8ce606c4dd17c05842479134566b19a98164
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.12.6 Linux/6.8.0-1014-azure

Release files / config_binder-0.4.1-py3-none-any.whl

Download URL config_binder-0.4.1-py3-none-any.whl
Size 6.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8631ada4fa993f2146745cd3f5f6323829b87148e6798211ecface53b3b06597
BLAKE2b-256 checksum
How to use checksums
62a1715512f23a5601b2c76517a631c265304dfad46b541982705dc8c5a426ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.12.6 Linux/6.8.0-1014-azure

Security for config-binder 0.4.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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