Skip to content

Commit ce6a8d2

Browse files
committed
Create 'localize_dist' function to convert stdlib to local versions of Distributions.
1 parent e0713ce commit ce6a8d2

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

importlib_metadata/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
from ._compat import (
3434
NullFinder,
3535
install,
36+
localize_dist,
3637
)
37-
from ._functools import method_cache, pass_none
38+
from ._functools import apply, method_cache, pass_none
3839
from ._itertools import always_iterable, bucket, unique_everseen
3940
from ._meta import PackageMetadata, SimplePath
4041
from .compat import py39, py311
@@ -409,6 +410,7 @@ def locate_file(self, path: str | os.PathLike[str]) -> SimplePath:
409410
"""
410411

411412
@classmethod
413+
@apply(localize_dist)
412414
def from_name(cls, name: str) -> Distribution:
413415
"""Return the Distribution for the given package name.
414416
@@ -427,6 +429,7 @@ def from_name(cls, name: str) -> Distribution:
427429
raise PackageNotFoundError(name)
428430

429431
@classmethod
432+
@apply(functools.partial(map, localize_dist))
430433
def discover(
431434
cls, *, context: Optional[DistributionFinder.Context] = None, **kwargs
432435
) -> Iterable[Distribution]:

importlib_metadata/_compat.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1+
from __future__ import annotations
2+
3+
import importlib.metadata
14
import platform
25
import sys
6+
import warnings
7+
from typing import cast
8+
9+
import importlib_metadata
10+
311

412
__all__ = ['install', 'NullFinder']
513

@@ -54,3 +62,17 @@ def pypy_partial(val):
5462
"""
5563
is_pypy = platform.python_implementation() == 'PyPy'
5664
return val + is_pypy
65+
66+
67+
def localize_dist(
68+
dist: importlib_metadata.Distribution | importlib.metadata.Distribution,
69+
) -> importlib_metadata.Distribution:
70+
"""
71+
Ensure dist is an :class:`importlib_metadata.Distribution`.
72+
"""
73+
if isinstance(dist, importlib_metadata.Distribution):
74+
return dist
75+
if isinstance(dist, importlib.metadata.PathDistribution):
76+
return importlib_metadata.PathDistribution(dist._path)
77+
warnings.warn(f"Unrecognized distribution subclass {dist.__class__}")
78+
return cast(importlib_metadata.Distribution, dist)

0 commit comments

Comments
 (0)