ini2py
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.inifile - 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,pwdapi_token,tokensecret,keyappkey
# 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:
./config.ini./config/config.ini./conf/config.ini../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
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - 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:
- Open an issue
- Check the examples directory
- Review the generated code documentation
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)
| File | Size | Uploaded | |
|---|---|---|---|
| ini2py-0.3.1.tar.gz | 37.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|