Skip to content

Commit 62b91df

Browse files
committed
Return abstract metadata type from ireq.get_dist()
1 parent ebd693e commit 62b91df

File tree

5 files changed

+44
-37
lines changed

5 files changed

+44
-37
lines changed

src/pip/_internal/distributions/sdist.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ class SourceDistribution(AbstractDistribution):
1919
"""
2020

2121
def get_metadata_distribution(self) -> BaseDistribution:
22-
from pip._internal.metadata.pkg_resources import Distribution as _Dist
23-
24-
return _Dist(self.req.get_dist())
22+
return self.req.get_dist()
2523

2624
def prepare_distribution_metadata(
2725
self, finder: PackageFinder, build_isolation: bool

src/pip/_internal/metadata/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ def get_environment(paths: Optional[List[str]]) -> BaseEnvironment:
3838
return Environment.from_paths(paths)
3939

4040

41+
def get_directory_distribution(directory: str) -> BaseDistribution:
42+
"""Get the distribution metadata representation in the specified directory.
43+
44+
This returns a Distribution instance from the chosen backend based on
45+
the given on-disk ``.dist-info`` directory.
46+
"""
47+
from .pkg_resources import Distribution
48+
49+
return Distribution.from_directory(directory)
50+
51+
4152
def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution:
4253
"""Get the representation of the specified wheel's distribution metadata.
4354

src/pip/_internal/metadata/pkg_resources.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import email.message
22
import logging
3+
import os
34
import pathlib
45
from typing import Collection, Iterable, Iterator, List, NamedTuple, Optional
56
from zipfile import BadZipFile
@@ -36,6 +37,26 @@ class Distribution(BaseDistribution):
3637
def __init__(self, dist: pkg_resources.Distribution) -> None:
3738
self._dist = dist
3839

40+
@classmethod
41+
def from_directory(cls, directory: str) -> "Distribution":
42+
dist_dir = directory.rstrip(os.sep)
43+
44+
# Build a PathMetadata object, from path to metadata. :wink:
45+
base_dir, dist_dir_name = os.path.split(dist_dir)
46+
metadata = pkg_resources.PathMetadata(base_dir, dist_dir)
47+
48+
# Determine the correct Distribution object type.
49+
if dist_dir.endswith(".egg-info"):
50+
dist_cls = pkg_resources.Distribution
51+
dist_name = os.path.splitext(dist_dir_name)[0]
52+
else:
53+
assert dist_dir.endswith(".dist-info")
54+
dist_cls = pkg_resources.DistInfoDistribution
55+
dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0]
56+
57+
dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata)
58+
return cls(dist)
59+
3960
@classmethod
4061
def from_wheel(cls, wheel: Wheel, name: str) -> "Distribution":
4162
"""Load the distribution from a given wheel.

src/pip/_internal/req/req_install.py

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@
2323
from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment
2424
from pip._internal.exceptions import InstallationError
2525
from pip._internal.locations import get_scheme
26-
from pip._internal.metadata import get_default_environment
26+
from pip._internal.metadata import (
27+
BaseDistribution,
28+
get_default_environment,
29+
get_directory_distribution,
30+
)
2731
from pip._internal.models.link import Link
2832
from pip._internal.operations.build.metadata import generate_metadata
2933
from pip._internal.operations.build.metadata_editable import generate_editable_metadata
@@ -54,7 +58,6 @@
5458
hide_url,
5559
redact_auth_from_url,
5660
)
57-
from pip._internal.utils.packaging import get_metadata
5861
from pip._internal.utils.subprocess import runner_with_spinner_message
5962
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
6063
from pip._internal.utils.virtualenv import running_under_virtualenv
@@ -63,32 +66,6 @@
6366
logger = logging.getLogger(__name__)
6467

6568

66-
def _get_dist(metadata_directory: str) -> Distribution:
67-
"""Return a pkg_resources.Distribution for the provided
68-
metadata directory.
69-
"""
70-
dist_dir = metadata_directory.rstrip(os.sep)
71-
72-
# Build a PathMetadata object, from path to metadata. :wink:
73-
base_dir, dist_dir_name = os.path.split(dist_dir)
74-
metadata = pkg_resources.PathMetadata(base_dir, dist_dir)
75-
76-
# Determine the correct Distribution object type.
77-
if dist_dir.endswith(".egg-info"):
78-
dist_cls = pkg_resources.Distribution
79-
dist_name = os.path.splitext(dist_dir_name)[0]
80-
else:
81-
assert dist_dir.endswith(".dist-info")
82-
dist_cls = pkg_resources.DistInfoDistribution
83-
dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0]
84-
85-
return dist_cls(
86-
base_dir,
87-
project_name=dist_name,
88-
metadata=metadata,
89-
)
90-
91-
9269
class InstallRequirement:
9370
"""
9471
Represents something that may be installed later on, may have information
@@ -578,12 +555,12 @@ def prepare_metadata(self) -> None:
578555
@property
579556
def metadata(self) -> Any:
580557
if not hasattr(self, "_metadata"):
581-
self._metadata = get_metadata(self.get_dist())
558+
self._metadata = self.get_dist().metadata
582559

583560
return self._metadata
584561

585-
def get_dist(self) -> Distribution:
586-
return _get_dist(self.metadata_directory)
562+
def get_dist(self) -> BaseDistribution:
563+
return get_directory_distribution(self.metadata_directory)
587564

588565
def assert_source_matches_version(self) -> None:
589566
assert self.source_dir

tests/unit/test_req.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from unittest import mock
1010

1111
import pytest
12-
from pip._vendor import pkg_resources
1312
from pip._vendor.packaging.markers import Marker
1413
from pip._vendor.packaging.requirements import Requirement
1514

@@ -22,6 +21,7 @@
2221
PreviousBuildDirError,
2322
)
2423
from pip._internal.index.package_finder import PackageFinder
24+
from pip._internal.metadata import BaseDistribution
2525
from pip._internal.network.session import PipSession
2626
from pip._internal.operations.prepare import RequirementPreparer
2727
from pip._internal.req import InstallRequirement, RequirementSet
@@ -451,8 +451,8 @@ def test_get_dist(self, path: str) -> None:
451451
req = install_req_from_line("foo")
452452
req.metadata_directory = path
453453
dist = req.get_dist()
454-
assert isinstance(dist, pkg_resources.Distribution)
455-
assert dist.project_name == "foo"
454+
assert isinstance(dist, BaseDistribution)
455+
assert dist.raw_name == dist.canonical_name == "foo"
456456
assert dist.location == "/path/to".replace("/", os.path.sep)
457457

458458
def test_markers(self) -> None:

0 commit comments

Comments
 (0)