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 protection - passwords and API keys are only masked when using print_all()
  • 🎯 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

# Access sensitive data normally
api_key = config.ai_service.api_key  # Returns actual value
password = config.database.password   # Returns actual value

# Use print_all() to safely display configuration with masked sensitive data
print("Database Config:")
print(config.database.print_all(return_type='list'))
# Output: ['host: localhost', 'port: 5432', 'password: se****23', ...]

# Or get properties without masking (be careful!)
print(config.database.return_properties(return_type='list', mask_sensitive=False))

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

By default, sensitive data (passwords, API keys, etc.) is accessible normally. Use the print_all() method to safely display configuration with automatic masking.

Sensitive keywords detected:

  • password, pwd
  • api_token, token
  • secret, key
  • appkey
# Normal access returns actual values
password = config.database.password      # "secret123"
api_key = config.ai_service.api_key     # "sk-1234567890abcdef"

# Use print_all() for safe display
config.database.print_all()              # password shown as "se****23"
config.ai_service.print_all('dict')      # api_key shown as "sk-12**************ef"

# Manual control with return_properties
raw = config.database.return_properties(mask_sensitive=False)  # Actual values
masked = config.database.return_properties(mask_sensitive=True) # Masked values

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.2.2

  • Updated README documentation to clarify sensitive data handling
  • Added Chinese (Traditional) documentation (README.zh.md)

v0.2.1

  • Added print_all() method for safe display with automatic sensitive data masking
  • Fixed CI/CD issues for cross-platform compatibility
  • Improved code formatting with Black and isort

v0.1.0

  • Initial release
  • Basic INI to Python class generation
  • Type inference support
  • Hot reloading with watchdog
  • Sensitive data protection
  • 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.2.2.tar.gz (36.4 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.2.2-py3-none-any.whl (13.0 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ini2py-0.2.2.tar.gz
Algorithm Hash digest
SHA256 c85ac2d2a09d1808000e0e35c8d08578d8d5fd97baf4d7551d46fc340d0590a5
MD5 dc30a34f1d9ee4f7cd03505dee774cc0
BLAKE2b-256 8393ea275d021d0e377a24a7293fed52af40c9ed4d633a37cc737711830020b1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ini2py-0.2.2-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.12.0

File hashes

Hashes for ini2py-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f41c2cd1a23b0e97a32780b0b8db87087d704102a4433e419c516ed634fe31ee
MD5 10eea24479663ce387324f8c19c65431
BLAKE2b-256 3af3b7001df9e9cb46df2a7ac847f552d785c49df3523de682120d10f9a82c4f

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