Skip to main content

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 its defaults/ subdirectory exist (creates them if missing).
  • Defaults merging

    • Scans all *.toml files under configs/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.
  • Schema-driven validation

    • Each setting may be declared in two ways:

      1. Simple: KEY = <defaultValue>
      2. Full: KEY = { defaultValue = <...>, type = "<int|float|bool|str>", min = <...>, max = <...>, allowedValues = [...], validator = "<name>" }
    • Supports numeric range checks (min/max), enumerations (allowedValues), and custom validation hooks.

  • Custom validators

    • Implement by subclassing Validator and registering via register_validator("name", instance).
    • Allows arbitrary user‑defined checks (e.g. path existence, regex match).
  • Preserves user overrides

    • If users manually edit config.toml, extra keys remain intact.
    • Invalid values are reset to defaults with a logged warning.
  • CLI & programmatic API

    • Installable console script: toml-init for quick command-line setup.
    • ConfigManager class for embedding in Python code.
  • Dry‑run & logging

    • --dry-run to validate without writing changes.
    • Verbose mode with --verbose for 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 only defaultValue).
    • A full schema object: specifying type, optional min/max, allowedValues, and validator.
  • 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 registered Validator)

Exception Hierarchy

  • TomlInitError (base)

    • MultipleConfigFilesError
    • InvalidDefaultSchemaError
    • InvalidConfigValueError
    • BlockConflictError

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)

Source distribution for toml-init 0.1.5
File Size Uploaded
toml_init-0.1.5.tar.gz 15.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for toml-init 0.1.5
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

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