Skip to main content

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:

Metadata

Release files for ini2py 0.3.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 ini2py 0.3.1
File Size Uploaded
ini2py-0.3.1.tar.gz 37.0 kB Details

Built distribution (wheel)

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

Total release size: 50.1 kB

Release files / ini2py-0.3.1.tar.gz

Download URL ini2py-0.3.1.tar.gz
Size 37.0 kB
Tags Source
SHA-256 checksum
How to use checksums
b15907d0424d5a0fd02a6b9b45f2bcb20d8405f10c197232da97bb72afd3d6f9
BLAKE2b-256 checksum
How to use checksums
14001897ae00881f1843f5b9b93c540cd733d01192f94e5d37575ba528a67baf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.19

Release files / ini2py-0.3.1-py3-none-any.whl

Download URL ini2py-0.3.1-py3-none-any.whl
Size 13.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7aa841c4d668fda54a1dd0ff6aee3f64188dfc07b6e176ba479f4ffdfc796330
BLAKE2b-256 checksum
How to use checksums
579fd79b476242417f1df4388c2b74e3507e0f537650687d19492e7746f4a288
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.19

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

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