NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #78 most downloaded on PyPI
Read metadata from Python packages
Last release 1 months ago
28 Aug 2026
Release timing varies
gaps range from 2 weeks to 8 months
Nearly every release is documented
notes for 58 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
8 years old
130 releases · first in 2018
Marked the other parameter of SimplePath.joinpath and SimplePath.__truediv__ positional-only, so pathlib.Path satisfies the protocol under type checke
Marked the other parameter of SimplePath.joinpath and SimplePath.__truediv__ positional-only, so pathlib.Path satisfies the protocol under type checkers that compare parameter names. (#542)
Added MetadataNotFound (subclass of FileNotFoundError) and updated Distribution.metadata/metadata() to raise it when the metadata files are missing in
Added MetadataNotFound (subclass of FileNotFoundError) and updated Distribution.metadata/metadata() to raise it when the metadata files are missing instead of returning None (python/cpython#143387). (#532)
One column per quarter.
Ported changes from CPython (python/cpython#110937, python/cpython#140141, python/cpython#143658)
Ported changes from CPython (python/cpython#110937, python/cpython#140141, python/cpython#143658)
Removed Python 3.9 compatibility.
Removed Python 3.9 compatibility.
Fixed errors in FastPath under fork-multiprocessing.
Fixed errors in FastPath under fork-multiprocessing. (#520)
Removed cruft from Python 3.8. (#524)
.metadata() (and Distribution.metadata) can now return None if the metadata directory exists but not metadata file is present.
.metadata() (and Distribution.metadata) can now return None if the metadata directory exists but not metadata file is present. (#493)
Raise consistent ValueError for invalid EntryPoint.value (#518)
Fixed indentation logic to also honor blank lines.
Fixed indentation logic to also honor blank lines.
Add support for rendering metadata where some fields have newlines (python/cpython#119650).
Add support for rendering metadata where some fields have newlines (python/cpython#119650).
Deferred import of zipfile.Path
Deferred import of zipfile.Path (#502)
Deferred import of json (#503)
Rely on zipp overlay for zipfile.Path.
Deferred import of inspect for import performance.
Deferred import of inspect for import performance. (#499)
Disallow passing of 'dist' to EntryPoints.select.
Disallow passing of 'dist' to EntryPoints.select.
Add SimplePath to importlib_metadata.__all__.
Add SimplePath to importlib_metadata.__all__. (#494)
Prioritize valid dists to invalid dists when retrieving by name.
Prioritize valid dists to invalid dists when retrieving by name. (#489)
Removed deprecated support for Distribution subclasses not implementing abstract methods.
Message.__getitem__ now raises a KeyError on missing keys. (#371)
Removed deprecated support for Distribution subclasses not implementing abstract methods.
When reading installed files from an egg, use relative_to(walk_up=True) to honor files installed outside of the installation root.
When reading installed files from an egg, use relative_to(walk_up=True) to honor files installed outside of the installation root. (#455)
Deferred select imports in for speedup (python/cpython#109829).
Deferred select imports in for speedup (python/cpython#109829).
Updated fixtures for python/cpython#120801.
Improve import time (python/cpython#114664).
Improve import time (python/cpython#114664).
Make MetadataPathFinder.find_distributions a classmethod for consistency with CPython. Closes #484. (#484)
Allow MetadataPathFinder.invalidate_caches to be called as a classmethod.
No significant changes.
No significant changes.
Corrected the interface for SimplePath to encompass the expectations of locate_file and PackagePath.
Corrected the interface for SimplePath to encompass the expectations of locate_file and PackagePath.
Fixed type annotations to allow strings.
Removed EntryPoint access by numeric index (tuple behavior).
Removed EntryPoint access by numeric index (tuple behavior).
Added Distribution.origin supplying the direct_url.json in a SimpleNamespace.
Added Distribution.origin supplying the direct_url.json in a SimpleNamespace. (#404)
Features -------- - Added diagnose script.
Added diagnose script. (#461)
Features -------- - Added EntryPoints.__repr__
Added EntryPoints.__repr__ (#473)
Features -------- - Require Python 3.8 or later.
Require Python 3.8 or later.
* #453: When inferring top-level names that are importable for distributions in package_distributions, now symlinks to other directories are honored.
#453: When inferring top-level names that are importable for distributions in package_distributions, now symlinks to other directories are honored.
* #449: Expanded type annotations.
#449: Expanded type annotations.
python/cpython#103661: Removed excess error suppression in _read_files_egginfo_installed and fixed path handling on Windows.
python/cpython#103661: Removed excess error suppression in _read_files_egginfo_installed and fixed path handling on Windows.
* #422: Removed ABC metaclass from Distribution and instead deprecated construction of Distribution objects without concrete methods.
#422: Removed ABC metaclass from Distribution and instead deprecated construction of Distribution objects without concrete methods.
Updated docs with tweaks from upstream CPython.
Updated docs with tweaks from upstream CPython.
Consolidated some behaviors in tests around _path.
Consolidated some behaviors in tests around _path.
Added type annotation for Distribution.read_text.
* #115: Support installed-files.txt for Distribution.files when present.
#115: Support installed-files.txt for Distribution.files when present.
* #442: Fixed issue introduced in v6.1.0 where non-importable names (metadata dirs) began appearing in packages_distributions.
#442: Fixed issue introduced in v6.1.0 where non-importable names (metadata dirs) began appearing in packages_distributions.
* #384: PackageMetadata now stipulates an additional get method allowing for easy querying of metadata keys that may not be present.
#384: PackageMetadata now stipulates an additional get method allowing for easy querying of metadata keys that may not be present.
* #428: packages_distributions now honors packages and modules with Python modules that not .py sources (e.g. .pyc, .so).
#428: packages_distributions now honors packages and modules with Python modules that not .py sources (e.g. .pyc, .so).
* #434: Expand protocol for PackageMetadata.get_all to match the upstream implementation of email.message.Message.get_all in python/typeshed#9620.
#434: Expand protocol for PackageMetadata.get_all to match the upstream implementation of email.message.Message.get_all in python/typeshed#9620.
Please comment in the issue if this change breaks any projects. This change will likely be rolled back if it causes significant disruption.
#419: Declared Distribution as an abstract class, enforcing definition of abstract methods in instantiated subclasses. It's no longer possible to instantiate a Distribution or any subclasses unless they define the abstract methods.
Please comment in the issue if this change breaks any projects. This change will likely be rolled back if it causes significant disruption.
* #371: Deprecated expectation that PackageMetadata.__getitem__ will return None for missing keys. In the future, it will raise a KeyError.
#371: Deprecated expectation that PackageMetadata.__getitem__ will return None for missing keys. In the future, it will raise a KeyError.
* #415: Instrument SimplePath with generic support.
#415: Instrument SimplePath with generic support.
* #97, #284, #300: Removed compatibility shims for deprecated entry point interfaces.
#97, #284, #300: Removed compatibility shims for deprecated entry point interfaces.
* #396: Added compatibility for PathDistributions originating from Python 3.8 and 3.9.
#396: Added compatibility for PathDistributions originating from Python 3.8 and 3.9.
py-93259: Now raise ValueError when None or an empty string are passed to Distribution.from_name (and other callers).
py-93259: Now raise ValueError when None or an empty string are passed to Distribution.from_name (and other callers).
Note (#459): This change had a backward-incompatible effect for any installers that created metadata in the filesystem with dashes in the package name
#379: In PathDistribution._name_from_stem, avoid including parts of the extension in the result.
#381: In PathDistribution._normalized_name, ensure names loaded from the stem of the filename are also normalized, ensuring duplicate entry points by packages varying only by non-normalized name are hidden.
Note (#459): This change had a backward-incompatible effect for any installers that created metadata in the filesystem with dashes in the package names (not replaced by underscores).
* #372: Removed cast of path items in FastPath, not needed.
#372: Removed cast of path items in FastPath, not needed.
* #369: Fixed bug where EntryPoint.extras was returning match objects and not the extras strings.
#369: Fixed bug where EntryPoint.extras was returning match objects and not the extras strings.
* #367: In Distribution.requires for egg-info, if requires.txt is empty, return an empty list.
#367: In Distribution.requires for egg-info, if requires.txt is empty, return an empty list.
bpo-46246: Added __slots__ to EntryPoints.
bpo-46246: Added __slots__ to EntryPoints.
Nothing published for this version
* #354: Removed Distribution._local factory. This functionality was created as a demonstration of the possible implementation. Now, the pep517 _ packa
#354: Removed Distribution._local factory. This functionality was created as a demonstration of the possible implementation. Now, the pep517 package provides this functionality directly through pep517.meta.load.
* Require Python 3.7 or later.
Require Python 3.7 or later.
* #357: Fixed requirement generation from egg-info when a URL requirement is given.
#357: Fixed requirement generation from egg-info when a URL requirement is given.
Nothing published for this version
ep[:] -> ep.name, ep.value, ep.group
#348: Restored support for EntryPoint access by item, deprecating support in the process. Users are advised to use direct member access instead of item-based access:
- ep[0] -> ep.name - ep[1] -> ep.value - ep[2] -> ep.group - ep[:] -> ep.name, ep.value, ep.group
* #337: Rewrote EntryPoint as a simple class, still immutable and still with the attributes, but without any expectation for namedtuple functionality
#337: Rewrote EntryPoint as a simple class, still immutable and still with the attributes, but without any expectation for namedtuple functionality such as _asdict.
* #344: Fixed regression in packages_distributions when neither top-level.txt nor a files manifest is present.
#344: Fixed regression in packages_distributions when neither top-level.txt nor a files manifest is present.
* #330: In packages_distributions, now infer top-level names from .files() when a top-level.txt (Setuptools-specific metadata) is not present.
#330: In packages_distributions, now infer top-level names from .files() when a top-level.txt (Setuptools-specific metadata) is not present.
* #334: Correct SimplePath protocol to match pathlib protocol for __truediv__.
#334: Correct SimplePath protocol to match pathlib protocol for __truediv__.
Moved workaround for #327 to _compat module.
Moved workaround for #327 to _compat module.
bpo-44784: Avoid errors in test suite when DeprecationWarnings are treated as errors.
bpo-44784: Avoid errors in test suite when DeprecationWarnings are treated as errors.
* #327: Deprecation warnings now honor call stack variance on PyPy.
#327: Deprecation warnings now honor call stack variance on PyPy.
* #326: Performance tests now rely on pytest-perf _. To disable these tests, which require network access and a git checkout, pass -p no:perf to pytes
#326: Performance tests now rely on pytest-perf. To disable these tests, which require network access and a git checkout, pass -p no:perf to pytest.
Your coding agent can read these notes before it upgrades. Set up the MCP server →