Nested Models
Use nested Pydantic models for complex configurations.
Basic Nested Model
from pydantic import BaseModel
from utilityhub_config import load_settings
class DatabaseConfig(BaseModel):
host: str = "localhost"
port: int = 5432
name: str = "mydb"
class Config(BaseModel):
database: DatabaseConfig = DatabaseConfig()
debug: bool = False
settings, metadata = load_settings(Config)
print(settings.database.host)
print(metadata.get_source("database.host").source)
Config File
config.yaml:
database:
host: prod.example.com
port: 5432
name: production
debug: false
Environment Variables
export DATABASE__HOST=prod.example.com
export DATABASE__PORT=5432
export DATABASE__NAME=production
Note: Use double underscores (__) for nesting.
These values are tracked as nested metadata paths:
settings, metadata = load_settings(Config)
source = metadata.get_source("database.host")
if source:
print(source.source) # "env"
print(source.source_path) # "ENV:DATABASE__HOST"
With Prefix
settings, _ = load_settings(Config, env_prefix="MYAPP")
export MYAPP_DATABASE__HOST=prod.example.com
Runtime Overrides for Nested Fields
settings, metadata = load_settings(
Config,
overrides={"database": {"host": "runtime.example.com"}},
)
print(settings.database.host) # runtime.example.com
source = metadata.get_source("database.host")
if source:
print(source.source) # overrides
print(source.source_path) # runtime