diff --git a/news/aa82171b-1578-4128-8db3-9aa72b3a6a84.trivial.rst b/news/aa82171b-1578-4128-8db3-9aa72b3a6a84.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/pip/_internal/metadata/importlib/_compat.py b/src/pip/_internal/metadata/importlib/_compat.py index 593bff23ede..f1893146c40 100644 --- a/src/pip/_internal/metadata/importlib/_compat.py +++ b/src/pip/_internal/metadata/importlib/_compat.py @@ -1,4 +1,5 @@ import importlib.metadata +import os from typing import Any, Optional, Protocol, cast @@ -49,6 +50,13 @@ def get_dist_name(dist: importlib.metadata.Distribution) -> str: The ``name`` attribute is only available in Python 3.10 or later. We are targeting exactly that, but Mypy does not know this. """ + # Try to get the name from the metadata directory name. + # This is much faster than reading metadata. + if info_location := get_info_location(dist): + stem, suffix = os.path.splitext(info_location.name) + if suffix in (".dist-info", ".egg-info"): + return stem.split("-", 1)[0] + name = cast(Any, dist).name if not isinstance(name, str): raise BadMetadata(dist, reason="invalid metadata entry 'name'") diff --git a/src/pip/_internal/metadata/importlib/_dists.py b/src/pip/_internal/metadata/importlib/_dists.py index 8591029f16e..597351b1b98 100644 --- a/src/pip/_internal/metadata/importlib/_dists.py +++ b/src/pip/_internal/metadata/importlib/_dists.py @@ -153,25 +153,20 @@ def installed_location(self) -> Optional[str]: return None return normalize_path(str(self._installed_location)) - def _get_dist_name_from_location(self) -> Optional[str]: - """Try to get the name from the metadata directory name. - - This is much faster than reading metadata. - """ - if self._info_location is None: - return None - stem, suffix = os.path.splitext(self._info_location.name) - if suffix not in (".dist-info", ".egg-info"): - return None - return stem.split("-", 1)[0] - @property def canonical_name(self) -> NormalizedName: - name = self._get_dist_name_from_location() or get_dist_name(self._dist) - return canonicalize_name(name) + return canonicalize_name(get_dist_name(self._dist)) @property def version(self) -> DistributionVersion: + # Try to get the version from the metadata directory name. + # This is much faster than reading metadata. + if self._info_location is not None: + stem, suffix = os.path.splitext(self._info_location.name) + if suffix == ".dist-info": + version = stem.split("-", 1)[1] + return parse_version(version) + return parse_version(self._dist.version) def is_file(self, path: InfoPath) -> bool: diff --git a/tests/data/packages/simplewheel-2.0-1-py2.py3-none-any.whl b/tests/data/packages/simplewheel-2.0-1-py2.py3-none-any.whl index cd34cf8a046..ba852ba2895 100644 Binary files a/tests/data/packages/simplewheel-2.0-1-py2.py3-none-any.whl and b/tests/data/packages/simplewheel-2.0-1-py2.py3-none-any.whl differ diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py index b65212f929c..a91549c3fa6 100644 --- a/tests/functional/test_install.py +++ b/tests/functional/test_install.py @@ -1172,7 +1172,7 @@ def test_install_nonlocal_compatible_wheel( ) assert result.returncode == SUCCESS - distinfo = Path("scratch") / "target" / "simplewheel-2.0-1.dist-info" + distinfo = Path("scratch") / "target" / "simplewheel-2.0.dist-info" result.did_create(distinfo) # Test install without --target diff --git a/tests/functional/test_install_report.py b/tests/functional/test_install_report.py index a1e7f8375d9..a25de64a3d1 100644 --- a/tests/functional/test_install_report.py +++ b/tests/functional/test_install_report.py @@ -39,7 +39,7 @@ def test_install_report_basic( assert url.endswith("/packages/simplewheel-2.0-1-py2.py3-none-any.whl") assert ( simplewheel_report["download_info"]["archive_info"]["hash"] - == "sha256=191d6520d0570b13580bf7642c97ddfbb46dd04da5dd2cf7bef9f32391dfe716" + == "sha256=71e1ca6b16ae3382a698c284013f66504f2581099b2ce4801f60e9536236ceee" )