NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1277 most downloaded on PyPI
PEP 621 metadata parsing
Last release 3 months ago
04 Jul 2026
Release timing varies
gaps range from 1 weeks to 1.2 years
Nearly every release is documented
notes for 13 of 13 stable releases
2 versions withdrawn
withdrawn after publishing
5 years old
24 releases · first in 2021
One column per quarter.
Collect a config error instead of raising a raw TypeError when project.dynamic contains a non-string (unhashable) entry with all_errors=True .
Fixes:
TypeError when project.dynamic contains a non-string (unhashable) entry with all_errors=True.Full Changelog: 0.12.0...0.12.1
Support PEP 808 (partially dynamic project metadata) (METADATA 2.6).
Features:
project.optional-dependencies is not a valid name. The extra is still emitted, only a ConfigurationWarning is produced.Fixes:
Version: 0.0.0. If "version" is declared in project.dynamic but never assigned by the build backend, writing the metadata now raises a ConfigurationError (Field "project.version" missing), restoring the 0.8.x behavior that regressed in the 0.9 rewrite.[project] when all_errors=True.license-files glob checks and private-tag parsing.Import-Namespace field name in the metadata mapping.Performance:
get_type_hints and precompile dispatch patterns.Documentation:
Internal and CI:
Full Changelog: 0.11.0...0.12.0
This release refactors a lot of the internals to break up conversion and validation. This should not be noticeable except for better error messages in
This release refactors a lot of the internals to break up conversion and validation. This should not be noticeable except for better error messages in some cases. We also now test on some downstream projects; if you are using pyproject-metadata for a backend, you can suggest adding a downstream test to our noxfile.
Refactoring:
Internal and CI:
Full Changelog: 0.10.0...0.11.0
This release adds support for PEP 794 (METADATA 2.5), the new import-names(paces) fields. Support hasn't rolled out in other packages yet, but once it
This release adds support for PEP 794 (METADATA 2.5), the new import-names(paces) fields. Support hasn't rolled out in other packages yet, but once it does, you can be ready for it with this release. As usual, nothing changes if you don't specify the new fields or the new METADATA version.
Features:
import-names(paces)Fixes:
Internal and CI:
Full Changelog: 0.9.1...0.10.0
This release fixes form feeds in License files using pre-PEP 639 syntax when using Python older than 3.12.4; this is a regression in 0.9.0 from moving
This release fixes form feeds in License files using pre-PEP 639 syntax when using Python older than 3.12.4; this is a regression in 0.9.0 from moving to the standard library email module. Some other small fixes to validation messages were applied.
Fixes:
Docs:
packaging.licenses example codeInternal and CI:
Full Changelog: 0.9.0...0.9.1
This release adds PEP 639 support (METADATA 2.4), refactors the RFC messages, and adds a lot of validation (including warnings and opt-in errors), a w
This release adds PEP 639 support (METADATA 2.4), refactors the RFC messages, and adds a lot of validation (including warnings and opt-in errors), a way to produce all validation errors at once, and more. The beta releases are intended for backend authors to try out the changes before a final release.
Features:
all_errors=True causes ExceptionGroup's to be emitted.as_json() methodFixes:
project.description)Full Changelog: 0.8.1...0.9.0
Changes since last beta:
Full Changelog: 0.9.0b7...0.9.0rc1
Refactoring:
Docs:
Refactoring:
validate_* functions into extras_* insteadDynamic for the type of .dynamicFixes:
Docs:
This release adds PEP 639 support (METADATA 2.4), refactors the RFC messages, and adds a lot of validation (including warnings and opt-in errors), a way to produce all validation errors at once, and more. The beta releases are intended for backend authors to try out the changes before a final release.
Features:
Added PEP 639 support for SPDX license and license files, METADATA 2.4
Validate extra keys (warning, opt-in error)
Functions to check top level and build-system (including PEP 735 support)
Add TypedDict’s in new module for typing pyproject.toml dicts
all_errors=True causes ExceptionGroup ’s to be emitted
Support METADATA 2.1+ JSON format with new .as_json() method
Fixes:
Match EmailMessage spacing
Handle multilines the way setuptools does with smart indentation
Warn on multiline Summary ( project.description )
Improve locking for just metadata fields
Error on extra keys in author/maintainer
URL name stylization removed matching PEP 753
Refactoring:
Move fetcher methods
Put validation in method
Make RFC822Message compatible with and subclass of EmailMessage class with support for Unicode
Remove indirection accessing metadata_version , add auto_metadata_version
Rework how dynamic works, add dynamic_metadata
Use dataclass instead of named tuple
Use named arguments instead of positional
Spit up over multiple files
Remove DataFetcher , use static types wherever possible
Reformat single quotes to double quotes to match packaging
Produce standard Python repr style in error messages (keeping double quotes for key names)
Show the types instead of values in error messages
Internal and CI:
Better changelog auto-generation
macos-latest now points at macos-14
Refactor and cleanup tests
Add human readable IDs to tests
Require 100% coverage
Docs:
Include extra badge in readme
Rework docs, include README and more classes
Changelog is now in markdown
Better API section
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Validate entrypoint group names
Full Changelog: 0.8.0...0.8.1
- Support specifying the metadata_version as 2.1, 2.2, or 2.3
Support specifying the metadata_version as 2.1, 2.2, or 2.3
Always normalize extras following PEP 685
Preserve the user-specified name style in the metadata. .canonical_name added to get the normalized name
Require “version” in the dynamic table if unset (following pyproject.toml [project] metadata)
Support extras using markers containing “or”
Support empty extras
Using .as_rfc822() no longer modifies the metadata object
Fix email-author listing for names containing commas
Separate core metadata keywords with commas, following the (modified) spec
An error message reported project.license instead of project.readme
Produce slightly cleaner tracebacks Fix a typo in an exception message
Subclasses now type check correctly
The build backend is now flit-core
Nothing published for this version
Nothing published for this version
- Relax pypa/packaging dependency
Relax pypa/packaging dependency
- Use tomllib on Python >= 3.11
Use UTF-8 when opening files
Use tomllib on Python >= 3.11
- Avoid first and last newlines in license contents
Avoid first and last newlines in license contents
- Make license and readme files pathlib.Path instances
Make license and readme files pathlib.Path instances
Add the license contents to the metadata file
Add support for multiline data in metadata fields
- Renamed project to pyproject_metadata
Renamed project to pyproject_metadata
Support multiple clauses in requires-python
Error out when dynamic fields are defined
Update dynamic field when setting version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →