Base Classes
ConfigFile
Abstract base class for declarative configuration file management.Provides automated config management with automatic discovery, subset validation, intelligent merging, priority-based validation, and parallel execution.Type Parameters:
ConfigT: The configuration type (ConfigDict or ConfigList)
parent_path(): Directory containing the fileextension(): File extension without leading dot_configs(): Expected configuration structure (internal)_load(): Load and parse the file (internal)_dump(config): Write configuration to file (internal)
priority(): Float priority (default 0, higher = first)filename(): Filename without extension (auto-derived from class name)
configs(): Cached wrapper around_configs()load(): Cached wrapper around_load()dump(config): Cache-invalidating wrapper around_dump(config)
Type Definitions
ConfigFile Methods
Abstract Methods (Must Implement)
Return directory containing the config file.Returns:
Path to parent directory, relative to project root.Example:
Return file extension without leading dot.Returns:
File extension (e.g., “toml”, “yaml”, “json”, “py”, “md”).Example:
Return expected configuration structure.Returns:
Minimum required configuration as dict or list.Example:
Load and parse configuration file.Returns:
Parsed configuration as dict or list. Implementations should return empty dict/list for empty files to support opt-out behavior.Example:
Optional Overrides
Return validation priority (higher = first, default 0).Returns:
Priority value. Use
Priority.LOW, Priority.MEDIUM, Priority.HIGH constants.Example:Derive filename from class name (auto-converts to snake_case).Returns:
Filename without extension.Example:
Public API
Validate config file, creating or updating as needed.Calls
create_file() if file doesn’t exist, validates content, and adds missing configs if needed. Idempotent and preserves user customizations.Raises:ValueError: If file cannot be made correct.
Return expected configuration structure (cached).Cached to avoid multiple calls to
_configs().Returns:
Minimum required configuration as dict or list.Load and parse configuration file (cached).Cached to avoid multiple reads of same file.Returns:
Parsed configuration as dict or list.
Write configuration to file (invalidates cache).Clears the cache before and after writing to ensure the dump operation reads the current file state and subsequent loads reflect the latest state.Parameters:
Configuration to write (dict or list).
Return full path by combining parent path, filename, and extension.Returns:
Complete path to the configuration file.
Merge expected config into current, preserving user customizations.Returns:
Merged configuration with all expected values and user additions.
Check if config file is valid (empty or expected is subset of actual).Returns:
True if valid (opted out or contains all expected configuration).
Check if user opted out (file exists and is empty).Returns:
True if file exists and is completely empty.
Class Methods
Validate all discovered ConfigFile subclasses in priority order.Groups subclasses by priority, validates in order, parallel within groups.Example:
Validate specific ConfigFile subclasses with priority-based ordering.Parameters:
ConfigFile subclasses to validate.
Format-Specific Base Classes
TomlConfigFile
Base class for TOML configuration files.Uses tomlkit for parsing/writing with formatting preservation. Arrays formatted as multiline, key order preserved.Subclasses must implement:
parent_path(): Directory containing the TOML file_configs(): Expected TOML configuration structure
YamlConfigFile
Base class for YAML configuration files.Uses PyYAML’s safe methods to prevent code execution. Preserves key order (sort_keys=False).Subclasses must implement:
parent_path(): Directory containing the YAML file_configs(): Expected YAML configuration structure
JsonConfigFile
Base class for JSON configuration files.Uses Python’s json module with 4-space indentation. Supports both dict and list as top-level structures.Subclasses must implement:
parent_path(): Directory containing the JSON file_configs(): Expected JSON configuration structure
PythonConfigFile
Base class for Python (.py) source files.Extends StringConfigFile with “py” extension. Inherits content-based validation.Subclasses must implement:
parent_path(): Directory containing the .py filelines(): Required Python code as list of lines
DictConfigFile
Abstract base class for dict-based configuration files.Specifies ConfigDict as the configuration type. Subclasses inherit proper typing for load(), dump(), configs(), etc.Subclasses must implement:
parent_path(): Directory containing the config fileextension(): File extension without leading dot_configs(): Expected configuration as dict_load(): Load and parse the file_dump(): Write configuration to file
Priority Constants
Priority levels for config file validation ordering.Constants:
DEFAULT = 0: Default priorityLOW = 10: Low priority (validate later)MEDIUM = 20: Medium priorityHIGH = 30: High priority (validate first)
Usage Examples
Basic TOML Configuration
- Create
myapp.tomlif it doesn’t exist - Add missing keys if file exists but incomplete
- Preserve any extra keys user added
- Validate final result matches expected structure
YAML Workflow Configuration
JSON Configuration
Custom File Format
Best Practices
- Use appropriate base classes: Choose TomlConfigFile, YamlConfigFile, etc. for common formats
- Set priorities: Use Priority constants to control validation order
- Preserve user customizations: The system automatically merges expected configs with user additions
- Support opt-out: Empty files are treated as user opt-out
- Use descriptive class names: Class names auto-convert to filenames (MyAppConfigFile -> my_app.toml)
- Cache-aware: Use
configs()andload()(cached) instead of_configs()and_load() - Idempotent operations: Design configs to be safe to validate multiple times
Related APIs
- CLI API - For command-line interface framework
- Builders API - For creating distributable artifacts