Skip to main content

yaml2py

Python 3.8+ License: MIT PyPI version

A CLI tool to generate type-hinted Python config classes from YAML files with nested structure support, automatic file watching and hot reloading capabilities.

Features

  • 🔧 Auto-generate type-hinted Python classes from YAML configuration files
  • 🏗️ Nested structure support - handle complex YAML hierarchies with ease
  • 🔍 Intelligent type inference (int, float, boolean, string, list, dict)
  • 🔄 Hot reloading - automatically reload configuration when files change
  • 🛡️ Sensitive data masking - automatically hide passwords and API keys
  • 🎯 Smart path detection - automatically find config files in common locations
  • 💡 IDE-friendly - full autocomplete and type hints support
  • 🚀 Singleton pattern - ensure single configuration instance across your app

Installation

pip install yaml2py

Quick Start

1. Create a config.yaml file

system:
  mode: development
  debug: true
  port: 8080
  timeout: 30.5

database:
  host: localhost
  port: 5432
  name: myapp
  user: admin
  password: secret123
  options:
    pool_size: 10
    retry_attempts: 3

redis:
  host: 127.0.0.1
  port: 6379
  db: 0

features:
  - name: authentication
    enabled: true
    config:
      session_timeout: 3600
      max_attempts: 5
  - name: logging
    enabled: false
    config:
      level: info
      format: json

ai_service:
  api_key: sk-1234567890abcdef
  model: gpt-4
  endpoints:
    - path: /chat
      method: POST
      rate_limit: 100
    - path: /completions
      method: POST
      rate_limit: 50

2. Generate Python config classes

yaml2py --config config.yaml --output ./src/config

Or use it interactively (auto-detects config files):

yaml2py

3. Use in your code

from src.config.manager import ConfigManager

# Get singleton instance
config = ConfigManager()

# Access with full type hints and autocomplete
print(config.system.mode)            # 'development'
print(config.system.debug)           # True (as boolean)
print(config.database.port)          # 5432 (as int)
print(config.system.timeout)         # 30.5 (as float)

# Access nested structures
print(config.database.options.pool_size)      # 10
print(config.database.options.retry_attempts) # 3

# Access lists with type safety
for feature in config.features:
    print(f"{feature.name}: {feature.enabled}")
    if feature.enabled:
        print(f"  Timeout: {feature.config.session_timeout}")

# Direct access returns actual values
print(config.database.password)      # 'secret123'
print(config.ai_service.api_key)     # 'sk-1234567890abcdef'

# Use print_all() method to safely display config with masked sensitive data
config.database.print_all()
# Output:
# DatabaseSchema:
# ----------------------------------------
#   host: localhost
#   port: 5432
#   name: myapp
#   user: admin
#   password: se*****23  # Automatically masked!
# ----------------------------------------

# Hot reloading - config updates automatically
# Edit config.yaml and changes are reflected immediately!

Advanced Features

Nested Structure Support

yaml2py excels at handling complex nested structures:

app:
  name: MyApp
  services:
    cache:
      provider: redis
      settings:
        ttl: 3600
        max_entries: 1000
    queue:
      provider: rabbitmq
      settings:
        prefetch: 10
        durable: true

Access nested values with full type safety:

config.app.services.cache.settings.ttl  # Full IDE support!

List Handling

Automatically generates typed classes for lists of objects:

servers:
  - name: web-1
    host: 10.0.0.1
    port: 80
  - name: web-2
    host: 10.0.0.2
    port: 80
for server in config.servers:
    # server has full type hints
    print(f"{server.name}: {server.host}:{server.port}")

Hot Reloading

Configuration automatically reloads when files change:

# Start your app
config = ConfigManager()
print(config.system.debug)  # False

# Edit config.yaml and set debug: true
# No restart needed!
print(config.system.debug)  # True

Type Safety

All configurations are properly typed:

config.system.debug          # bool
config.database.port         # int
config.system.timeout        # float
config.database.name         # str
config.features              # List[FeatureSchema]
config.database.options      # OptionsSchema

CLI Options

yaml2py --help

Options:
  -c, --config PATH   Path to YAML configuration file
  -o, --output PATH   Output directory for generated files
  --help             Show this message and exit

Generated File Structure

output_dir/
├── __init__.py      # Package initialization
├── schema.py        # Configuration classes with type hints
└── manager.py       # Singleton manager with hot reload

Development

Running Tests

python -m pytest tests/

Code Quality

make lint    # Run linting
make format  # Format code
make test    # Run tests

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE file for details.

TODO

  • Support for custom type validators
  • YAML anchors and references
  • Environment variable interpolation
  • Multiple config file merging
  • Config inheritance

Metadata

Release files for yaml2py 0.2.0

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

Source distribution (sdist)

Source distribution for yaml2py 0.2.0
File Size Uploaded
yaml2py-0.2.0.tar.gz 33.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for yaml2py 0.2.0
File Interpreter ABI Platform
yaml2py-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 50.1 kB

Release files / yaml2py-0.2.0.tar.gz

Download URL yaml2py-0.2.0.tar.gz
Size 33.5 kB
Tags Source
SHA-256 checksum
How to use checksums
f1799f29b01fba4689c217c7ee7ce0cf6de8874ebc48ff5819ca9af1abc1fc04
BLAKE2b-256 checksum
How to use checksums
2dec6594fa1707c0e8db9d42f297f07e274e76c82bcad491e4190c3935292fd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.0

Release files / yaml2py-0.2.0-py3-none-any.whl

Download URL yaml2py-0.2.0-py3-none-any.whl
Size 16.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f8b2e6947cee4d97f79ec3fce97f3dd41cbc2205c9c87ae149b0070f88af9a0c
BLAKE2b-256 checksum
How to use checksums
9b2ffa2a3dc28ad38146a3af9a517350619d12d54eec612ba76272aacb3e0cf8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.0

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

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