NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #792 most downloaded on PyPI
The sweetest config system for Python
Last release 6 months ago
24 Mar 2026
Release timing varies
gaps range from 9 days to 10 months
Nearly every release is documented
notes for 19 of 19 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
22 releases · first in 2022
One column per quarter.
Config values True, False, and None (Python-style capitalised literals) were silently kept as strings rather than being converted to their Python type
Config values True, False, and None (Python-style capitalised literals) were silently kept as strings rather than being converted to their Python types. This went unnoticed in older releases because pydantic v1's parse_obj coerced the strings during validation. With the new built-in type checker (which correctly requires actual bools), configs using the capitalised forms broke.
Handle True/False/None in try_load_json as aliases for the JSON-style true/false/null, and add regression tests covering both forms plus quoted strings that must stay as strings.
Avoid triggering warning.
Avoid triggering warning.
v1.3.2: Don't import Pydantic v1 on Python 3.14
Compare
v1.3.1: Minor type validation improvements
v1.3.1: Minor type validation improvements
Compare
Refactor library to properly separate config parsing, overrides, default filling, validation and promise resolution
v1.3.0: Refactor and improve validation
Compare
Fix pydantic v2 compat: check model_fields/model_config before __fields__/__config__, respect Strict metadata in Annotated types
Fix pydantic v2 compat: check model_fields/model_config before fields/config, respect Strict metadata in Annotated types
v1.2.2: Improve Pydantic compatibility
Compare
Use TypeVar self-type pattern (_ConfigSelf, _CVESelf) so Config and ConfigValidationError methods return the correct type for subclasses
v1.2.1: Improve public interface type signatures
Compare
Fix Config.to_str() crash on * positional arg sections (#52).
Config.to_str() crash on * positional arg sections (#52)._update_from_parsed crash when a pydantic validator coerces a string to a dict (#54).${ in config values crashing to_str().Pydantic v2 is stricter than v1 and I've been unable to replicate the behaviours we had in the config.
Pydantic v2 is stricter than v1 and I've been unable to replicate the behaviours we had in the config.
I had also attempted to refactor the library to make it easier to port, but this seems to have also introduced regressions.
To finally resolve this I'm dropping support for Pydantic in favour of a relatively small amount of custom validation logic. This should finally unblock spaCy and Thinc.
v1.1.0: Replace Pydantic with custom validation logic, restore v0.1.5 config and registry algorithm
Compare
Properly support Pydantic v2
Properly support Pydantic v2
Fix support for Pydantic v2, and greatly extend tests
Fix support for Pydantic v2, and greatly extend tests
v1.0.0a2: Fix Pydantic v2 support Pre-release
Pre-release
Compare
Previously confection did three tree operations simultaneously (in the registry._fill method):
Previously confection did three tree operations simultaneously (in the registry._fill method):
The fact that all three were being built at once made the code quite hard to update for Pydantic 2, and just difficult to work with in general. I've therefore refactored the code so that these are separate processes that apply to the whole tree at once.
A bonus of this is that we now build a model for the whole config and validate against that, which means all the validation errors for the config should come in at once, instead of only getting validation errors for one promise at a time.
Updating to Pydantic v2 will let spaCy finally support Python 3.13.
Fixes #47: Ensure config with * can be filled
* can be filled (#53)typing-extensions<5.0.0 for Python < 3.8 (#63)@adrianeboyd, @honnibal, @ines, @KennethEnevoldsen, @MartinBernstorff, @svlandeg
Nothing published for this version
Support use of $$ to escape a literal $ character in config strings (#49).
$$ to escape a literal $ character in config strings (#49).Add frozen structures to __init__.__all__ to ensure they can be imported easily from confection (#43).
__init__.__all__ to ensure they can be imported easily from confection (#43).Implement deepcopy() for FrozenDict and FrozenList to allow setting values in function headers
deepcopy() for FrozenDict and FrozenList to allow setting values in function headers (#41)Make catalogue a dev-only requirement (#35).
catalogue a dev-only requirement (#35).Add checks with warnings for single-quoted values (#22).
util.SimpleFrozenDict and util.SimpleFrozenList from spaCy (#28).["003"] rather than parsing them as integers (#33).Extend support for typing_extensions to v4.4.x for Python 3.6 and 3.7.
typing_extensions to v4.4.x for Python 3.6 and 3.7.pyproject.toml to source package.Extend support to pydantic v1.10.x.
Switch to mypy 0.981 for fixes related to Python 3.10.7 and NumPy.
py.typed to package.This is the initial release of confection, a lightweight library that offers a configuration system letting you conveniently describe arbitrary trees
This is the initial release of confection, a lightweight library that offers a configuration system letting you conveniently describe arbitrary trees of objects.
If you are a user of spaCy or Thinc, you may be familiar with this configuration system already - now you can use it independently.
Your coding agent can read these notes before it upgrades. Set up the MCP server →