Skip to content

Commit 8365bc3

Browse files
authored
Merge pull request #9560 from uranusjr/refactor-get-installed-version-to-metadata
Remove get_installed_version() for Environment equivalent
2 parents 751cbb7 + 383934e commit 8365bc3

File tree

7 files changed

+46
-75
lines changed

7 files changed

+46
-75
lines changed

src/pip/_internal/commands/install.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from optparse import SUPPRESS_HELP
88
from typing import TYPE_CHECKING
99

10-
from pip._vendor import pkg_resources
1110
from pip._vendor.packaging.utils import canonicalize_name
1211

1312
from pip._internal.cache import WheelCache
@@ -17,14 +16,14 @@
1716
from pip._internal.cli.status_codes import ERROR, SUCCESS
1817
from pip._internal.exceptions import CommandError, InstallationError
1918
from pip._internal.locations import distutils_scheme
19+
from pip._internal.metadata import get_environment
2020
from pip._internal.operations.check import check_install_conflicts
2121
from pip._internal.req import install_given_reqs
2222
from pip._internal.req.req_tracker import get_requirement_tracker
2323
from pip._internal.utils.distutils_args import parse_distutils_args
2424
from pip._internal.utils.filesystem import test_writable_dir
2525
from pip._internal.utils.misc import (
2626
ensure_dir,
27-
get_installed_version,
2827
get_pip_version,
2928
protect_pip_from_modification_on_windows,
3029
write_output,
@@ -407,18 +406,16 @@ def run(self, options, args):
407406
prefix=options.prefix_path,
408407
isolated=options.isolated_mode,
409408
)
410-
working_set = pkg_resources.WorkingSet(lib_locations)
409+
env = get_environment(lib_locations)
411410

412411
installed.sort(key=operator.attrgetter('name'))
413412
items = []
414413
for result in installed:
415414
item = result.name
416415
try:
417-
installed_version = get_installed_version(
418-
result.name, working_set=working_set
419-
)
420-
if installed_version:
421-
item += '-' + installed_version
416+
installed_dist = env.get_distribution(item)
417+
if installed_dist is not None:
418+
item = f"{item}-{installed_dist.version}"
422419
except Exception:
423420
pass
424421
items.append(item)

src/pip/_internal/network/session.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,14 @@
2525
from pip._vendor.urllib3.exceptions import InsecureRequestWarning
2626

2727
from pip import __version__
28+
from pip._internal.metadata import get_default_environment
2829
from pip._internal.network.auth import MultiDomainBasicAuth
2930
from pip._internal.network.cache import SafeFileCache
3031

3132
# Import ssl from compat so the initial import occurs in only one place.
3233
from pip._internal.utils.compat import has_tls
3334
from pip._internal.utils.glibc import libc_ver
34-
from pip._internal.utils.misc import (
35-
build_url_from_netloc,
36-
get_installed_version,
37-
parse_netloc,
38-
)
35+
from pip._internal.utils.misc import build_url_from_netloc, parse_netloc
3936
from pip._internal.utils.urls import url_to_path
4037

4138
if TYPE_CHECKING:
@@ -156,9 +153,9 @@ def user_agent():
156153
import _ssl as ssl
157154
data["openssl_version"] = ssl.OPENSSL_VERSION
158155

159-
setuptools_version = get_installed_version("setuptools")
160-
if setuptools_version is not None:
161-
data["setuptools_version"] = setuptools_version
156+
setuptools_dist = get_default_environment().get_distribution("setuptools")
157+
if setuptools_dist is not None:
158+
data["setuptools_version"] = str(setuptools_dist.version)
162159

163160
# Use None rather than False so as not to give the impression that
164161
# pip knows it is not being run under CI. Rather, it is a null or

src/pip/_internal/req/req_install.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
dist_in_site_packages,
4444
dist_in_usersite,
4545
get_distribution,
46-
get_installed_version,
4746
hide_url,
4847
redact_auth_from_url,
4948
)
@@ -273,11 +272,6 @@ def is_pinned(self):
273272
return (len(specifiers) == 1 and
274273
next(iter(specifiers)).operator in {'==', '==='})
275274

276-
@property
277-
def installed_version(self):
278-
# type: () -> Optional[str]
279-
return get_installed_version(self.name)
280-
281275
def match_markers(self, extras_requested=None):
282276
# type: (Optional[Iterable[str]]) -> bool
283277
if not extras_requested:

src/pip/_internal/self_outdated_check.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import sys
77
from typing import TYPE_CHECKING
88

9-
from pip._vendor.packaging import version as packaging_version
9+
from pip._vendor.packaging.version import parse as parse_version
1010

1111
from pip._internal.index.collector import LinkCollector
1212
from pip._internal.index.package_finder import PackageFinder
1313
from pip._internal.metadata import get_default_environment
1414
from pip._internal.models.selection_prefs import SelectionPreferences
1515
from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace
16-
from pip._internal.utils.misc import ensure_dir, get_installed_version
16+
from pip._internal.utils.misc import ensure_dir
1717

1818
if TYPE_CHECKING:
1919
import optparse
@@ -114,11 +114,11 @@ def pip_self_version_check(session, options):
114114
the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
115115
of the pip script path.
116116
"""
117-
installed_version = get_installed_version("pip")
118-
if not installed_version:
117+
installed_dist = get_default_environment().get_distribution("pip")
118+
if not installed_dist:
119119
return
120120

121-
pip_version = packaging_version.parse(installed_version)
121+
pip_version = installed_dist.version
122122
pypi_version = None
123123

124124
try:
@@ -162,7 +162,7 @@ def pip_self_version_check(session, options):
162162
# save that we've performed a check
163163
state.save(pypi_version, current_time)
164164

165-
remote_version = packaging_version.parse(pypi_version)
165+
remote_version = parse_version(pypi_version)
166166

167167
local_version_is_older = (
168168
pip_version < remote_version and

src/pip/_internal/utils/misc.py

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
from itertools import filterfalse, tee, zip_longest
1919
from typing import TYPE_CHECKING, cast
2020

21-
from pip._vendor import pkg_resources
22-
2321
# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is
2422
# why we ignore the type on this import.
2523
from pip._vendor.retrying import retry # type: ignore
@@ -59,7 +57,7 @@
5957
'normalize_path',
6058
'renames', 'get_prog',
6159
'captured_stdout', 'ensure_dir',
62-
'get_installed_version', 'remove_auth_from_url']
60+
'remove_auth_from_url']
6361

6462

6563
logger = logging.getLogger(__name__)
@@ -560,24 +558,6 @@ def captured_stderr():
560558
return captured_output('stderr')
561559

562560

563-
def get_installed_version(dist_name, working_set=None):
564-
"""Get the installed version of dist_name avoiding pkg_resources cache"""
565-
# Create a requirement that we'll look for inside of setuptools.
566-
req = pkg_resources.Requirement.parse(dist_name)
567-
568-
if working_set is None:
569-
# We want to avoid having this cached, so we need to construct a new
570-
# working set each time.
571-
working_set = pkg_resources.WorkingSet()
572-
573-
# Get the installed distribution from our working set
574-
dist = working_set.find(req)
575-
576-
# Check to see if we got an installed distribution or not, if we did
577-
# we want to return it's version.
578-
return dist.version if dist else None
579-
580-
581561
# Simulates an enum
582562
def enum(*sequential, **named):
583563
enums = dict(zip(sequential, range(len(sequential))), **named)

tests/unit/test_req.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -382,10 +382,6 @@ def test_unsupported_wheel_local_file_requirement_raises(self, data):
382382
with pytest.raises(InstallationError):
383383
reqset.add_requirement(req)
384384

385-
def test_installed_version_not_installed(self):
386-
req = install_req_from_line('simple-0.1-py2.py3-none-any.whl')
387-
assert req.installed_version is None
388-
389385
def test_str(self):
390386
req = install_req_from_line('simple==0.1')
391387
assert str(req) == 'simple==0.1'

tests/unit/test_self_check_outdated.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import datetime
2+
import functools
23
import json
34
import os
45
import sys
56

67
import freezegun
78
import pretend
89
import pytest
10+
from pip._vendor.packaging.version import parse as parse_version
911

1012
from pip._internal import self_outdated_check
1113
from pip._internal.models.candidate import InstallationCandidate
@@ -44,25 +46,20 @@ def find_best_candidate(self, project_name):
4446

4547

4648
class MockDistribution:
47-
def __init__(self, installer):
49+
def __init__(self, installer, version):
4850
self.installer = installer
49-
50-
def has_metadata(self, name):
51-
return name == 'INSTALLER'
52-
53-
def get_metadata_lines(self, name):
54-
if self.has_metadata(name):
55-
yield self.installer
56-
else:
57-
raise NotImplementedError('nope')
51+
self.version = parse_version(version)
5852

5953

6054
class MockEnvironment(object):
61-
def __init__(self, installer):
55+
def __init__(self, installer, installed_version):
6256
self.installer = installer
57+
self.installed_version = installed_version
6358

6459
def get_distribution(self, name):
65-
return MockDistribution(self.installer)
60+
if self.installed_version is None:
61+
return None
62+
return MockDistribution(self.installer, self.installed_version)
6663

6764

6865
def _options():
@@ -97,16 +94,26 @@ def _options():
9794
def test_pip_self_version_check(monkeypatch, stored_time, installed_ver,
9895
new_ver, installer,
9996
check_if_upgrade_required, check_warn_logs):
100-
monkeypatch.setattr(self_outdated_check, 'get_installed_version',
101-
lambda name: installed_ver)
102-
monkeypatch.setattr(self_outdated_check, 'PackageFinder',
103-
MockPackageFinder)
104-
monkeypatch.setattr(logger, 'warning',
105-
pretend.call_recorder(lambda *a, **kw: None))
106-
monkeypatch.setattr(logger, 'debug',
107-
pretend.call_recorder(lambda s, exc_info=None: None))
108-
monkeypatch.setattr(self_outdated_check, 'get_default_environment',
109-
lambda: MockEnvironment(installer))
97+
monkeypatch.setattr(
98+
self_outdated_check,
99+
"get_default_environment",
100+
functools.partial(MockEnvironment, installer, installed_ver),
101+
)
102+
monkeypatch.setattr(
103+
self_outdated_check,
104+
"PackageFinder",
105+
MockPackageFinder,
106+
)
107+
monkeypatch.setattr(
108+
logger,
109+
"warning",
110+
pretend.call_recorder(lambda *a, **kw: None),
111+
)
112+
monkeypatch.setattr(
113+
logger,
114+
"debug",
115+
pretend.call_recorder(lambda s, exc_info=None: None),
116+
)
110117

111118
fake_state = pretend.stub(
112119
state={"last_check": stored_time, 'pypi_version': installed_ver},

0 commit comments

Comments
 (0)