| Names and normalization |
✅ Yes |
Implements PEP 503 via canonicalize_name() in packaging.utils 1 |
| Core metadata specifications |
✅ Yes |
Implements metadata parsing/validation in packaging.metadata 2 |
| Version specifiers (PEP 440) |
✅ Yes |
Provided via packaging.version and packaging.specifiers 1 |
| Dependency specifiers (PEP 508) |
✅ Yes |
Provided via packaging.requirements and packaging.markers 2 |
pyproject.toml spec (PEPs 518/621) |
❌ No (#647) |
Handled by build backends (e.g. setuptools, Poetry); not parsed by packaging |
| Dependency Groups (PEP 735) |
❌ No (#1065) |
Requires separate library (e.g. dependency-groups); packaging is out of scope |
| Inline script metadata (PEP 723) |
❌ No |
For runtime script metadata; not a concern of packaging |
| Platform compatibility tags (PEP 425/600) |
✅ Yes |
Implements via packaging.tags 2 |
| Well-known Project URLs (PEP 753) |
❌ No |
Normalised by index/pip; packaging only retains metadata as-is |
| Glob patterns |
❌ No |
Handled by build tools; no native glob support in packaging |
| License Expression (SPDX / PEP 639) |
✅ Yes |
Implemented through packaging.licenses 2 |
| Recording installed projects (PEP 376) |
❌ No |
Managed by installers (e.g. pip); not within packaging scope |
| Entry points spec |
❌ No |
Handled by build backends and importlib.metadata; not by packaging |
| Direct URL origin/data (PEP 610) |
❌ No (#944) |
Recorded by installers (pip); not by packaging |
| Python Virtual Environments (PEP 405) |
❌ No |
Implemented in stdlib (venv) and virtualenv, not packaging |
| Externally Managed Environments (PEP 668) |
❌ No |
Policy enforced by installers/package managers; not in packaging |
| Source distribution format |
⚠️ Partial |
Filename parsing only (parse_sdist_filename()); no content handling |
| Binary distribution format (Wheel, PEP 427) |
⚠️ Partial (#697) |
Filename parsing (parse_wheel_filename()); no wheel creation/content handling 12 |
.pypirc file |
❌ No |
Configuration for uploads; in tools like twine/pip only |
| Simple repository API (PEP 503) |
❌ No (#1088) |
Only name normalization covered; metadata fetching handled by pip/Warehouse |
| File Yanking (PEP 592) |
❌ No (#1088) |
Handled by index and installer (pip); not in packaging |
| Index hosted attestations (PEP 658) |
❌ No |
Security metadata handled by index/installer; not in packaging |
| Project Status Markers (PEP 792) |
❌ No (#1088) |
Index metadata (e.g. deprecated); not in packaging |
| Python Description Formats |
❌ No |
Description content type stored but not rendered/validated |
build-details.json (PEP 739) |
❌ No |
Generated by Python installer; read by build tools, not packaging |
| Reproducible Environments (beyond lock file) |
❌ No |
Covered by pip/Pipenv; only pylock.toml lock file is supported |
pylock.toml spec (PEP 751) |
✅ Yes |
Supported in v26 through packaging.pylock |
| PyPA schemas |
❌ No |
JSON schemas for validation; code validation done instead of schema-based |
I asked ChatGPT to make a table of features that we might be missing.
pypa/packaging?canonicalize_name()inpackaging.utils1packaging.metadata2packaging.versionandpackaging.specifiers1packaging.requirementsandpackaging.markers2pyproject.tomlspec (PEPs 518/621)packagingdependency-groups);packagingis out of scopepackagingpackaging.tags2packagingonly retains metadata as-ispackagingpackaging.licenses2packagingscopeimportlib.metadata; not bypackagingpackagingvenv) and virtualenv, notpackagingpackagingparse_sdist_filename()); no content handlingparse_wheel_filename()); no wheel creation/content handling 12.pypircfilepackagingpackagingpackagingbuild-details.json(PEP 739)packagingpylock.tomllock file is supportedpylock.tomlspec (PEP 751)packaging.pylock