TOML-Init
A lightweight Python library for auto-creating and validating TOML-based configuration files from one or more default templates.
For use where you use multiple relatively independent modules that need config values and you want a standardized way to handle, implement, and validate.
Defaults
| Variable | Value |
|---|---|
DEFAULT_CONFIG_FOLDER_PATH |
<Current Working Directory>/config |
DEFAULT_CONFIG_DEFAULT_FOLDER_PATH |
<Current Working Directory>/defaults |
DEFAULT_CONFIG_FILE |
"config.toml" |
Features
-
Automatic directory setup
- Ensures your primary
configs/directory and itsdefaults/subdirectory exist (creates them if missing).
- Ensures your primary
-
Defaults merging
- Scans all
*.tomlfiles underconfigs/defaults/. Each top-level TOML table is treated as a “block” of settings. - Merges multiple default files into a single master
config.toml, with conflict detection.
- Scans all
-
Schema-driven validation
-
Each setting may be declared in two ways:
- Simple:
KEY = <defaultValue> - Full:
KEY = { defaultValue = <...>, type = "<int|float|bool|str>", min = <...>, max = <...>, allowedValues = [...], validator = "<name>" }
- Simple:
-
Supports numeric range checks (
min/max), enumerations (allowedValues), and custom validation hooks.
-
-
Custom validators
- Implement by subclassing
Validatorand registering viaregister_validator("name", instance). - Allows arbitrary user‑defined checks (e.g. path existence, regex match).
- Implement by subclassing
-
Preserves user overrides
- If users manually edit
config.toml, extra keys remain intact. - Invalid values are reset to defaults with a logged warning.
- If users manually edit
-
CLI & programmatic API
- Installable console script:
toml-initfor quick command-line setup. ConfigManagerclass for embedding in Python code.
- Installable console script:
-
Dry‑run & logging
--dry-runto validate without writing changes.- Verbose mode with
--verbosefor debug logging.
Installation
pip install toml-init
Package Structure
toml_init
├── __init__.py
├── __main__.py
├── exceptions.py
├── validators.py
└── manager.py
Quickstart (Python)
from pathlib import Path
from toml_init import ConfigManager, register_validator, Validator
# Optional: register a custom validator
class PathExistsValidator(Validator):
def validate(self, value):
from pathlib import Path as P
if not (isinstance(value, str) and P(value).exists()):
raise InvalidConfigValueError(f"Path not found: {value}")
return value
register_validator("path_exists", PathExistsValidator())
# Initialize and validate
cm = ConfigManager(
base_path=Path("configs"),
defaults_path=Path("configs/defaults"),
master_filename="config.toml"
)
cm.initialize(dry_run=False)
# Access validated settings
settings = cm.get_block("QuickBooks.Invoices.Saver")
print(settings["WINDOW_LOAD_DELAY"]) # e.g. 0.5
Quickstart (CLI)
# Create or validate configs in ./configs (defaults in ./configs/defaults)
toml-init
# Verbose & dry-run (no file writes)
toml-init --verbose --dry-run
# Custom paths
toml-init --base /etc/myapp/configs \
--defaults /etc/myapp/configs/defaults \
--master settings.toml
Example Project
A working sample lives under example_project/. Run python run_demo.py inside
that directory to generate config.toml using the defaults in
configs/defaults/example_defaults.toml.
Default File Format
Place your default templates in configs/defaults/. Each file may define multiple blocks (tables):
# defaults/app_defaults.toml
[__meta__]
name = "Config - QuickBooks Invoice Saver"
module_version = "0.1.0"
[QuickBooks.Invoices.Saver]
SHOW_TOASTS = true
WINDOW_LOAD_DELAY = { defaultValue = 0.5, type = "float", min = 0.0 }
NAVIGATION_DELAY = { defaultValue = 0.15, type = "float", min = 0.0 }
[MyApp.Logging]
LEVEL = { defaultValue = "INFO", type = "str", allowedValues = ["DEBUG","INFO","WARN","ERROR"] }
ENABLE_LOGS = { defaultValue = true, type = "bool" }
-
Block names = the table names (e.g.
QuickBooks.Invoices.Saver). -
Settings under each block may be:
- A primitive default:
KEY = 123(shorthand for a setting with onlydefaultValue). - A full schema object: specifying
type, optionalmin/max,allowedValues, andvalidator.
- A primitive default:
-
An optional
[__meta__]table may be present and is ignored by the library.
Supported Types
int,float,bool,str,list,dict,datetime,date,time- Numeric range checks with
min/max - Enumerations via
allowedValues - Custom hooks via
validator(must match a registeredValidator)
Exception Hierarchy
-
TomlInitError(base)MultipleConfigFilesErrorInvalidDefaultSchemaErrorInvalidConfigValueErrorBlockConflictError
Catch these to handle specific error cases gracefully.
Potential Future Features
| Feature | Description |
|---|---|
| Multiple config files | Will support having separate config files for organization purposes? |
| Comment injection | Allow comments to be specified in the defaults? |
Metadata
Release files for toml-init 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| toml_init-0.1.5.tar.gz | 15.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| toml_init-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.0 kB
Release files / toml_init-0.1.5.tar.gz
| Download URL | toml_init-0.1.5.tar.gz |
|---|---|
| Size | 15.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
469af7e022204037edb74385353b7d3b009cc62b4c8dd5d2007f3bc1fe20cbf7
|
|
BLAKE2b-256 checksum How to use checksums |
9b01dc59512de11dec08f3a6cf35669c1f52df74da1209f611cf6d179c00eb95
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Release files / toml_init-0.1.5-py3-none-any.whl
| Download URL | toml_init-0.1.5-py3-none-any.whl |
|---|---|
| Size | 14.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3d52b2e56f824f49c90099f98c873713bbaf71fd7ec6780a799b8aa9d3eb8363
|
|
BLAKE2b-256 checksum How to use checksums |
579b23134f44d7128211f48ee217e5af4a66868a5d5cdf925b6a77885f7ddbf4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|