Releases: pypa/packaging
Releases · pypa/packaging
Release list
26.3
What's Changed
Features
- Add a public
VersionRangeAPI andSpecifierSet.to_range(), representing the versions a specifier set accepts as an interval set that supports intersection, union, difference, complement, set relations, membership tests, and filtering.VersionRange.to_specifier_set()converts a range back to aSpecifierSetwhere a PEP 440 form exists. (#1267, #1270, #1298) - PEP 808: accept
Metadata-Version: 2.6. (#1194) - Add a
limitargument toparse_tag()for compressed tag sets. (#1220) - Add a
prefer_sdist_predicateargument toPylock.select()to prefer source distributions over wheels for selected packages. (#1334) - Add
pure_python_tags()to generate the pure-Python tags for a Python version without touching the running platform. (#1346) - Add
SpecifierSet.is_subset(),SpecifierSet.is_superset(), andSpecifierSet.is_disjoint(), which compare the versions two specifier sets accept. (#1313)
Behavior adaptations
- Drop support for Python 3.8; packaging now requires Python 3.9 or later. (#1157)
- Prefer native
linux_*platform tags overmanylinuxandmusllinuxtags on Linux. (#160)
Fixes for versions and specifiers
- Raise
InvalidVersioninstead ofTypeErrorwhenVersionis given a non-string. (#1319) - Raise
InvalidVersionfor non-string pre-release letters passed toVersion.from_parts. (#1241) - Fix an
AttributeErrorwhen hashing internally trimmed versions. (#1242) - Fix
SpecifierSet.is_unsatisfiablefor post-release boundary intersections. (#1257)
Fixes for requirements and markers
- Make
Requirement.__hash__consistent with__eq__for trailing-zero-equivalent specifiers (e.g.foo==1.0.0andfoo==1.0.0.0), so equal requirements hash equal and deduplicate in sets and dicts. (#1232) - Normalize requested extra names before comparing or hashing requirements. (#644)
- Preserve a
Requirement's specifierprereleasesoverride across a pickle round trip. (#1204) - Raise
InvalidRequirementinstead ofInvalidSpecifierwhen a requirement contains an invalid specifier. (#1332) - Clarify the error for post-release prefix wildcards like
==1.0.post1.*. (#1299) - Preserve quoting semantics when serializing marker values, so round-tripped markers parse back to the same marker. (#1213)
- Keep the parentheses of a nested group when serializing markers. (#1316)
- Normalize
extraanddependency_groupsvalues in nested markers at parse time. (#1246, #1310) - Raise
UndefinedComparisonwhen a set-valued variable likeextrasis used outside the membership form. (#1265) - Raise
UndefinedEnvironmentName(aKeyErrorsubclass) for missing environment keys during marker evaluation. (#1276) - Wrap malformed string literal errors in
InvalidMarker/InvalidRequirementinstead of leaking a low-level error. (#1249) - Reject requirements and markers with a trailing line break. (#1345)
Fixes for metadata and licenses
- Collect all
from_emailvalidation errors into oneExceptionGroupinstead of raising the first. (#1268) - Accept the UTF-8 charset case-insensitively in email payloads. (#1330)
- Reject malformed
Description-Content-Typevalues. (#1329) - Don't rewrite user values that contain
{field}placeholders in error messages. (#1327) - Route multipart email payloads to
unparsedinstead of asserting. (#1247) - Make
InvalidMetadataandCyclicDependencyGrouppicklable. (#1328) - Fold every line boundary
str.splitlinesrecognizes when writing a header withRFC822Message. (#1356) - Raise
InvalidLicenseExpressionfor misplacedWITHclauses and emptyLicenseRef-names. (#1266) - Raise
InvalidLicenseExpressioninstead ofKeyErrorfor aLicenseRef-with a+suffix. (#1219)
Fixes for tags and filenames
- Raise
InvalidTagfromparse_tag()for tags with the wrong number of components. (#1238) - Reject empty tag components in
parse_wheel_filename()andparse_tag(). (#1234) - Reject an empty project name in the wheel and sdist filename parsers. (#1305)
- Reject wheel filenames with a trailing newline. (#1341)
- Reject wheel tags whose interpreter component is not an identifier. (#577)
is_normalized_namenow rejects names with collapsed double hyphens likea--b. (#1230)- Fix duplicate explicit
abi3ttags. (#1245) - Forward the
warnargument togeneric_tags()insys_tags(). (#1264) - Raise
SystemErrorfor an empty or malformed CPythonEXT_SUFFIX. (#1271, #1301) - Fix a typo in the macOS
fat3architecture name (wasfat32). (#1199)
Fixes for pylock, direct URLs, and dependency groups
- Percent-decode
pylockartifact file names derived from aurlso that local versions (e.g. a wheel with2.12.1+cu130encoded as2.12.1%2Bcu130) yield a valid file name. (#1314) - Use an explicitly empty
tagssequence inPylock.select()instead of falling back tosys_tags(). (#1349) - Fix
Pylock.select()on Python builds that report a non-PEP 440python_full_version(e.g.3.15.0+). (#1179) - Reject TOML booleans where integers are expected in
pylockfiles. (#1244) - Add
PylockSelectErrortopackaging.pylock.__all__. (#1202) - Fix
DirectUrlcredential stripping for passwords containing@. (#1218) - Parse the URL scheme case-insensitively when checking for file URLs in
direct_url. (#1240) - Require absolute file URLs for local directories in
direct_url. (#1297) - Collect
InvalidRequirementerrors while resolving dependency groups instead of leaking them. (#1302) - Don't cache malformed dependency group parses. (#1248)
Performance
- Implement
SpecifierandSpecifierSetfiltering with the new range engine. (#1120, #1259) - Cache the default marker environment. (#1250)
- Cache the
_manylinuxmodule lookup process-wide. (#1254) - Add
__slots__toRequirementand the token classes. (#1320, #1258) - Keep range caches across canonicalization, precompile the wheel project-name pattern, simplify
parse_tag(), and skipplatform.mac_ver()when the version and arch are given. (#1253, #1256, #1236, #1255)
Documentation
- Describe the validation scope of
packaging.pylock. (#1339) - Explain which
packaging.metadatafields are validated. (#1342) - Document
RFC822Policyin the low-levelpackaging.metadatainterface. (#1222) - Enable nitpicky mode and render missing classes and fields in the API reference. (#1196, #1225, [#1277](htt...
26.2
What's Changed
Fixes:
- Fix incorrect sysconfig var name for pyemscripten by @ryanking13 in #1160
- Make
Version,Specifier,SpecifierSet,Tag,Marker, andRequirementpickle-safe
and backward-compatible with pickles created in 25.0-26.1 (including references to the removed
packaging._structuresmodule) by @eachimei and @henryiii in #1163, #1168, #1170, and #1171 - fix: re-export ExceptionGroup for now by @henryiii in #1164
Documentation:
- docs: add errors section and fix missing details by @henryiii in #1159
- docs(dev): document property-based test suite by @r266-tech in #1167
- Fix typo in DirectUrl documentation by @sbidoul in #1169
- docs(specifiers): add is_unsatisfiable() usage example by @r266-tech in #1166
Internal:
- Enable the auditor persona on zizmor by @henryiii in #1158
- Test new pickle guarantees by @henryiii in #1174
- Use native uv integration in rtd by @henryiii in #1175
New Contributors
- @ryanking13 made their first contribution in #1160
- @eachimei made their first contribution in #1163
Full Changelog: 26.1...26.2
26.1
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.abi3tfree-threading tag by @ngoldbaum in #1099 - PEP 723: add
packaging.dependency_groupsmodule, based on thedependency-groupspackage by @sirosen in #1065 - Add the
packaging.direct_urlmodule by @sbidoul in #944 - Add the
packaging.errorsmodule by @henryiii in #1071 - Add
SpecifierSet.is_unsatisfiableusing ranges (new internals that will be expanded in future versions) by @notatallshaw in #1119 - Add
create_compatible_tags_selectorto select compatible tags by @sbidoul in #1110 - Add a
keyargument toSpecifierSet.filter()by @frostming in #1068 - Support
&and|forMarker's by @henryiii in #1146 - Normalize
Version.__replace__and addVersion.from_partsby @henryiii in #1078 - Add an option to validate compressed tag set sort order in
parse_wheel_filenameby @r266-tech in #1150
Behavior adaptations:
- Narrow exclusion of pre-releases for
<V.postNto match spec by @notatallshaw in #1140 - Narrow exclusion of post-releases for
>Vto match spec by @notatallshaw in #1141 - Rename
format_full_versionto_format_full_versionto make it visibly private by @r266-tech in #1125 - Restrict local version to ASCII by @henryiii in #1102
Pylock (PEP 751) updates:
- Add pylock
selectfunction by @sbidoul in #1092 - Document pylock
select()method andPylockSelectErrorby @r266-tech in #1153 - Add
filenameproperty toPackageSdistandPackageWheel, 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
InfinityTypeandNegativeInfinityTypeby @bysiber in #1093 - Canonicalize when deduplicating specifiers in
SpecifierSetby @notatallshaw in #1109 - Fix charset error message formatting by @notatallshaw in #1121
- Handle the
keyparameter inSpecifierSet.filterwhen specifiers are empty and prerelease isFalseby @notatallshaw in #1096 - Standardize inner components of
reproutput by @henryiii in #1090 Specifier's===uses original string, not normalized, when available by @notatallshaw in #1124- Propagate int-max-str-digits
ValueErrorby @notatallshaw in #1155
Performance:
- Add fast path for parsing simple versions (digits and dots only) by @notatallshaw in #1082
- Add fast path for
VersiontoVersioncomparison by skipping_keyproperty by @notatallshaw in #1083 - Cache
Versionhash value in dedicated slot by @notatallshaw in #1118 - Overhaul
_cmpkeyto remove use of custom objects by @notatallshaw in #1116 - Skip
__replace__in Specifier comparison if not needed by @notatallshaw in #1081 SpecifierSetusetupleinstead offrozensetfor_specsby @notatallshaw in #1108- Speed up complex
SpecifierSetfiltering by implementing cost-based ordering by @notatallshaw in #1105 - Speed up wildcard comparison by @notatallshaw in #1111
- Stream PEP440 filtering in
SpecifierSet.filterby @notatallshaw in #1076 - Add
__slots__toMarkerby @henryiii in #1147 - Simply
Specifierregex by @sirosen in #1106 - Skip using the hash property internally by @notatallshaw in #1115
Internal:
- Add downstream testing by @henryiii in #1049
- Benchmarking suite by @henryiii in #1059
- Benchmark variance reduction by @notatallshaw in #1107
- Add property-based tests for PEP 440 by @notatallshaw in #1144
- Clean up a few
collections.namedtuplein tests by @henryiii in #1070 - Do not reload the tags module in tests by @henryiii in #1152
- Limit
dir()/ tab-completion in REPL by @henryiii in #1011 - Add more
__all__/__dir__by @henryiii in #1069 - Cleanup pre-commit a bit by @henryiii in #1080
- Pin pre-commit file, use dependabot by @henryiii in #1133
- Remove sphinx-toolbox by @henryiii in #1135
- Use docs group, faster readthedocs by @henryiii in #1061
- Add free-threaded Python to CI by @henryiii in #1098
- Simplify combining
SpecifierSet.prereleasesby @notatallshaw in #1073 - Use direct operator methods in
_compare_compatibleby @notatallshaw in #1100 - Remove unnecessary if statement in
Specifier.prereleasesby @notatallshaw in #1074 - Remove unneeded nesting in
Specifier.prereleasesby @notatallshaw in #1072
Documentation:
- Fix documentation: grammar, typos, formatting, and outdated references by @DimitriPapadopoulos in #1084
- Fix versionadded for
Version.from_parts()by @Jackenmen in #1134 - Document
&and|operators for combiningMarkerobjects by @r266-tech in #1151 - Expand and clean up
Versiondocumentation by @henryiii in #1089 - Move license docs inline by @henryiii in #1131
- Move markers inline by @henryiii in #1104
- Move tags docs to inline by @henryiii in #1130
- Move utilities inline, like other modules by @henryiii in #1103
Benchmarks
Performance improvements since 26.0, from the new integrated benchmark suite:
uv run asv run 26.0..HEAD
New Contributors
- @veeceey made their first contribution in #1097
- @bysiber made their first contribution in #1093
- @sirosen made their first contribution in #1106
- @Jackenmen made their first contribution in #1134
- @ngoldbaum made their first contribution in #1099
- @r266-tech made their first contribution in #1151
- @hoodmane made their first contribution in #804
Full Changelog: 26.0...26.1
26.0
Read about the performance improvements here: https://iscinumpy.dev/post/packaging-faster.
What's Changed
Features:
- PEP 751: support pylock by @sbidoul in #900
- PEP 794: import name metadata by @brettcannon in #948
- Support writing metadata by @henryiii in #846
- Support
__replace__forVersionby @henryiii in #1003 - Support positional pattern matching for
VersionandSpecifierby @henryiii in #1004
Behavior adaptations:
- PEP 440 handling of prereleases for
Specifier.contains,SpecifierSet.contains, andSpecifierSet.filterby @notatallshaw in #897 - Handle PEP 440 edge case in
SpecifierSet.filterby @notatallshaw in #942 - Adjust arbitrary equality intersection preservation in
SpecifierSetby @notatallshaw in #951 - Return
Falseinstead of raising for.containswith invalid version by @Liam-DeVoe in #932 - Support arbitrary equality on arbitrary strings for
SpecifierandSpecifierSet'sfilterandcontainsmethod. by @notatallshaw in #954 - Only try to parse as
Versionon certain marker keys, returnFalseon unequal ordered comparsions by @JP-Ellis in #939
Fixes:
- Update
_hashwhen unpicklingTag()by @dholth in #860 - Correct comment and simplify implicit prerelease handling in
Specifier.prereleasesby @notatallshaw in #896 - Use explicit
_GLibCVersionNamedTuplein_manylinuxby @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
Requirementsstring by @henryiii in #953 - A root logger use found by ruff LOG, use
packaginglogger instead by @henryiii in #965 - Better support for subclassing
MarkerandRequirementby @henryiii in #1022 - Normalize all extras, not just if it comes first by @henryiii in #1024
- Don't produce a broken repr if
Markerfails to construct by @henryiii in #1033
Performance:
- Avoid recompiling regexes in the tokenizer for a 3x speedup by @hauntsaninja in #1019
- Improve performance in
_manylinux.pyby @cthoyt in #869 - Minor cleanups to
Versionby @bearomorphism in #913 - Skip redundant creation of
Versions in specifier comparison by @notatallshaw in #986 - Cache
Specifier's Version by @notatallshaw in #985 - Make
Versiona little faster by @henryiii in #987 - Minor
Versionregex cleanup by @henryiii in #990 - Faster regex on Python 3.11.5+ by @henryiii in #988 and #1055
- Lazily calculate
_keyinVersionby @notatallshaw in #989 and regression forpackaging_legacyfixed by @henryiii in #1048 - Faster
canonicalize_versionby @henryiii in #993 - Use
fullmatchin a couple more places by @henryiii in #992 - Use
fullmatchfor markers too by @henryiii in #1029 - Use
mapinstead of generator by @henryiii in #996 - Deprecate
._version(_Version, aNamedTuple) by @henryiii in #995 and #1062 - Avoid duplicate
Versioncreation incanonicalize_versionby @henryiii in #994 - Add
__slots__toVersionby @henryiii in #1001 - Add
__slots__toSpecifiers by @henryiii in #1002 - Add
__slots__toNodes by @henryiii in #1032 - Use
version.__replace__in specifier comparison by @notatallshaw in #999 - Use
_get_spec_versionin more places inSpecifierby @notatallshaw in #1005 - Pull
setconstruction out of function by @henryiii in #1012 - Letter normalization dict for prereleases and the like by @henryiii in #1014
- Avoid normalizing extras again when comparing by @henryiii in #1028
- Speed up
Version.__str__by about 10% by @henryiii in #997 - Increase the performance of
canonicalize_nameby avoiding a regex by @henryiii in #1030, #1047, and #1064 - Faster zero stripping by @henryiii in #1058
Type annotations:
- Fix a type annotation by @brettcannon in #907
- Fix tags return type in
parse_wheel_filenamedocs by @ncoghlan in #973 - Add type hint for
_versionin.version.Versionby @brettcannon in #927 - Changed static type annotations in prereleases setter method in
specifier.pyby @subhajitsaha01 in #930 - Statically type the tests by @henryiii in #982
Internal:
- Test and declare support Python 3.14 by @henryiii in #901
- Modernize and speed up tests on Python 3.14 by @henryiii in #903
- Change our license metadata to use an SPDX license expression by @cdce8p in #881
- No need for
license-filesby @DimitriPapadopoulos in #924 - Update mypy by @hauntsaninja in #891
- Some config updates by @henryiii in #902
- Add spell check and rst check by @henryiii in #904
- Clean up ruff ignores by @henryiii in #905
- Update example for env marker
python_versionby @trim21 in #908 - Move codespell configuration into pyproject.toml by @yarikoptic in #910
- Check warning a little more precisely by @henryiii in #837
- Speed up mypy a little by @henryiii in #836
- Apply ruff/flake8-pyi rules (PYI) by @DimitriPapadopoulos in #835
- Better local runs for codespell by @henryiii in #911
- Remove outdated/confusing Gist link by @stefan6419846 in #921
- Fix docs and docs ci after #897 landed by @notatallshaw in #926
- Run twine-check on push in CI by @EpicWink in #922
ruffwas renamedruff-checkin pre-commit by @henryiii in #933- Fix incorrectly implicitly concatenated string in specifiers test by @notatallshaw in #946
- Simplify conditional by @ofek in #949
- Modernize nox, use dependency-groups for tests by @henryiii in #952
- Add more checks that don't affect anything by @henryiii in #957
- Enable Ruff ISC rule by @henryiii in #959
- Ruff code FLY by @henryiii in #963
- pytest
log_levelis better thanlog_cli_levelby @henryiii in #956 - Ruff code TRY by @henryiii in #961
- Add the ruff PL checks by @henryiii in #964
- Enable Ruff ARG rules by @henryiii in #958
- Ruff PT code (pytest) by @henryiii in #960
- Add ruff DTZ by @henryiii in #968
- Add ruff BLE by @henryiii in #967
- Add the ruff SIM checks by @henryiii in #966
- Adding ruff PERF by @henryiii in #969
- Move some config into coverage config by @henryiii in #971
- Check ruff C4 by @henryiii in #962
- Adding ruff T20 by @henryiii in #972
- Add a tests pass job by @henryiii in https:/...
26.0rc3
What's Changed
Fixes:
Performance:
CI:
- Test on first public release of CPython 3.11 and newer by @henryiii in #1056
- Fix publication job (again) by @henryiii in #1051
- Use
actionlintto check CI workflows by @miketheman in #1052
Documentation:
- Fix formatting of distribution types in metadata.rst by @brettcannon in #1053
Full Changelog: 26.0rc2...26.0rc3
26.0rc2
What's Changed
Fixes:
Performance:
Internal:
- Fix type hint of function used with
contextlib.contextmanagerby @SpecLad in #1046 - Always run tests by @henryiii in #1044
- Fix a changelog number by @henryiii in #1042
- Fix the publish job by @henryiii in #1043
- Get the correct tag on publish by @henryiii in #1045
Full Changelog: 26.0rc1...26.0rc2
26.0rc1
What's Changed
Features:
- PEP 751: support pylock by @sbidoul in #900
- PEP 794: import name metadata by @brettcannon in #948
- Support writing metadata by @henryiii in #846
- Support
__replace__forVersionby @henryiii in #1003 - Support positional pattern matching for
VersionandSpecifierby @henryiii in #1004
Behavior adaptations:
- PEP 440 handling of prereleases for
Specifier.contains,SpecifierSet.contains, andSpecifierSet.filterby @notatallshaw in #897 - Handle PEP 440 edge case in
SpecifierSet.filterby @notatallshaw in #942 - Adjust arbitrary equality intersection preservation in
SpecifierSetby @notatallshaw in #951 - Return
Falseinstead of raising for.containswith invalid version by @Liam-DeVoe in #932 - Support arbitrary equality on arbitrary strings for
SpecifierandSpecifierSet'sfilterandcontainsmethod. by @notatallshaw in #954 - Only try to parse as
Versionon certain marker keys, returnFalseon unequal ordered comparsions by @JP-Ellis in #939
Fixes:
- Update
_hashwhen unpicklingTag()by @dholth in #860 - Correct comment and simplify implicit prerelease handling in
Specifier.prereleasesby @notatallshaw in #896 - Use explicit
_GLibCVersionNamedTuplein_manylinuxby @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
Requirementsstring by @henryiii in #953 - A root logger use found by ruff LOG, use
packaginglogger instead by @henryiii in #965 - Better support for subclassing
MarkerandRequirementby @henryiii in #1022 - Normalize all extras, not just if it comes first by @henryiii in #1024
- Don't produce a broken repr if
Markerfails to construct by @henryiii in #1033
Performance:
- Avoid recompiling regexes in the tokenizer for a 3x speedup by @hauntsaninja in #1019
- Improve performance in
_manylinux.pyby @cthoyt in #869 - Minor cleanups to
Versionby @bearomorphism in #913 - Skip redundant creation of
Versions in specifier comparison by @notatallshaw in #986 - Cache
Specifier's Version by @notatallshaw in #985 - Make
Versiona little faster by @henryiii in #987 - Minor
Versionregex cleanup by @henryiii in #990 - Faster regex on Python 3.11+ by @henryiii in #988
- Lazily calculate
_keyinVersionby @notatallshaw in #989 - Faster
canonicalize_versionby @henryiii in #993 - Use
fullmatchin a couple more places by @henryiii in #992 - Use
fullmatchfor markers too by @henryiii in #1029 - Use
mapinstead of generator by @henryiii in #996 - Drop
._version(_Version, aNamedTuple) by @henryiii in #995 - Avoid duplicate
Versioncreation incanonicalize_versionby @henryiii in #994 - Add
__slots__toVersionby @henryiii in #1001 - Add
__slots__toSpecifiers by @henryiii in #1002 - Add
__slots__toNodes by @henryiii in #1032 - Use
version.__replace__in specifier comparison by @notatallshaw in #999 - Use
_get_spec_versionin more places inSpecifierby @notatallshaw in #1005 - Pull
setconstruction out of function by @henryiii in #1012 - Letter normalization dict for prereleases and the like by @henryiii in #1014
- Avoid normalizing extras again when comparing by @henryiii in #1028
- Speed up
Version.__str__by about 10% by @henryiii in #997 - Double the performance of
canonicalize_nameby avoiding a regex by @henryiii in #1030
Type annotations:
- Fix a type annotation by @brettcannon in #907
- Fix tags return type in
parse_wheel_filenamedocs by @ncoghlan in #973 - Add type hint for
_versionin.version.Versionby @brettcannon in #927 - Changed static type annotations in prereleases setter method in
specifier.pyby @subhajitsaha01 in #930 - Statically type the tests by @henryiii in #982
Internal:
- Test and declare support Python 3.14 by @henryiii in #901
- Modernize and speed up tests on Python 3.14 by @henryiii in #903
- Change our license metadata to use an SPDX license expression by @cdce8p in #881
- No need for
license-filesby @DimitriPapadopoulos in #924 - Update mypy by @hauntsaninja in #891
- Some config updates by @henryiii in #902
- Add spell check and rst check by @henryiii in #904
- Clean up ruff ignores by @henryiii in #905
- Update example for env marker
python_versionby @trim21 in #908 - Move codespell configuration into pyproject.toml by @yarikoptic in #910
- Check warning a little more precisely by @henryiii in #837
- Speed up mypy a little by @henryiii in #836
- Apply ruff/flake8-pyi rules (PYI) by @DimitriPapadopoulos in #835
- Better local runs for codespell by @henryiii in #911
- Remove outdated/confusing Gist link by @stefan6419846 in #921
- Fix docs and docs ci after #897 landed by @notatallshaw in #926
- Run twine-check on push in CI by @EpicWink in #922
ruffwas renamedruff-checkin pre-commit by @henryiii in #933- Fix incorrectly implicitly concatenated string in specifiers test by @notatallshaw in #946
- Simplify conditional by @ofek in #949
- Modernize nox, use dependency-groups for tests by @henryiii in #952
- Add more checks that don't affect anything by @henryiii in #957
- Enable Ruff ISC rule by @henryiii in #959
- Ruff code FLY by @henryiii in #963
- pytest
log_levelis better thanlog_cli_levelby @henryiii in #956 - Ruff code TRY by @henryiii in #961
- Add the ruff PL checks by @henryiii in #964
- Enable Ruff ARG rules by @henryiii in #958
- Ruff PT code (pytest) by @henryiii in #960
- Add ruff DTZ by @henryiii in #968
- Add ruff BLE by @henryiii in #967
- Add the ruff SIM checks by @henryiii in #966
- Adding ruff PERF by @henryiii in #969
- Move some config into coverage config by @henryiii in #971
- Check ruff C4 by @henryiii in #962
- Adding ruff T20 by @henryiii in #972
- Add a tests pass job by @henryiii in #977
- Add ruff TC by @henryiii in #980
- Adding part of ruff RET by @henryiii in #979
- Reorder mypy check by @henryiii in #983
- Enable ruff ALL by @henryiii in #984
- Link back to repo/source in furo by ...
25.0
What's Changed
- Re-add a test for Unicode file name parsing by @Siddhesh-Agarwal in #863
- Upgrade to ruff 0.9.1 by @DimitriPapadopoulos in #865
- Add support for PEP 738 Android tags by @mhsmith in #880
- feat(markers): support 'extras' and 'dependency_groups' markers by @frostming in #888
New Contributors
- @Siddhesh-Agarwal made their first contribution in #863
- @mhsmith made their first contribution in #880
- @frostming made their first contribution in #888
Full Changelog: 24.2...25.0
24.2
What's Changed
- The source is auto-formatted with ruff, not black by @DimitriPapadopoulos in #798
- Bump the github-actions group across 1 directory with 3 updates by @dependabot in #813
- Apply ruff rules (RUF) by @DimitriPapadopoulos in #800
- Fix typo in Version
__str__by @aryanpingle in #817 - Bump the github-actions group with 3 updates by @dependabot in #819
- Get rid of duplicate test cases by @DimitriPapadopoulos in #821
- Fix doc for canonicalize_version and a typo in a docstring by @Laurent-Dx in #801
- docs: public/base_version comparison by @henryiii in #818
- Apply ruff/bugbear rules (B) by @DimitriPapadopoulos in #787
- Apply ruff/pyupgrade rules (UP) by @DimitriPapadopoulos in #786
- Add a changelog entry for dropping Python 3.7 support by @alexwlchan in #824
- Patch python_full_version unconditionally by @jaraco in #825
- Refactor canonicalize_version by @jaraco in #793
- Allow creating a SpecifierSet from a list of specifiers by @pfmoore in #777
- Fix uninformative error message by @abravalheri in #830
- Fix prerelease detection for
>and<by @notatallshaw in #794 - Bump the github-actions group across 1 directory with 4 updates by @dependabot in #839
- Add support for PEP 730 iOS tags. by @freakboy3742 in #832
- Update the changelog to reflect 24.1 changes by @pradyunsg in #840
- Mention updating changelog in release process by @pradyunsg in #841
- Add a comment as to why
Metadata.nameisn't normalized by @brettcannon in #842 - Use !r formatter for error messages with filenames. by @Carreau in #844
- PEP 639: Implement License-Expression and License-File by @ewdurbin in #828
- Bump the github-actions group with 4 updates by @dependabot in #852
- Upgrade to latest mypy by @hauntsaninja in #853
- Extraneous quotes by @ewdurbin in #848
New Contributors
- @aryanpingle made their first contribution in #817
- @Laurent-Dx made their first contribution in #801
- @alexwlchan made their first contribution in #824
- @jaraco made their first contribution in #825
- @notatallshaw made their first contribution in #794
- @freakboy3742 made their first contribution in #832
- @Carreau made their first contribution in #844
- @ewdurbin made their first contribution in #828
Full Changelog: 24.1...24.2
24.1
What's Changed
- pyupgrade/black/isort/flake8 → ruff by @DimitriPapadopoulos in #769
- Add support for Python 3.13 and drop EOL 3.7 by @hugovk in #783
- Bump the github-actions group with 4 updates by @dependabot in #782
- Fix typo in
_parserdocstring by @pradyunsg in #784 - Modernise type annotations using FA rules from ruff by @pradyunsg in #785
- Document
markers.default_environment()by @edgarrmondragon in #753 - Bump the github-actions group with 3 updates by @dependabot in #789
- Work around platform.python_version() returning non PEP 440 compliant version for non-tagged CPython builds by @sbidoul in #802
New Contributors
- @dependabot made their first contribution in #782
- @edgarrmondragon made their first contribution in #753
Full Changelog: 24.0...24.1