27 Apr 2025
.metadata() (andDistribution.metadata) can now returnNone if the metadata directory exists but not metadata file is present. (#493)
Raise consistent ValueError for invalid EntryPoint.value (#518)
20 Jan 2025
Fixed indentation logic to also honor blank lines.
20 Jan 2025
Add support for rendering metadata where some fields have newlines (python/cpython#119650).
11 Sep 2024
20 Aug 2024
Deferred import of inspect for import performance. (#499)
19 Aug 2024
Disallow passing of ‘dist’ to EntryPoints.select.
24 Jul 2024
Add SimplePath to importlib_metadata.__all__. (#494)
23 Jul 2024
Prioritize valid dists to invalid dists when retrieving by name. (#489)
23 Jun 2024
Message.__getitem__ now raises a KeyError on missing keys. (#371)
Removed deprecated support for Distribution subclasses not implementing abstract methods.
23 Jun 2024
When reading installed files from an egg, userelative_to(walk_up=True) to honor files installed outside of the installation root. (#455)
20 Jun 2024
Deferred select imports in for speedup (python/cpython#109829).
Updated fixtures forpython/cpython#120801.
20 Mar 2024
Improve import time (python/cpython#114664).
07 Mar 2024
No significant changes.
22 Dec 2023
Corrected the interface for SimplePath to encompass the expectations of locate_file and PackagePath.
Fixed type annotations to allow strings.
03 Dec 2023
Removed EntryPoint access by numeric index (tuple behavior).
03 Dec 2023
AddedDistribution.origin supplying thedirect_url.json in aSimpleNamespace. (#404)
01 Dec 2023
Added diagnose script. (#461)
01 Dec 2023
Added EntryPoints.__repr__ (#473)
07 Jul 2023
Require Python 3.8 or later.
18 Jun 2023
#453: When inferring top-level names that are importable fordistributions inpackage_distributions, now symlinks toother directories are honored.
22 Apr 2023
#449: Expanded type annotations.
21 Apr 2023
python/cpython#103661: Removed excess error suppression in_read_files_egginfo_installed and fixed path handlingon Windows.
18 Apr 2023
#422: Removed ABC metaclass fromDistribution and insteaddeprecated construction ofDistribution objects withoutconcrete methods.
15 Apr 2023
Updated docs with tweaks from upstream CPython.
15 Apr 2023
Consolidated some behaviors in tests around_path.
Added type annotation forDistribution.read_text.
09 Apr 2023
#115: Supportinstalled-files.txt forDistribution.fileswhen present.
09 Apr 2023
#442: Fixed issue introduced in v6.1.0 where non-importablenames (metadata dirs) began appearing inpackages_distributions.
07 Apr 2023
#384:PackageMetadata now stipulates an additionalgetmethod allowing for easy querying of metadata keys that may notbe present.
18 Mar 2023
#428:packages_distributions now honors packages and moduleswith Python modules that not.py sources (e.g..pyc,.so).
18 Mar 2023
#434: Expand protocol forPackageMetadata.get_all to matchthe upstream implementation ofemail.message.Message.get_allin python/typeshed#9620.
01 Jan 2023
#419: DeclaredDistribution as an abstract class, enforcingdefinition of abstract methods in instantiated subclasses. It’s nolonger possible to instantiate aDistribution or any subclassesunless 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 significantdisruption.
18 Dec 2022
#371: Deprecated expectation thatPackageMetadata.__getitem__will returnNone for missing keys. In the future, it will raise aKeyError.
24 Nov 2022
#415: InstrumentSimplePath with generic support.
01 Oct 2022
01 Oct 2022
#396: Added compatibility forPathDistributions originatingfrom Python 3.8 and 3.9.
25 Jun 2022
py-93259: Now raiseValueError whenNone or an emptystring are passed toDistribution.from_name (and othercallers).
21 May 2022
#379: InPathDistribution._name_from_stem, avoid includingparts of the extension in the result.
#381: InPathDistribution._normalized_name, ensure namesloaded from the stem of the filename are also normalized, ensuringduplicate entry points by packages varying only by non-normalizedname are hidden.
Note (#459): This change had a backward-incompatible effect forany installers that created metadata in the filesystem with dashesin the package names (not replaced by underscores).
13 Mar 2022
#372: Removed cast of path items in FastPath, not needed.
26 Feb 2022
#369: Fixed bug whereEntryPoint.extras was returningmatch objects and not the extras strings.
14 Feb 2022
#367: InDistribution.requires for egg-info, ifrequires.txtis empty, return an empty list.
10 Feb 2022
bpo-46246: Added__slots__ toEntryPoints.
16 Jan 2022
16 Jan 2022
#361: Avoid potential REDoS inEntryPoint.pattern.
19 Dec 2021
#354: RemovedDistribution._local factory. Thisfunctionality was created as a demonstration of thepossible implementation. Now, thepep517 packageprovides this functionality directly throughpep517.meta.load.
16 Dec 2021
Require Python 3.7 or later.
16 Dec 2021
#357: Fixed requirement generation from egg-info when aURL requirement is given.
08 Nov 2021
08 Nov 2021
#353: Fixed discovery of distributions when path is empty.
29 Aug 2021
#348: Restored support forEntryPoint access by item,deprecating support in the process. Users are advisedto 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
28 Aug 2021
#337: RewroteEntryPoint as a simple class, stillimmutable and still with the attributes, but without anyexpectation fornamedtuple functionality such as_asdict.
26 Aug 2021
#344: Fixed regression inpackages_distributions whenneither top-level.txt nor a files manifest is present.
25 Aug 2021
#330: Inpackages_distributions, now infer top-levelnames from.files() when atop-level.txt(Setuptools-specific metadata) is not present.
13 Aug 2021
#334: CorrectSimplePath protocol to matchpathlibprotocol for__truediv__.
31 Jul 2021
Moved workaround for#327 to_compat module.
30 Jul 2021
bpo-44784: Avoid errors in test suite whenDeprecationWarnings are treated as errors.
04 Jul 2021
#327: Deprecation warnings now honor call stack varianceon PyPy.
27 Jun 2021
#326: Performance tests now rely onpytest-perf.To disable these tests, which require network accessand a git checkout, pass-pno:perf to pytest.
03 Jun 2021
#319: RemoveSelectableGroups deprecation exceptionfor flake8.
31 May 2021
#300: Restore compatibility in the result fromDistribution.entry_points (EntryPoints) to honorexpectations in older implementations and issuingdeprecation warnings for these cases:
EntryPoints objects are once again mutable, allowingforsort() and other list-based mutation operations.Avoid deprecation warnings by casting to amutable sequence (e.g.list(dist.entry_points).sort()).
EntryPoints results once again allowfor access by index. To avoid deprecation warnings,cast the result to a Sequence first(e.g.tuple(dist.entry_points)[0]).
28 May 2021
#320: Fix issue where normalized name for eggs wasincorrectly solicited, leading to metadata beingunavailable for eggs.
27 May 2021
#317: De-duplication of distributions no longer requiresloading the full metadata forPathDistribution objects,entry point loading performance by ~10x.
26 May 2021
Prefer f-strings to.format calls.
26 May 2021
20 Apr 2021
#306: Clearer guidance about compatibility in readme.
18 Apr 2021
#304:PackageMetadata as returned bymetadata()andDistribution.metadata() now provides normalizedmetadata honoringPEP 566:
If a long description is provided in the payload of theRFC 822 value, it can be retrieved as theDescriptionfield.
Any multi-line values in the metadata will be returned assuch.
For any multi-line values, line continuation charactersare removed. This backward-incompatible change meansthat any projects relying on the RFC 822 line continuationcharacters being present must be tolerant to them havingbeen removed.
Add ajson property that provides the metadataconverted to a JSON-compatible form perPEP 566.
12 Apr 2021
Minor tweaks from CPython.
29 Mar 2021
#295: Internal refactoring to unify section parsing logic.
29 Mar 2021
28 Mar 2021
Use of Mapping (dict) interfaces onSelectableGroupsis now flagged as deprecated. Instead, users are advisedto use the select interface for future compatibility.
Suppress the warning with this filter:ignore:SelectableGroupsdictinterface.
Or with this invocation in the Python environment:warnings.filterwarnings('ignore','SelectableGroupsdictinterface').
Preferably, switch to theselect interface introducedin 3.7.0. See theentry points documentation and changelog for the 3.6release below for more detail.
For some use-cases, especially those that rely onimportlib.metadata in Python 3.8 and 3.9 orthose relying on olderimportlib_metadata (especiallyon Python 3.5 and earlier),backports.entry_points_selectablewas created to ease the transition. Please have a lookat that project if simply relying on importlib_metadata 3.6+is not straightforward. Background in#298.
#283: Entry point parsing no longer relies on ConfigParserand instead uses a custom, one-pass parser to load theconfig, resulting in a ~20% performance improvement whenloading entry points.
28 Mar 2021
#293: Re-enabled lazy evaluation of path lookup througha FreezableDefaultDict.
27 Mar 2021
#293: Workaround for error in distribution search.
26 Mar 2021
#290: Add mtime-based caching forFastPath and itslookups, dramatically increasing performance for repeateddistribution lookups.
14 Mar 2021
Docs enhancements and cleanup following review inGH-24782.
07 Mar 2021
Cleaned up cruft in entry_points docstring.
07 Mar 2021
Internal refactoring to facilitateentry_points()->dictdeprecation.
24 Feb 2021
#131: Addedpackages_distributions to convenientlyresolve a top-level package or module to its distribution(s).
23 Feb 2021
#284: Introduces newEntryPoints object, a tuple ofEntryPoint objects but with convenience properties forselecting and inspecting the results:
.select() acceptsgroup orname keywordparameters and returns a newEntryPoints tuplewith only those that match the selection.
.groups property presents all of the group names.
.names property presents the names of the entry points.
Item access (e.g.eps[name]) retrieves a singleentry point by name.
entry_points now accepts “selection parameters”,same asEntryPoint.select().
entry_points() now provides a future-compatibleSelectableGroups object that supplies the above interface(except item access) but remains a dict for compatibility.
In the future,entry_points() will return anEntryPoints object for all entry points.
If passing selection parameters toentry_points, thefuture behavior is invoked and anEntryPoints is theresult.
#284: Construction of entry points usingdict([EntryPoint,...]) is now deprecated and raisesan appropriate DeprecationWarning and will be removed ina future version.
#300:Distribution.entry_points now presents as anEntryPoints object and access by index is no longerallowed. If access by index is required, cast to a sequencefirst.
21 Feb 2021
#280:entry_points now only returns entry points forunique distributions (by name).
10 Jan 2021
13 Dec 2020
#265:EntryPoint objects now expose a.dist objectreferencing theDistribution when constructed from aDistribution.
13 Dec 2020
The object returned bymetadata() now has aformally-defined protocol calledPackageMetadatawith declared support for the.get_all() method.Fixes#126.
01 Dec 2020
01 Dec 2020
#261: Restored compatibility for package discovery formetadata without version in the name and for legacyeggs.
23 Nov 2020
Merge with 2.1.0.
23 Nov 2020
#253: When querying for package metadata, the lookupnow honorspackage normalization rules.
22 Nov 2020
Require Python 3.6 or later.
26 Jun 2020
importlib_metadata no longer presents a__version__ attribute. Consumers wishing toresolve the version of the package should query itdirectly withimportlib_metadata.version('importlib-metadata').Closes#71.
14 Jun 2020
PathNotFoundError now has a custom__str__mentioning “package metadata” being missing to helpguide users to the cause when the package is installedbut no metadata is present. Closes#124.
05 Jun 2020
AddedDistribution._local() as a provisionaldemonstration of how to load metadata for a localpackage. Implicitly requires thatpep517 isinstalled. Ref#42.
Ensure inputs to FastPath are Unicode. Closes#121.
Tests now rely onimportlib.resources.files (andbackport) instead of the olderpath function.
Support any iterable fromfind_distributions.Closes#122.
27 Mar 2020
Addedmodule andattr attributes toEntryPoint
26 Mar 2020
Fix redundant entries fromFastPath.zip_children.Closes#117.
25 Mar 2020
Improve reliability and consistency of compatibilityimports for contextlib and pathlib when running tests.Closes#116.
29 Jan 2020
Additional performance optimizations in FastPath nowsaves an additional 20% on a typical call.
Correct for issue where PyOxidizer finder has no__module__ attribute. Closes#110.
10 Jan 2020
10 Dec 2019
Improve custom finders documentation. Closes#105.
04 Dec 2019
Once again, drop support for Python 3.4. Ref#104.
04 Dec 2019
Restored support for Python 3.4 due to improper versioncompatibility declarations in the v1.1.0 and v1.1.1releases. Closes#104.
04 Dec 2019
Repaired project metadata to correctly declare thepython_requires directive. Closes#103.
04 Dec 2019
Fixedrepr(EntryPoint) on PyPy 3 also. Closes#102.
01 Dec 2019
30 Nov 2019
Project adopts semver for versioning.
Removed compatibility shim introduced in 0.23.
For better compatibility with the stdlib implementation and toavoid the same distributions being discovered by the stdlib andbackport implementations, the backport now disables thestdlib DistributionFinder during initialization (import time).Closes#91 and closes#100.
16 Sep 2019
Added a compatibility shim to prevent failures on beta releasesof Python before the signature changed to accept the“context” parameter on find_distributions. This workaroundwill have a limited lifespan, not to extend beyond release ofPython 3.8 final.
11 Sep 2019
Renamedpackage parameter todistribution_nameasrecommendedin the following functions:distribution,metadata,version,files, andrequires. Thisbackward-incompatible change is expected to have little impactas these functions are assumed to be primarily used withpositional parameters.
10 Sep 2019
importlib.metadata now exposes theDistributionFindermetaclass and references it in the docs for extending thesearch algorithm.
AddDistribution.at for constructing a Distribution objectfrom a known metadata directory on the file system. Closes#80.
Distribution finders now receive a context object thatsupplies.path and.name properties. This changeintroduces a fundamental backward incompatibility forany projects implementing afind_distributions methodon aMetaPathFinder. This new layer of abstractionallows this context to be supplied directly or constructedon demand and opens the opportunity for afind_distributions method to solicit additionalcontext from the caller. Closes#85.
02 Sep 2019
28 Jul 2019
Restrain over-eager egg metadata resolution.
Add support for entry points with colons in the name. Closes#75.
09 Jun 2019
29 May 2019
Fix a permission problem in the tests on Windows.
29 May 2019
Don’t crash if there exists an EGG-INFO directory on sys.path.
24 May 2019
Fix documentation.
24 May 2019
Removedlocal_distribution function from the API.This backward-incompatible change removes thisbehavior summarily. Projects should remove theirreliance on this behavior. A replacement behavior isunder review in thepep517 project. Closes#42.
18 May 2019
14 May 2019
Add support for eggs. !65; Closes#19.
09 May 2019
07 May 2019
25 Mar 2019
01 Jan 2019
This library can now discover/enumerate all installed packages.Thisbackward-incompatible change alters the protocol finders mustimplement to support distribution package discovery. Closes#24.
The signature offind_distributions() on custom installer findersshould now accept two parameters,name andpath andthese parameters must supply defaults.
Theentry_points() method no longer accepts a package namebut instead returns all entry points in a dictionary keyed by theEntryPoint.group. Theresolve method has been removed. Instead,callEntryPoint.load(), which has the same semantics aspkg_resources andentrypoints.This is a backward incompatiblechange.
Metadata is now always returned as Unicode text regardless ofPython version. Closes#29.
This library can now discover metadata for a ‘local’ package (foundin the current-working directory). Closes#27.
Addedfiles() function for resolving files from a distribution.
Added a newrequires() function, which returns the requirementsfor a package suitable for parsing bypackaging.requirements.Requirement. Closes#18.
The top-levelread_text() function has been removed. UsePackagePath.read_text() on instances returned by thefiles()function.This is a backward incompatible change.
Release dates are now automatically injected into the changelogbased on SCM tags.
27 Nov 2018
07 Oct 2018
Removedimportlib_metadata.distribution function. Nowthe public interface is primarily the utility functions exposedinimportlib_metadata.__all__. Closes#14.
Added two new utility functionsread_text andmetadata.
18 Sep 2018
Updated README and removed details about Distributionclass, now considered private. Closes#15.
Added test suite support for Python 3.4+.
Fixed SyntaxErrors on Python 3.4 and 3.5. !12
Fixed errors on Windows joining Path elements. !15
14 Sep 2018
Housekeeping.
14 Sep 2018
11 Sep 2018
09 Sep 2018
Initial release.