mirror of https://github.com/pypa/pip
Move check_dist_requires_python() to resolve.py.
This commit is contained in:
parent
eeb74aeb29
commit
cc70cf5ba3
|
@ -15,6 +15,9 @@ import sys
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
|
|
||||||
|
from pip._vendor.packaging import specifiers
|
||||||
|
|
||||||
|
from pip._internal import exceptions
|
||||||
from pip._internal.exceptions import (
|
from pip._internal.exceptions import (
|
||||||
BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors,
|
BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors,
|
||||||
UnsupportedPythonVersion,
|
UnsupportedPythonVersion,
|
||||||
|
@ -22,11 +25,12 @@ from pip._internal.exceptions import (
|
||||||
from pip._internal.req.constructors import install_req_from_req_string
|
from pip._internal.req.constructors import install_req_from_req_string
|
||||||
from pip._internal.utils.logging import indent_log
|
from pip._internal.utils.logging import indent_log
|
||||||
from pip._internal.utils.misc import dist_in_usersite, ensure_dir
|
from pip._internal.utils.misc import dist_in_usersite, ensure_dir
|
||||||
from pip._internal.utils.packaging import check_dist_requires_python
|
from pip._internal.utils.packaging import check_requires_python, get_metadata
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
if MYPY_CHECK_RUNNING:
|
if MYPY_CHECK_RUNNING:
|
||||||
from typing import Optional, DefaultDict, List, Set
|
from typing import DefaultDict, List, Optional, Set, Tuple
|
||||||
|
from pip._vendor import pkg_resources
|
||||||
from pip._internal.download import PipSession
|
from pip._internal.download import PipSession
|
||||||
from pip._internal.req.req_install import InstallRequirement
|
from pip._internal.req.req_install import InstallRequirement
|
||||||
from pip._internal.index import PackageFinder
|
from pip._internal.index import PackageFinder
|
||||||
|
@ -39,6 +43,35 @@ if MYPY_CHECK_RUNNING:
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def check_dist_requires_python(
|
||||||
|
dist, # type: pkg_resources.Distribution
|
||||||
|
version_info, # type: Optional[Tuple[int, ...]]
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
"""
|
||||||
|
:param version_info: A 3-tuple of ints representing the Python
|
||||||
|
major-minor-micro version to check (e.g. `sys.version_info[:3]`).
|
||||||
|
"""
|
||||||
|
pkg_info_dict = get_metadata(dist)
|
||||||
|
requires_python = pkg_info_dict.get('Requires-Python')
|
||||||
|
try:
|
||||||
|
if not check_requires_python(
|
||||||
|
requires_python, version_info=version_info,
|
||||||
|
):
|
||||||
|
raise exceptions.UnsupportedPythonVersion(
|
||||||
|
"%s requires Python '%s' but the running Python is %s" % (
|
||||||
|
dist.project_name,
|
||||||
|
requires_python,
|
||||||
|
'.'.join(map(str, version_info)),)
|
||||||
|
)
|
||||||
|
except specifiers.InvalidSpecifier as e:
|
||||||
|
logger.warning(
|
||||||
|
"Package %s has an invalid Requires-Python entry %s - %s",
|
||||||
|
dist.project_name, requires_python, e,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
class Resolver(object):
|
class Resolver(object):
|
||||||
"""Resolves which packages need to be installed/uninstalled to perform \
|
"""Resolves which packages need to be installed/uninstalled to perform \
|
||||||
the requested operation without breaking the requirements of any package.
|
the requested operation without breaking the requirements of any package.
|
||||||
|
|
|
@ -6,7 +6,6 @@ from email.parser import FeedParser
|
||||||
from pip._vendor import pkg_resources
|
from pip._vendor import pkg_resources
|
||||||
from pip._vendor.packaging import specifiers, version
|
from pip._vendor.packaging import specifiers, version
|
||||||
|
|
||||||
from pip._internal import exceptions
|
|
||||||
from pip._internal.utils.misc import display_path
|
from pip._internal.utils.misc import display_path
|
||||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||||
|
|
||||||
|
@ -58,31 +57,6 @@ def get_metadata(dist):
|
||||||
return feed_parser.close()
|
return feed_parser.close()
|
||||||
|
|
||||||
|
|
||||||
def check_dist_requires_python(dist, version_info):
|
|
||||||
"""
|
|
||||||
:param version_info: A 3-tuple of ints representing the Python
|
|
||||||
major-minor-micro version to check (e.g. `sys.version_info[:3]`).
|
|
||||||
"""
|
|
||||||
pkg_info_dict = get_metadata(dist)
|
|
||||||
requires_python = pkg_info_dict.get('Requires-Python')
|
|
||||||
try:
|
|
||||||
if not check_requires_python(
|
|
||||||
requires_python, version_info=version_info,
|
|
||||||
):
|
|
||||||
raise exceptions.UnsupportedPythonVersion(
|
|
||||||
"%s requires Python '%s' but the running Python is %s" % (
|
|
||||||
dist.project_name,
|
|
||||||
requires_python,
|
|
||||||
'.'.join(map(str, version_info)),)
|
|
||||||
)
|
|
||||||
except specifiers.InvalidSpecifier as e:
|
|
||||||
logger.warning(
|
|
||||||
"Package %s has an invalid Requires-Python entry %s - %s",
|
|
||||||
dist.project_name, requires_python, e,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
def get_installer(dist):
|
def get_installer(dist):
|
||||||
# type: (Distribution) -> str
|
# type: (Distribution) -> str
|
||||||
if dist.has_metadata('INSTALLER'):
|
if dist.has_metadata('INSTALLER'):
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from mock import Mock
|
||||||
|
|
||||||
|
from pip._internal.exceptions import UnsupportedPythonVersion
|
||||||
|
from pip._internal.resolve import check_dist_requires_python
|
||||||
|
|
||||||
|
|
||||||
|
class TestCheckRequiresPython(object):
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("metadata", "should_raise"),
|
||||||
|
[
|
||||||
|
("Name: test\n", False),
|
||||||
|
("Name: test\nRequires-Python:", False),
|
||||||
|
("Name: test\nRequires-Python: invalid_spec", False),
|
||||||
|
("Name: test\nRequires-Python: <=1", True),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_check_requires(self, metadata, should_raise):
|
||||||
|
fake_dist = Mock(
|
||||||
|
has_metadata=lambda _: True,
|
||||||
|
get_metadata=lambda _: metadata)
|
||||||
|
version_info = sys.version_info[:3]
|
||||||
|
if should_raise:
|
||||||
|
with pytest.raises(UnsupportedPythonVersion):
|
||||||
|
check_dist_requires_python(
|
||||||
|
fake_dist, version_info=version_info,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
check_dist_requires_python(fake_dist, version_info=version_info)
|
|
@ -20,7 +20,7 @@ import pytest
|
||||||
from mock import Mock, patch
|
from mock import Mock, patch
|
||||||
|
|
||||||
from pip._internal.exceptions import (
|
from pip._internal.exceptions import (
|
||||||
HashMismatch, HashMissing, InstallationError, UnsupportedPythonVersion,
|
HashMismatch, HashMissing, InstallationError,
|
||||||
)
|
)
|
||||||
from pip._internal.utils.encoding import BOMS, auto_decode
|
from pip._internal.utils.encoding import BOMS, auto_decode
|
||||||
from pip._internal.utils.glibc import check_glibc_version
|
from pip._internal.utils.glibc import check_glibc_version
|
||||||
|
@ -31,7 +31,6 @@ from pip._internal.utils.misc import (
|
||||||
redact_password_from_url, remove_auth_from_url, rmtree,
|
redact_password_from_url, remove_auth_from_url, rmtree,
|
||||||
split_auth_from_netloc, split_auth_netloc_from_url, untar_file, unzip_file,
|
split_auth_from_netloc, split_auth_netloc_from_url, untar_file, unzip_file,
|
||||||
)
|
)
|
||||||
from pip._internal.utils.packaging import check_dist_requires_python
|
|
||||||
from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory
|
from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory
|
||||||
from pip._internal.utils.ui import SpinnerInterface
|
from pip._internal.utils.ui import SpinnerInterface
|
||||||
|
|
||||||
|
@ -699,31 +698,6 @@ class TestGlibc(object):
|
||||||
assert False
|
assert False
|
||||||
|
|
||||||
|
|
||||||
class TestCheckRequiresPython(object):
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
("metadata", "should_raise"),
|
|
||||||
[
|
|
||||||
("Name: test\n", False),
|
|
||||||
("Name: test\nRequires-Python:", False),
|
|
||||||
("Name: test\nRequires-Python: invalid_spec", False),
|
|
||||||
("Name: test\nRequires-Python: <=1", True),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
def test_check_requires(self, metadata, should_raise):
|
|
||||||
fake_dist = Mock(
|
|
||||||
has_metadata=lambda _: True,
|
|
||||||
get_metadata=lambda _: metadata)
|
|
||||||
version_info = sys.version_info[:3]
|
|
||||||
if should_raise:
|
|
||||||
with pytest.raises(UnsupportedPythonVersion):
|
|
||||||
check_dist_requires_python(
|
|
||||||
fake_dist, version_info=version_info,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
check_dist_requires_python(fake_dist, version_info=version_info)
|
|
||||||
|
|
||||||
|
|
||||||
class TestGetProg(object):
|
class TestGetProg(object):
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
|
|
Loading…
Reference in New Issue