Changelog
2.2.0 - 2026-09-26
Added
Ten runnable user-preference scenarios: first-run setup, Apply/Cancel, resets, recent documents, window geometry, account settings, CLI session overrides, portable JSON import/export, backup/restore, and legacy migration preview. The catalog now contains 26 examples, with a dedicated walkthrough guide.
Explicit
source_format="auto" | "raw" | "descriptors"selection anddry_run=Truepreviews for legacy migration, retaining the default heuristic and target preflight checks.Hypothesis properties for persistence, copying, merging, and failed writes.
Native wxPython integration scenarios with process timeouts and a dedicated Windows CI job; minimum runtime dependency testing on Python 3.10.
Functional installed-wheel and resource checks in CI and release automation.
A release-based deprecation schedule: v1 wrappers remain through 2.x and are scheduled for removal in 3.0. Explicit migration remains supported.
Fixed
Preserve Unicode NEL (U+0085) in YAML keys and values instead of folding it into a space; ordinary Unicode remains readable.
Reject non-scalar YAML keys carrying scalar tags with
ConfigFormatErrorand a source location instead of leaking aTypeError.Reject null characters in configuration directories during construction.
Normalize string subclass keys to plain strings, preserving their underlying text so string-backed enum keys can be saved. Scalar enum values still need explicit conversion; normalized key collisions are rejected.
Measure branch coverage as well as statement coverage, retaining the 100% gate and covering application reuse and pre-write failures.
Exercise POSIX and Windows permission branches on every platform so the coverage gate behaves consistently on Linux, macOS, and Windows.
Compatibility
Python 3.10 and later remain supported, with no new runtime dependency.
Existing migration calls retain their behavior; format selection and previews are optional. Deprecated v1 wrappers remain available throughout 2.x.
Malformed YAML keys and invalid configuration directories now consistently raise the documented configuration exceptions. Duplicate normalized keys are rejected instead of silently replacing an existing value.
2.1.0
Added
Public
parse_boolparser for yes/no, true/false, on/off, y/n, and 1/0 input.Keyword-only
Field.formatterto format current values for terminal display and GUI prefill, including JSON lists and mappings.Opt-in
TTYPrompter(keep_current=True)to retain a non-secret current value with Enter, while still parsing and validating it.Nine runnable examples covering portable storage, boolean input, editing, GUI collection, custom interfaces, nested settings, application validation, schema upgrades, and error handling; 16 examples are now available.
Practical recipes, troubleshooting, and a documented code review.
Fixed
Reject duplicate explicit YAML keys with source locations while preserving YAML merge defaults and explicit overrides.
Report invalid YAML scalar construction and excessive recursion during parsing, normalization, or serialization as
ConfigFormatError.Preserve the documented
ConfigReadErrorbehavior for file inspection failures inConfigStore.exists().Reject malformed fields, schemas, and custom prompter contracts early.
Clarify required/optional input and cancellation in the bundled interfaces.
Include examples, documentation, scripts, and pytest configuration in source distributions, with an archive-content check in CI.
Align Python checkout line endings with the formatter on Windows.
Compatibility
Files with duplicate explicit YAML keys must be corrected before loading. Previous releases silently selected the last value. YAML merge directives remain supported.
Invalid
Fielddefinitions now raiseTypeErrorat construction. Custom prompter methods must be callable, andask()must return text orNone.Existing positional
Fieldarguments remain supported. The formatter and terminal value-reuse option are optional; blank input is still submitted literally by default. Secret current values are never formatted or reused.Python 3.10 and later remain supported. No new runtime dependency is required.
Validation
230 tests passed locally on Windows with 100% statement coverage; three platform-specific tests were skipped.
Ruff, strict mypy, Sphinx, source-distribution tests, wheel persistence smoke checks, and distribution metadata validation passed.
GUI contracts use a wxPython substitute in the tests; actual window rendering was not verified in the local environment.