1
1
Fork 0
mirror of https://github.com/pypa/pip synced 2023-12-13 21:30:23 +01:00

Incorporate get_installed_version() logic

All usages of it now use Environment.get_distribution() instead.

InstallRequirement.installed_version is also removed since it is no
longer used anywhere in the code base.
This commit is contained in:
Tzu-ping Chung 2021-02-04 15:36:09 +08:00
parent 751cbb72f5
commit 383934eb83
7 changed files with 46 additions and 75 deletions

View file

@ -7,7 +7,6 @@ import site
from optparse import SUPPRESS_HELP
from typing import TYPE_CHECKING
from pip._vendor import pkg_resources
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.cache import WheelCache
@ -17,6 +16,7 @@ from pip._internal.cli.req_command import RequirementCommand, with_cleanup
from pip._internal.cli.status_codes import ERROR, SUCCESS
from pip._internal.exceptions import CommandError, InstallationError
from pip._internal.locations import distutils_scheme
from pip._internal.metadata import get_environment
from pip._internal.operations.check import check_install_conflicts
from pip._internal.req import install_given_reqs
from pip._internal.req.req_tracker import get_requirement_tracker
@ -24,7 +24,6 @@ from pip._internal.utils.distutils_args import parse_distutils_args
from pip._internal.utils.filesystem import test_writable_dir
from pip._internal.utils.misc import (
ensure_dir,
get_installed_version,
get_pip_version,
protect_pip_from_modification_on_windows,
write_output,
@ -407,18 +406,16 @@ class InstallCommand(RequirementCommand):
prefix=options.prefix_path,
isolated=options.isolated_mode,
)
working_set = pkg_resources.WorkingSet(lib_locations)
env = get_environment(lib_locations)
installed.sort(key=operator.attrgetter('name'))
items = []
for result in installed:
item = result.name
try:
installed_version = get_installed_version(
result.name, working_set=working_set
)
if installed_version:
item += '-' + installed_version
installed_dist = env.get_distribution(item)
if installed_dist is not None:
item = f"{item}-{installed_dist.version}"
except Exception:
pass
items.append(item)

View file

@ -25,17 +25,14 @@ from pip._vendor.requests.structures import CaseInsensitiveDict
from pip._vendor.urllib3.exceptions import InsecureRequestWarning
from pip import __version__
from pip._internal.metadata import get_default_environment
from pip._internal.network.auth import MultiDomainBasicAuth
from pip._internal.network.cache import SafeFileCache
# Import ssl from compat so the initial import occurs in only one place.
from pip._internal.utils.compat import has_tls
from pip._internal.utils.glibc import libc_ver
from pip._internal.utils.misc import (
build_url_from_netloc,
get_installed_version,
parse_netloc,
)
from pip._internal.utils.misc import build_url_from_netloc, parse_netloc
from pip._internal.utils.urls import url_to_path
if TYPE_CHECKING:
@ -156,9 +153,9 @@ def user_agent():
import _ssl as ssl
data["openssl_version"] = ssl.OPENSSL_VERSION
setuptools_version = get_installed_version("setuptools")
if setuptools_version is not None:
data["setuptools_version"] = setuptools_version
setuptools_dist = get_default_environment().get_distribution("setuptools")
if setuptools_dist is not None:
data["setuptools_version"] = str(setuptools_dist.version)
# Use None rather than False so as not to give the impression that
# pip knows it is not being run under CI. Rather, it is a null or

View file

@ -43,7 +43,6 @@ from pip._internal.utils.misc import (
dist_in_site_packages,
dist_in_usersite,
get_distribution,
get_installed_version,
hide_url,
redact_auth_from_url,
)
@ -273,11 +272,6 @@ class InstallRequirement:
return (len(specifiers) == 1 and
next(iter(specifiers)).operator in {'==', '==='})
@property
def installed_version(self):
# type: () -> Optional[str]
return get_installed_version(self.name)
def match_markers(self, extras_requested=None):
# type: (Optional[Iterable[str]]) -> bool
if not extras_requested:

View file

@ -6,14 +6,14 @@ import os.path
import sys
from typing import TYPE_CHECKING
from pip._vendor.packaging import version as packaging_version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import get_default_environment
from pip._internal.models.selection_prefs import SelectionPreferences
from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace
from pip._internal.utils.misc import ensure_dir, get_installed_version
from pip._internal.utils.misc import ensure_dir
if TYPE_CHECKING:
import optparse
@ -114,11 +114,11 @@ def pip_self_version_check(session, options):
the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
of the pip script path.
"""
installed_version = get_installed_version("pip")
if not installed_version:
installed_dist = get_default_environment().get_distribution("pip")
if not installed_dist:
return
pip_version = packaging_version.parse(installed_version)
pip_version = installed_dist.version
pypi_version = None
try:
@ -162,7 +162,7 @@ def pip_self_version_check(session, options):
# save that we've performed a check
state.save(pypi_version, current_time)
remote_version = packaging_version.parse(pypi_version)
remote_version = parse_version(pypi_version)
local_version_is_older = (
pip_version < remote_version and

View file

@ -18,8 +18,6 @@ from io import StringIO
from itertools import filterfalse, tee, zip_longest
from typing import TYPE_CHECKING, cast
from pip._vendor import pkg_resources
# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is
# why we ignore the type on this import.
from pip._vendor.retrying import retry # type: ignore
@ -59,7 +57,7 @@ __all__ = ['rmtree', 'display_path', 'backup_dir',
'normalize_path',
'renames', 'get_prog',
'captured_stdout', 'ensure_dir',
'get_installed_version', 'remove_auth_from_url']
'remove_auth_from_url']
logger = logging.getLogger(__name__)
@ -560,24 +558,6 @@ def captured_stderr():
return captured_output('stderr')
def get_installed_version(dist_name, working_set=None):
"""Get the installed version of dist_name avoiding pkg_resources cache"""
# Create a requirement that we'll look for inside of setuptools.
req = pkg_resources.Requirement.parse(dist_name)
if working_set is None:
# We want to avoid having this cached, so we need to construct a new
# working set each time.
working_set = pkg_resources.WorkingSet()
# Get the installed distribution from our working set
dist = working_set.find(req)
# Check to see if we got an installed distribution or not, if we did
# we want to return it's version.
return dist.version if dist else None
# Simulates an enum
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)

View file

@ -382,10 +382,6 @@ class TestInstallRequirement:
with pytest.raises(InstallationError):
reqset.add_requirement(req)
def test_installed_version_not_installed(self):
req = install_req_from_line('simple-0.1-py2.py3-none-any.whl')
assert req.installed_version is None
def test_str(self):
req = install_req_from_line('simple==0.1')
assert str(req) == 'simple==0.1'

View file

@ -1,4 +1,5 @@
import datetime
import functools
import json
import os
import sys
@ -6,6 +7,7 @@ import sys
import freezegun
import pretend
import pytest
from pip._vendor.packaging.version import parse as parse_version
from pip._internal import self_outdated_check
from pip._internal.models.candidate import InstallationCandidate
@ -44,25 +46,20 @@ class MockPackageFinder:
class MockDistribution:
def __init__(self, installer):
def __init__(self, installer, version):
self.installer = installer
def has_metadata(self, name):
return name == 'INSTALLER'
def get_metadata_lines(self, name):
if self.has_metadata(name):
yield self.installer
else:
raise NotImplementedError('nope')
self.version = parse_version(version)
class MockEnvironment(object):
def __init__(self, installer):
def __init__(self, installer, installed_version):
self.installer = installer
self.installed_version = installed_version
def get_distribution(self, name):
return MockDistribution(self.installer)
if self.installed_version is None:
return None
return MockDistribution(self.installer, self.installed_version)
def _options():
@ -97,16 +94,26 @@ def _options():
def test_pip_self_version_check(monkeypatch, stored_time, installed_ver,
new_ver, installer,
check_if_upgrade_required, check_warn_logs):
monkeypatch.setattr(self_outdated_check, 'get_installed_version',
lambda name: installed_ver)
monkeypatch.setattr(self_outdated_check, 'PackageFinder',
MockPackageFinder)
monkeypatch.setattr(logger, 'warning',
pretend.call_recorder(lambda *a, **kw: None))
monkeypatch.setattr(logger, 'debug',
pretend.call_recorder(lambda s, exc_info=None: None))
monkeypatch.setattr(self_outdated_check, 'get_default_environment',
lambda: MockEnvironment(installer))
monkeypatch.setattr(
self_outdated_check,
"get_default_environment",
functools.partial(MockEnvironment, installer, installed_ver),
)
monkeypatch.setattr(
self_outdated_check,
"PackageFinder",
MockPackageFinder,
)
monkeypatch.setattr(
logger,
"warning",
pretend.call_recorder(lambda *a, **kw: None),
)
monkeypatch.setattr(
logger,
"debug",
pretend.call_recorder(lambda s, exc_info=None: None),
)
fake_state = pretend.stub(
state={"last_check": stored_time, 'pypi_version': installed_ver},