Sourced from packaging's releases.
26.0
Read about the performance improvements here: https://iscinumpy.dev/post/packaging-faster.
What's Changed
Features:
- PEP 751: support pylock by
@sbidoulin pypa/packaging#900- PEP 794: import name metadata by
@brettcannonin pypa/packaging#948- Support writing metadata by
@henryiiiin pypa/packaging#846- Support
__replace__forVersionby@henryiiiin pypa/packaging#1003- Support positional pattern matching for
VersionandSpecifierby@henryiiiin pypa/packaging#1004Behavior adaptations:
- PEP 440 handling of prereleases for
Specifier.contains,SpecifierSet.contains, andSpecifierSet.filterby@notatallshawin pypa/packaging#897- Handle PEP 440 edge case in
SpecifierSet.filterby@notatallshawin pypa/packaging#942- Adjust arbitrary equality intersection preservation in
SpecifierSetby@notatallshawin pypa/packaging#951- Return
Falseinstead of raising for.containswith invalid version by@Liam-DeVoein pypa/packaging#932- Support arbitrary equality on arbitrary strings for
SpecifierandSpecifierSet'sfilterandcontainsmethod. by@notatallshawin pypa/packaging#954- Only try to parse as
Versionon certain marker keys, returnFalseon unequal ordered comparsions by@JP-Ellisin pypa/packaging#939Fixes:
- Update
_hashwhen unpicklingTag()by@dholthin pypa/packaging#860- Correct comment and simplify implicit prerelease handling in
Specifier.prereleasesby@notatallshawin pypa/packaging#896- Use explicit
_GLibCVersionNamedTuplein_manylinuxby@cthoytin pypa/packaging#868- Detect invalid license expressions containing
()by@bwoodsendin pypa/packaging#879- Correct regex for metadata
'name'format by@diin pypa/packaging#925- Improve the message around expecting a semicolon by
@pradyunsgin pypa/packaging#833- Support nested parens in license expressions by
@Liam-DeVoein pypa/packaging#931- Add space before at symbol in
Requirementsstring by@henryiiiin pypa/packaging#953- A root logger use found by ruff LOG, use
packaginglogger instead by@henryiiiin pypa/packaging#965- Better support for subclassing
MarkerandRequirementby@henryiiiin pypa/packaging#1022- Normalize all extras, not just if it comes first by
@henryiiiin pypa/packaging#1024- Don't produce a broken repr if
Markerfails to construct by@henryiiiin pypa/packaging#1033Performance:
- Avoid recompiling regexes in the tokenizer for a 3x speedup by
@hauntsaninjain pypa/packaging#1019- Improve performance in
_manylinux.pyby@cthoytin pypa/packaging#869- Minor cleanups to
Versionby@bearomorphismin pypa/packaging#913- Skip redundant creation of
Versions in specifier comparison by@notatallshawin pypa/packaging#986- Cache
Specifier's Version by@notatallshawin pypa/packaging#985- Make
Versiona little faster by@henryiiiin pypa/packaging#987- Minor
Versionregex cleanup by@henryiiiin pypa/packaging#990- Faster regex on Python 3.11.5+ by
@henryiiiin pypa/packaging#988 and pypa/packaging#1055- Lazily calculate
_keyinVersionby@notatallshawin pypa/packaging#989 and regression forpackaging_legacyfixed by@henryiiiin pypa/packaging#1048- Faster
canonicalize_versionby@henryiiiin pypa/packaging#993- Use
fullmatchin a couple more places by@henryiiiin pypa/packaging#992
... (truncated)
Sourced from packaging's changelog.
26.0 - 2026-01-20
Features:
- PEP 751: support pylock (:pull:
900)- PEP 794: import name metadata (:pull:
948)- Support for writing metadata to a file (:pull:
846)- Support
__replace__on Version (:pull:1003)- Support positional pattern matching for
VersionandSpecifierSet(:pull:1004)Behavior adaptations:
- PEP 440 handling of prereleases for
Specifier.contains,SpecifierSet.contains, andSpecifierSet.filter(:pull:897)- Handle PEP 440 edge case in
SpecifierSet.filter(:pull:942)- Adjust arbitrary equality intersection preservation in
SpecifierSet(:pull:951)- Return
Falseinstead of raising for.containswith invalid version (:pull:932)- Support arbitrary equality on arbitrary strings for
SpecifierandSpecifierSet'sfilterandcontainsmethod. (:pull:954)- Only try to parse as
Versionon certain marker keys, returnFalseon unequal ordered comparisons (:pull:939)Fixes:
- Update
_hashwhen unpicklingTag()(:pull:860)- Correct comment and simplify implicit prerelease handling in
Specifier.prereleases(:pull:896)- Use explicit
_GLibCVersionNamedTuplein_manylinux(:pull:868)- Detect invalid license expressions containing
()(:pull:879)- Correct regex for metadata
'name'format (:pull:925)- Improve the message around expecting a semicolon (:pull:
833)- Support nested parens in license expressions (:pull:
931)- Add space before at symbol in
Requirementsstring (:pull:953)- A root logger use found, use a
packaginglogger instead (:pull:965)- Better support for subclassing
MarkerandRequirement(:pull:1022)- Normalize all extras, not just if it comes first (:pull:
1024)- Don't produce a broken repr if
Markerfails to construct (:pull:1033)Performance:
- Avoid recompiling regexes in the tokenizer for a 3x speedup (:pull:
1019)- Improve performance in
_manylinux.py(:pull:869)- Minor cleanups to
Version(:pull:913)- Skip redundant creation of
Version's in specifier comparison (:pull:986)- Cache the
Specifier'sVersion(:pull:985)- Make
Versiona little faster (:pull:987)- Minor
Versionregex cleanup (:pull:990)- Faster regex on Python 3.11.5+ for
Version(:pull:988, :pull:1055)- Lazily calculate
_keyinVersion(:pull:989, :pull:1048)- Faster
canonicalize_version(:pull:993)- Use
re.fullmatchin a couple more places (:pull:992, :pull:1029)- Use
mapinstead of generator (:pull:996)- Deprecate
._version(_Version, aNamedTuple) (:pull:995, :pull:1062)
</tr></table>
... (truncated)
3b77a26
Bump for release31371cc
docs: prepare for 26.0 final (#1063)9627a88
perf: dual replace (#1064)d5398b8
fix: restore ._version as a compat shim (#1062)3a7b600
Bump for developmentd4eefdc
Bump for release4618912
docs: prepare for 26.0rc3 (#1060)0cf1b41
ci: test on first public release of CPythons (#1056)716beb1
perf: 10% faster stripping zeros (#1058)350a230
fix: support CPython 3.11.0-3.11.4 and older PyPy3.11 (#1055)