Skip to main content

A CLI tool to generate type-hinted Python config classes from .ini files.

Project description

ini2py

Python 3.8+ License: MIT PyPI version

A CLI tool to generate type-hinted Python config classes from .ini files with automatic file watching and hot reloading capabilities.

Features

  • 🔧 Auto-generate type-hinted Python classes from INI configuration files
  • 🔍 Intelligent type inference (int, float, boolean, string)
  • 🔄 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 ini2py

Quick Start

1. Create a config.ini file

[system]
mode = development
debug = true
port = 8080
timeout = 30.5

[database]
host = localhost
port = 5432
name = myapp
user = admin
password = secret123

[redis]
host = 127.0.0.1
port = 6379
db = 0

[ai_service]
api_key = sk-1234567890abcdef
model = gpt-4
temperature = 0.7

2. Generate Python config classes

Run the CLI tool in your project directory:

ini2py

The tool will:

  • Auto-detect your config.ini file
  • Suggest an appropriate output directory
  • Generate type-hinted Python classes

Example output:

Path to your config.ini file [./config/config.ini]: 
Path to the output directory for generated files [./src/config]: 
Reading configuration from: ./config/config.ini
Generating schema.py...
Successfully generated ./src/config/schema.py
Generating manager.py...
Successfully generated ./src/config/manager.py

Configuration generation complete!

3. Use in your Python code

from src.config.manager import ConfigManager

# Initialize configuration manager (singleton pattern)
config = ConfigManager()

# Access configuration with full type hints and autocomplete
mode = config.system.mode          # str
debug = config.system.debug        # bool
port = config.system.port          # int
timeout = config.system.timeout    # float

# Sensitive data is automatically masked when printed
api_key = config.ai_service.api_key
print(f"API Key: {api_key}")  # Output: API Key: sk-12**************ef

# Get all properties for debugging
print("Database Config:")
print(config.database.return_properties(return_type='list'))

Advanced Usage

Manual Path Specification

# Specify custom paths
ini2py --config /path/to/config.ini --output /path/to/output/

Hot Reloading

The generated config manager automatically watches for file changes:

import time
from src.config.manager import ConfigManager

config = ConfigManager()

# The config will automatically reload when config.ini is modified
while True:
    print(f"Current port: {config.system.port}")
    time.sleep(2)

Sensitive Data Handling

Sensitive values are automatically detected and masked based on keywords:

  • password, pwd
  • api_token, token
  • secret, key
  • appkey
# These will be masked in output
config.database.password     # "se****23"
config.ai_service.api_key   # "sk-12**************ef"

# Get unmasked values for actual use
raw_config = config.database.return_properties(mask_sensitive=False)

Configuration File Discovery

ini2py automatically searches for configuration files in these locations:

  1. ./config.ini
  2. ./config/config.ini
  3. ./conf/config.ini
  4. ../config.ini (up to 5 levels up)

Generated File Structure

src/config/
├── schema.py    # Type-hinted schema classes
└── manager.py   # Configuration manager with hot reloading

Generated Schema Classes

Each INI section becomes a typed schema class:

class SystemSchema(ConfigSchema):
    """[system]"""
    
    @property
    def mode(self) -> str:
        return self._config_section.get('mode')
    
    @property
    def debug(self) -> bool:
        return self._config_section.getboolean('debug')
    
    @property
    def port(self) -> int:
        return self._config_section.getint('port')

CLI Options

ini2py --help

Options:

  • --config, -c: Path to input config.ini file
  • --output, -o: Directory for generated files
  • --help: Show help message

Requirements

  • Python 3.8+
  • click >= 8.0
  • watchdog >= 2.1.6

Development

Setup Development Environment

git clone https://github.com/joneshong/ini2py.git
cd ini2py
pip install -e .

Running Tests

python -m pytest tests/

Project Structure

ini2py/
├── ini2py/
│   ├── __init__.py
│   ├── cli.py           # Main CLI logic
│   └── templates/       # Code generation templates
│       ├── schema.py.tpl
│       └── manager.py.tpl
├── tests/
├── examples/
├── README.md
└── pyproject.toml

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Changelog

v0.1.0

  • Initial release
  • Basic INI to Python class generation
  • Type inference support
  • Hot reloading with watchdog
  • Sensitive data masking
  • Smart path detection

Author

JonesHong - GitHub

Support

If you encounter any issues or have questions:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ini2py-0.3.1.tar.gz (37.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ini2py-0.3.1-py3-none-any.whl (13.0 kB view details)

Uploaded Python 3

File details

Details for the file ini2py-0.3.1.tar.gz.

File metadata

  • Download URL: ini2py-0.3.1.tar.gz
  • Upload date:
  • Size: 37.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.19

File hashes

Hashes for ini2py-0.3.1.tar.gz
Algorithm Hash digest
SHA256 b15907d0424d5a0fd02a6b9b45f2bcb20d8405f10c197232da97bb72afd3d6f9
MD5 1f61f138dcbd26609c33ef655c796a60
BLAKE2b-256 14001897ae00881f1843f5b9b93c540cd733d01192f94e5d37575ba528a67baf

See more details on using hashes here.

File details

Details for the file ini2py-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: ini2py-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 13.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.19

File hashes

Hashes for ini2py-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7aa841c4d668fda54a1dd0ff6aee3f64188dfc07b6e176ba479f4ffdfc796330
MD5 5cfb5063c88e16cbb42e112abba31e19
BLAKE2b-256 579fd79b476242417f1df4388c2b74e3507e0f537650687d19492e7746f4a288

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page