Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use packaging.tags.Tag to represent tag throughout the code #7563

Merged
merged 2 commits into from
Jan 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/pip/_internal/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@

if MYPY_CHECK_RUNNING:
from typing import Optional, Set, List, Any, Dict

from pip._vendor.packaging.tags import Tag

from pip._internal.models.format_control import FormatControl
from pip._internal.pep425tags import Pep425Tag

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -161,7 +163,7 @@ def get(
self,
link, # type: Link
package_name, # type: Optional[str]
supported_tags, # type: List[Pep425Tag]
supported_tags, # type: List[Tag]
):
# type: (...) -> Link
"""Returns a link to a cached item if it exists, otherwise returns the
Expand Down Expand Up @@ -214,7 +216,7 @@ def get(
self,
link, # type: Link
package_name, # type: Optional[str]
supported_tags, # type: List[Pep425Tag]
supported_tags, # type: List[Tag]
):
# type: (...) -> Link
candidates = []
Expand Down Expand Up @@ -304,7 +306,7 @@ def get(
self,
link, # type: Link
package_name, # type: Optional[str]
supported_tags, # type: List[Pep425Tag]
supported_tags, # type: List[Tag]
):
# type: (...) -> Link
retval = self._wheel_cache.get(
Expand Down
3 changes: 1 addition & 2 deletions src/pip/_internal/commands/debug.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
from pip._internal.cli.base_command import Command
from pip._internal.cli.cmdoptions import make_target_python
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.pep425tags import format_tag
from pip._internal.utils.logging import indent_log
from pip._internal.utils.misc import get_pip_version
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
Expand Down Expand Up @@ -68,7 +67,7 @@ def show_tags(options):

with indent_log():
for tag in tags:
logger.info(format_tag(tag))
logger.info(str(tag))

if tags_limited:
msg = (
Expand Down
6 changes: 4 additions & 2 deletions src/pip/_internal/index/package_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@
from typing import (
FrozenSet, Iterable, List, Optional, Set, Text, Tuple, Union,
)

from pip._vendor.packaging.tags import Tag
from pip._vendor.packaging.version import _BaseVersion

from pip._internal.index.collector import LinkCollector
from pip._internal.models.search_scope import SearchScope
from pip._internal.req import InstallRequirement
from pip._internal.pep425tags import Pep425Tag
from pip._internal.utils.hashes import Hashes

BuildTag = Union[Tuple[()], Tuple[int, str]]
Expand Down Expand Up @@ -425,7 +427,7 @@ def create(
def __init__(
self,
project_name, # type: str
supported_tags, # type: List[Pep425Tag]
supported_tags, # type: List[Tag]
specifier, # type: specifiers.BaseSpecifier
prefer_binary=False, # type: bool
allow_all_prereleases=False, # type: bool
Expand Down
7 changes: 4 additions & 3 deletions src/pip/_internal/models/target_python.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

if MYPY_CHECK_RUNNING:
from typing import List, Optional, Tuple
from pip._internal.pep425tags import Pep425Tag

from pip._vendor.packaging.tags import Tag


class TargetPython(object):
Expand Down Expand Up @@ -55,7 +56,7 @@ def __init__(
self.py_version_info = py_version_info

# This is used to cache the return value of get_tags().
self._valid_tags = None # type: Optional[List[Pep425Tag]]
self._valid_tags = None # type: Optional[List[Tag]]

def format_given(self):
# type: () -> str
Expand All @@ -80,7 +81,7 @@ def format_given(self):
)

def get_tags(self):
# type: () -> List[Pep425Tag]
# type: () -> List[Tag]
"""
Return the supported PEP 425 tags to check wheel candidates against.

Expand Down
13 changes: 6 additions & 7 deletions src/pip/_internal/models/wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@
"""
import re

from pip._vendor.packaging.tags import Tag

from pip._internal.exceptions import InvalidWheelFilename
from pip._internal.pep425tags import format_tag
from pip._internal.utils.typing import MYPY_CHECK_RUNNING

if MYPY_CHECK_RUNNING:
from typing import List

from pip._internal.pep425tags import Pep425Tag


class Wheel(object):
"""A wheel file"""
Expand Down Expand Up @@ -45,17 +44,17 @@ def __init__(self, filename):

# All the tag combinations from this file
self.file_tags = {
(x, y, z) for x in self.pyversions
Tag(x, y, z) for x in self.pyversions
for y in self.abis for z in self.plats
}

def get_formatted_file_tags(self):
# type: () -> List[str]
"""Return the wheel's tags as a sorted list of strings."""
return sorted(format_tag(tag) for tag in self.file_tags)
return sorted(str(tag) for tag in self.file_tags)

def support_index_min(self, tags):
# type: (List[Pep425Tag]) -> int
# type: (List[Tag]) -> int
"""Return the lowest index that one of the wheel's file_tag combinations
achieves in the given list of supported tags.

Expand All @@ -71,7 +70,7 @@ def support_index_min(self, tags):
return min(tags.index(tag) for tag in self.file_tags if tag in tags)

def supported(self, tags):
# type: (List[Pep425Tag]) -> bool
# type: (List[Tag]) -> bool
"""Return whether the wheel is compatible with one of the given tags.

:param tags: the PEP 425 tags to check the wheel against.
Expand Down
21 changes: 7 additions & 14 deletions src/pip/_internal/pep425tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
import sysconfig
from collections import OrderedDict

from pip._vendor.packaging.tags import interpreter_name, interpreter_version
from pip._vendor.packaging.tags import (
Tag,
interpreter_name,
interpreter_version,
)
from pip._vendor.six import PY2

import pip._internal.utils.glibc
Expand All @@ -20,22 +24,11 @@
Tuple, Callable, List, Optional, Union, Dict
)

Pep425Tag = Tuple[str, str, str]

logger = logging.getLogger(__name__)

_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)')


def format_tag(file_tag):
# type: (Tuple[str, ...]) -> str
"""Format three tags in the form "<python_tag>-<abi_tag>-<platform_tag>".

:param file_tag: A 3-tuple of tags (python_tag, abi_tag, platform_tag).
"""
return '-'.join(file_tag)


def get_config_var(var):
# type: (str) -> Optional[str]
return sysconfig.get_config_var(var)
Expand Down Expand Up @@ -365,7 +358,7 @@ def get_supported(
impl=None, # type: Optional[str]
abi=None # type: Optional[str]
):
# type: (...) -> List[Pep425Tag]
# type: (...) -> List[Tag]
"""Return a list of supported tags for each version specified in
`versions`.

Expand Down Expand Up @@ -433,4 +426,4 @@ def get_supported(
for version in other_versions:
supported.append(('py%s' % (version,), 'none', 'any'))

return supported
return [Tag(*parts) for parts in supported]
8 changes: 5 additions & 3 deletions tests/unit/test_cache.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import os

from pip._vendor.packaging.tags import Tag

from pip._internal.cache import WheelCache, _hash_dict
from pip._internal.models.format_control import FormatControl
from pip._internal.models.link import Link
Expand Down Expand Up @@ -39,11 +41,11 @@ def test_wheel_name_filter(tmpdir):
with open(os.path.join(cache_path, "package-1.0-py3-none-any.whl"), "w"):
pass
# package matches wheel name
cached_link = wc.get(link, "package", [("py3", "none", "any")])
cached_link = wc.get(link, "package", [Tag("py3", "none", "any")])
assert cached_link is not link
assert os.path.exists(cached_link.file_path)
# package2 does not match wheel name
assert wc.get(link, "package2", [("py3", "none", "any")]) is link
assert wc.get(link, "package2", [Tag("py3", "none", "any")]) is link


def test_cache_hash():
Expand Down Expand Up @@ -89,7 +91,7 @@ def test_get_with_legacy_entry_only(tmpdir):
ensure_dir(legacy_path)
with open(os.path.join(legacy_path, "test-1.0.0-py3-none-any.whl"), "w"):
pass
cached_link = wc.get(link, "test", [("py3", "none", "any")])
cached_link = wc.get(link, "test", [Tag("py3", "none", "any")])
assert (
os.path.normcase(os.path.dirname(cached_link.file_path)) ==
os.path.normcase(legacy_path)
Expand Down
7 changes: 4 additions & 3 deletions tests/unit/test_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import pytest
from mock import Mock, patch
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.tags import Tag
from pkg_resources import parse_version

import pip._internal.pep425tags
Expand Down Expand Up @@ -238,9 +239,9 @@ def test_link_sorting(self):
),
]
valid_tags = [
('pyT', 'none', 'TEST'),
('pyT', 'TEST', 'any'),
('pyT', 'none', 'any'),
Tag('pyT', 'none', 'TEST'),
Tag('pyT', 'TEST', 'any'),
Tag('pyT', 'none', 'any'),
]
specifier = SpecifierSet()
evaluator = CandidateEvaluator(
Expand Down
13 changes: 7 additions & 6 deletions tests/unit/test_models_wheel.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pytest
from pip._vendor.packaging.tags import Tag

from pip._internal import pep425tags
from pip._internal.exceptions import InvalidWheelFilename
Expand Down Expand Up @@ -54,21 +55,21 @@ def test_supported_single_version(self):
Test single-version wheel is known to be supported
"""
w = Wheel('simple-0.1-py2-none-any.whl')
assert w.supported(tags=[('py2', 'none', 'any')])
assert w.supported(tags=[Tag('py2', 'none', 'any')])

def test_supported_multi_version(self):
"""
Test multi-version wheel is known to be supported
"""
w = Wheel('simple-0.1-py2.py3-none-any.whl')
assert w.supported(tags=[('py3', 'none', 'any')])
assert w.supported(tags=[Tag('py3', 'none', 'any')])

def test_not_supported_version(self):
"""
Test unsupported wheel is known to be unsupported
"""
w = Wheel('simple-0.1-py2-none-any.whl')
assert not w.supported(tags=[('py1', 'none', 'any')])
assert not w.supported(tags=[Tag('py1', 'none', 'any')])

def test_supported_osx_version(self):
"""
Expand Down Expand Up @@ -153,9 +154,9 @@ def test_support_index_min(self):
Test results from `support_index_min`
"""
tags = [
('py2', 'none', 'TEST'),
('py2', 'TEST', 'any'),
('py2', 'none', 'any'),
Tag('py2', 'none', 'TEST'),
Tag('py2', 'TEST', 'any'),
Tag('py2', 'none', 'any'),
]
w = Wheel('simple-0.1-py2-none-any.whl')
assert w.support_index_min(tags=tags) == 2
Expand Down
47 changes: 24 additions & 23 deletions tests/unit/test_pep425tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,6 @@
from pip._internal import pep425tags


@pytest.mark.parametrize('file_tag, expected', [
(('py27', 'none', 'any'), 'py27-none-any'),
(('cp33', 'cp32dmu', 'linux_x86_64'), 'cp33-cp32dmu-linux_x86_64'),
])
def test_format_tag(file_tag, expected):
actual = pep425tags.format_tag(file_tag)
assert actual == expected


@pytest.mark.parametrize('version_info, expected', [
((2,), '2'),
((2, 8), '28'),
Expand Down Expand Up @@ -98,10 +89,10 @@ def test_no_hyphen_tag(self):
mock_gcf):
supported = pip._internal.pep425tags.get_supported()

for (py, abi, plat) in supported:
assert '-' not in py
assert '-' not in abi
assert '-' not in plat
for tag in supported:
assert '-' not in tag.interpreter
assert '-' not in tag.abi
assert '-' not in tag.platform

def test_manual_abi_noflags(self):
"""
Expand Down Expand Up @@ -192,8 +183,10 @@ def test_manylinux1_tag_is_first(self):
Test that the more specific tag manylinux1 comes first.
"""
groups = {}
for pyimpl, abi, arch in pep425tags.get_supported():
groups.setdefault((pyimpl, abi), []).append(arch)
for tag in pep425tags.get_supported():
groups.setdefault(
(tag.interpreter, tag.abi), []
).append(tag.platform)

for arches in groups.values():
if arches == ['any']:
Expand All @@ -218,8 +211,10 @@ def test_manylinux2010_tag_is_first(self):
Test that the more specific tag manylinux2010 comes first.
"""
groups = {}
for pyimpl, abi, arch in pep425tags.get_supported():
groups.setdefault((pyimpl, abi), []).append(arch)
for tag in pep425tags.get_supported():
groups.setdefault(
(tag.interpreter, tag.abi), []
).append(tag.platform)

for arches in groups.values():
if arches == ['any']:
Expand All @@ -245,8 +240,10 @@ def test_manylinux2010_implies_manylinux1(self, manylinux2010, manylinux1):
"""
groups = {}
supported = pep425tags.get_supported(platform=manylinux2010)
for pyimpl, abi, arch in supported:
groups.setdefault((pyimpl, abi), []).append(arch)
for tag in supported:
groups.setdefault(
(tag.interpreter, tag.abi), []
).append(tag.platform)

for arches in groups.values():
if arches == ['any']:
Expand All @@ -265,8 +262,10 @@ def test_manylinux2014_tag_is_first(self):
Test that the more specific tag manylinux2014 comes first.
"""
groups = {}
for pyimpl, abi, arch in pep425tags.get_supported():
groups.setdefault((pyimpl, abi), []).append(arch)
for tag in pep425tags.get_supported():
groups.setdefault(
(tag.interpreter, tag.abi), []
).append(tag.platform)

for arches in groups.values():
if arches == ['any']:
Expand Down Expand Up @@ -295,8 +294,10 @@ def test_manylinuxA_implies_manylinuxB(self, manylinuxA, manylinuxB):
"""
groups = {}
supported = pep425tags.get_supported(platform=manylinuxA)
for pyimpl, abi, arch in supported:
groups.setdefault((pyimpl, abi), []).append(arch)
for tag in supported:
groups.setdefault(
(tag.interpreter, tag.abi), []
).append(tag.platform)

expected_arches = [manylinuxA]
expected_arches.extend(manylinuxB)
Expand Down