Skip to content

Releases: pypa/packaging

26.1

14 Apr 21:16
Immutable release. Only release title and notes can be modified.
26.1

Choose a tag to compare

Features:

  • PEP 783: add handling for Emscripten wheel tags by @hoodmane in #804 (old name used in implementation, will be fixed in next release)
  • PEP 803: add handling for the abi3.abi3t free-threading tag by @ngoldbaum in #1099
  • PEP 723: add packaging.dependency_groups module, based on the dependency-groups package by @sirosen in #1065
  • Add the packaging.direct_url module by @sbidoul in #944
  • Add the packaging.errors module by @henryiii in #1071
  • Add SpecifierSet.is_unsatisfiable using ranges (new internals that will be expanded in future versions) by @notatallshaw in #1119
  • Add create_compatible_tags_selector to select compatible tags by @sbidoul in #1110
  • Add a key argument to SpecifierSet.filter() by @frostming in #1068
  • Support & and | for Marker's by @henryiii in #1146
  • Normalize Version.__replace__ and add Version.from_parts by @henryiii in #1078
  • Add an option to validate compressed tag set sort order in parse_wheel_filename by @r266-tech in #1150

Behavior adaptations:

Pylock (PEP 751) updates:

  • Add pylock select function by @sbidoul in #1092
  • Document pylock select() method and PylockSelectError by @r266-tech in #1153
  • Add filename property to PackageSdist and PackageWheel, more validation by @sbidoul in #1095
  • Give preference to path over url by @sbidoul in #1128
  • Validate name/version consistency in file names by @sbidoul in #1114

Fixes:

  • Fix > comparison for versions with dev+local segments by @veeceey in #1097
  • Fix incorrect self-comparison for InfinityType and NegativeInfinityType by @bysiber in #1093
  • Canonicalize when deduplicating specifiers in SpecifierSet by @notatallshaw in #1109
  • Fix charset error message formatting by @notatallshaw in #1121
  • Handle the key parameter in SpecifierSet.filter when specifiers are empty and prerelease is False by @notatallshaw in #1096
  • Standardize inner components of repr output by @henryiii in #1090
  • Specifier's === uses original string, not normalized, when available by @notatallshaw in #1124
  • Propagate int-max-str-digits ValueError by @notatallshaw in #1155

Performance:

Internal:

Documentation:

Benchmarks

Performance improvements since 26.0, from the new integrated benchmark suite:

uv run asv run 26.0..HEAD
Screenshot 2026-04-13 at 11 32 14 PM Screenshot 2026-04-13 at 11 32 43 PM

New Contributors

Full Changelog: 26.0...26.1

26.0

21 Jan 21:03
Immutable release. Only release title and notes can be modified.
26.0

Choose a tag to compare

Read about the performance improvements here: https://iscinumpy.dev/post/packaging-faster.

What's Changed

Features:

Behavior adaptations:

  • PEP 440 handling of prereleases for Specifier.contains, SpecifierSet.contains, and SpecifierSet.filter by @notatallshaw in #897
  • Handle PEP 440 edge case in SpecifierSet.filter by @notatallshaw in #942
  • Adjust arbitrary equality intersection preservation in SpecifierSet by @notatallshaw in #951
  • Return False instead of raising for .contains with invalid version by @Liam-DeVoe in #932
  • Support arbitrary equality on arbitrary strings for Specifier and SpecifierSet's filter and contains method. by @notatallshaw in #954
  • Only try to parse as Version on certain marker keys, return False on unequal ordered comparsions by @JP-Ellis in #939

Fixes:

  • Update _hash when unpickling Tag() by @dholth in #860
  • Correct comment and simplify implicit prerelease handling in Specifier.prereleases by @notatallshaw in #896
  • Use explicit _GLibCVersion NamedTuple in _manylinux by @cthoyt in #868
  • Detect invalid license expressions containing () by @bwoodsend in #879
  • Correct regex for metadata 'name' format by @di in #925
  • Improve the message around expecting a semicolon by @pradyunsg in #833
  • Support nested parens in license expressions by @Liam-DeVoe in #931
  • Add space before at symbol in Requirements string by @henryiii in #953
  • A root logger use found by ruff LOG, use packaging logger instead by @henryiii in #965
  • Better support for subclassing Marker and Requirement by @henryiii in #1022
  • Normalize all extras, not just if it comes first by @henryiii in #1024
  • Don't produce a broken repr if Marker fails to construct by @henryiii in #1033

Performance:

Type annotations:

Internal:

Read more

26.0rc3

15 Jan 23:26
Immutable release. Only release title and notes can be modified.
26.0rc3

Choose a tag to compare

26.0rc3 Pre-release
Pre-release

What's Changed

Fixes:

  • Support CPython 3.11.0-3.11.4 and older PyPy3.11 by @henryiii in #1055

Performance:

CI:

Documentation:

Full Changelog: 26.0rc2...26.0rc3

26.0rc2

12 Jan 21:18
Immutable release. Only release title and notes can be modified.
26.0rc2

Choose a tag to compare

26.0rc2 Pre-release
Pre-release

What's Changed

Fixes:

  • Fix regression in (private) Version._key for packaging_legacy by @henryiii in #1048

Performance:

  • Tiny import time improvement and simplification by @henryiii in #1047

Internal:

Full Changelog: 26.0rc1...26.0rc2

26.0rc1

09 Jan 01:29
Immutable release. Only release title and notes can be modified.
26.0rc1

Choose a tag to compare

26.0rc1 Pre-release
Pre-release

What's Changed

Features:

Behavior adaptations:

  • PEP 440 handling of prereleases for Specifier.contains, SpecifierSet.contains, and SpecifierSet.filter by @notatallshaw in #897
  • Handle PEP 440 edge case in SpecifierSet.filter by @notatallshaw in #942
  • Adjust arbitrary equality intersection preservation in SpecifierSet by @notatallshaw in #951
  • Return False instead of raising for .contains with invalid version by @Liam-DeVoe in #932
  • Support arbitrary equality on arbitrary strings for Specifier and SpecifierSet's filter and contains method. by @notatallshaw in #954
  • Only try to parse as Version on certain marker keys, return False on unequal ordered comparsions by @JP-Ellis in #939

Fixes:

  • Update _hash when unpickling Tag() by @dholth in #860
  • Correct comment and simplify implicit prerelease handling in Specifier.prereleases by @notatallshaw in #896
  • Use explicit _GLibCVersion NamedTuple in _manylinux by @cthoyt in #868
  • Detect invalid license expressions containing () by @bwoodsend in #879
  • Correct regex for metadata 'name' format by @di in #925
  • Improve the message around expecting a semicolon by @pradyunsg in #833
  • Support nested parens in license expressions by @Liam-DeVoe in #931
  • Add space before at symbol in Requirements string by @henryiii in #953
  • A root logger use found by ruff LOG, use packaging logger instead by @henryiii in #965
  • Better support for subclassing Marker and Requirement by @henryiii in #1022
  • Normalize all extras, not just if it comes first by @henryiii in #1024
  • Don't produce a broken repr if Marker fails to construct by @henryiii in #1033

Performance:

Type annotations:

Internal:

Read more

25.0

19 Apr 11:49
25.0
f585376

Choose a tag to compare

What's Changed

New Contributors

Full Changelog: 24.2...25.0

24.2

08 Nov 09:48
24.2
d8e3b31

Choose a tag to compare

What's Changed

New Contributors

Full Changelog: 24.1...24.2

24.1

09 Jun 23:19
24.1
85442b8

Choose a tag to compare

What's Changed

New Contributors

Full Changelog: 24.0...24.1

24.0

10 Mar 09:39
24.0
7a983f7

Choose a tag to compare

What's Changed

New Contributors

Full Changelog: 23.2...24.0

23.2

01 Oct 13:50
23.2
b3a5d7d

Choose a tag to compare

What's Changed

New Contributors

Full Changelog: 23.1...23.2