Marker.evaluatewill now assume evaluation environment with empty
extra. Evaluating markers like
"extra == 'xyz'"without passing any extra in the
environmentwill no longer raise an exception.
Remove dependency on
pyparsing, by replacing it with a hand-written parser. This package now has no runtime dependencies (#468)
21.3 - 2021-11-17#
21.2 - 2021-10-29#
Update documentation entry for 21.1.
21.1 - 2021-10-29#
Update pin to pyparsing to exclude 3.0.0.
21.0 - 2021-07-03#
PEP 656: musllinux support (#411)
Drop support for Python 2.7, Python 3.4 and Python 3.5.
Replace distutils usage with sysconfig (#396)
Add support for zip files in
_hashattribute to short-circuit tag equality comparisons (#417)
Specify the default value for the
Proper keyword-only “warn” argument in packaging.tags (#403)
Correctly remove prerelease suffixes from ~= check (#366)
Fix type hints for
Use typing alias
Improve type inference for
Tighten the return type of
20.9 - 2021-01-29#
20.8 - 2020-12-11#
20.7 - 2020-11-28#
No unreleased changes.
20.6 - 2020-11-28#
This release was subsequently yanked, and these changes were included in 20.7.
20.5 - 2020-11-27#
20.4 - 2020-05-19#
Canonicalize version before comparing specifiers. (#282)
Change type hint for
packaging.utils.NormalizedName. This enables the use of static typing tools (like mypy) to detect mixing of normalized and un-normalized names.
20.3 - 2020-03-05#
Fix changelog for 20.2.
20.2 - 2020-03-05#
Fix a bug that caused a 32-bit OS that runs on a 64-bit ARM CPU (e.g. ARM-v8, aarch64), to report the wrong bitness.
20.1 - 2020-01-24#
Fix a bug caused by reuse of an exhausted iterator. (#257)
20.0 - 2020-01-06#
Add type hints (#191)
Add proper trove classifiers for PyPy support (#198)
Scale back depending on
ctypesfor manylinux support detection (#171)
sys.implementation.namewhere appropriate for
Expand upon the API provided by
Officially support Python 3.8 (#232)
packaginghas being fully typed by adding a py.typed file (#226)
19.2 - 2019-09-18#
19.1 - 2019-07-30#
19.0 - 2019-01-20#
Fix string representation of PEP 508 direct URL requirements with markers.
Better handling of file URLs
This allows for using
file:///absolute/path, which was previously prevented due to the missing
This allows for all file URLs that
urlunparseturns back into the original URL to be valid.
18.0 - 2018-09-26#
Improve error messages when invalid requirements are given. (#129)
17.1 - 2017-02-28#
utils.canonicalize_versionwhen supplying non PEP 440 versions.
17.0 - 2017-02-28#
Drop support for python 2.6, 3.2, and 3.3.
Define minimal pyparsing version to 2.0.2 (#91).
LegacyVersion().is_devreleaseto make it easy to determine if a release is a development release.
utils.canonicalize_versionto canonicalize version strings or
16.8 - 2016-10-29#
Fix markers that utilize
inso that they render correctly.
Fix an erroneous test on Python RC releases.
16.7 - 2016-04-23#
Add support for the deprecated
python_implementationmarker which was an undocumented setuptools marker in addition to the newer markers.
16.6 - 2016-03-29#
Add support for the deprecated, PEP 345 environment markers in addition to the newer markers.
16.5 - 2016-02-26#
Fix a regression in parsing requirements with whitespaces between the comma separators.
16.4 - 2016-02-22#
Fix a regression in parsing requirements like
16.3 - 2016-02-21#
Fix a bug where
packaging.requirements:Requirementwas overly strict when matching legacy requirements.
16.2 - 2016-02-09#
Add a function that implements the name canonicalization from PEP 503.
16.1 - 2016-02-07#
Implement requirement specifiers from PEP 508.
16.0 - 2016-01-19#
Relicense so that packaging is available under either the Apache License, Version 2.0 or a 2 Clause BSD license.
Support installation of packaging when only distutils is available.
==comparison when there is a prefix and a local version in play. (#41).
Implement environment markers from PEP 508.
15.3 - 2015-08-01#
Normalize post-release spellings for rev/r prefixes. #35
15.2 - 2015-05-13#
Fix an error where the arbitrary specifier (
===) was not correctly allowing pre-releases when it was being used.
Expose the specifier and version parts through properties on the
Allow iterating over the
SpecifierSetto get access to all of the
Allow testing if a version is contained within a specifier via the
15.1 - 2015-04-13#
Fix a logic error that was causing inconsistent answers about whether or not a pre-release was contained within a
15.0 - 2015-01-02#
LegacyVersion().is_postreleaseto make it easy to determine if a release is a post release.
LegacyVersion().base_versionto make it easy to get the public version without any pre or post release markers.
Support the update to PEP 440 which removed the implied
!=V.*when using either
<Vand which instead special cased the handling of pre-releases, post-releases, and local versions when using
14.5 - 2014-12-17#
Normalize release candidates as
VERSION_PATTERNconstant, a regular expression matching a valid version.
14.4 - 2014-12-15#
Ensure that versions are normalized before comparison when used in a specifier with a less than (
<) or greater than (
14.3 - 2014-11-19#
BACKWARDS INCOMPATIBLE Refactor specifier support so that it can sanely handle legacy specifiers as well as PEP 440 specifiers.
BACKWARDS INCOMPATIBLE Move the specifier support out of
14.2 - 2014-09-10#
Add prerelease support to
Remove the ability to do
item in Specifier()and replace it with
Specifier().contains(item)in order to allow flags that signal if a prerelease should be accepted or not.
Add a method
Specifier().filter()which will take an iterable and returns an iterable with items that do not match the specifier filtered out.
14.1 - 2014-09-08#
Versionto be sorted together.
packaging.version.parse()to enable easily parsing a version string as either a
LegacyVersiondepending on it’s PEP 440 validity.
14.0 - 2014-09-05#