| | import sys |
| | from typing import List, Optional, Tuple |
| |
|
| | from pip._vendor.packaging.tags import Tag |
| |
|
| | from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot |
| | from pip._internal.utils.misc import normalize_version_info |
| |
|
| |
|
| | class TargetPython: |
| |
|
| | """ |
| | Encapsulates the properties of a Python interpreter one is targeting |
| | for a package install, download, etc. |
| | """ |
| |
|
| | __slots__ = [ |
| | "_given_py_version_info", |
| | "abis", |
| | "implementation", |
| | "platforms", |
| | "py_version", |
| | "py_version_info", |
| | "_valid_tags", |
| | ] |
| |
|
| | def __init__( |
| | self, |
| | platforms: Optional[List[str]] = None, |
| | py_version_info: Optional[Tuple[int, ...]] = None, |
| | abis: Optional[List[str]] = None, |
| | implementation: Optional[str] = None, |
| | ) -> None: |
| | """ |
| | :param platforms: A list of strings or None. If None, searches for |
| | packages that are supported by the current system. Otherwise, will |
| | find packages that can be built on the platforms passed in. These |
| | packages will only be downloaded for distribution: they will |
| | not be built locally. |
| | :param py_version_info: An optional tuple of ints representing the |
| | Python version information to use (e.g. `sys.version_info[:3]`). |
| | This can have length 1, 2, or 3 when provided. |
| | :param abis: A list of strings or None. This is passed to |
| | compatibility_tags.py's get_supported() function as is. |
| | :param implementation: A string or None. This is passed to |
| | compatibility_tags.py's get_supported() function as is. |
| | """ |
| | |
| | self._given_py_version_info = py_version_info |
| |
|
| | if py_version_info is None: |
| | py_version_info = sys.version_info[:3] |
| | else: |
| | py_version_info = normalize_version_info(py_version_info) |
| |
|
| | py_version = ".".join(map(str, py_version_info[:2])) |
| |
|
| | self.abis = abis |
| | self.implementation = implementation |
| | self.platforms = platforms |
| | self.py_version = py_version |
| | self.py_version_info = py_version_info |
| |
|
| | |
| | self._valid_tags: Optional[List[Tag]] = None |
| |
|
| | def format_given(self) -> str: |
| | """ |
| | Format the given, non-None attributes for display. |
| | """ |
| | display_version = None |
| | if self._given_py_version_info is not None: |
| | display_version = ".".join( |
| | str(part) for part in self._given_py_version_info |
| | ) |
| |
|
| | key_values = [ |
| | ("platforms", self.platforms), |
| | ("version_info", display_version), |
| | ("abis", self.abis), |
| | ("implementation", self.implementation), |
| | ] |
| | return " ".join( |
| | f"{key}={value!r}" for key, value in key_values if value is not None |
| | ) |
| |
|
| | def get_tags(self) -> List[Tag]: |
| | """ |
| | Return the supported PEP 425 tags to check wheel candidates against. |
| | |
| | The tags are returned in order of preference (most preferred first). |
| | """ |
| | if self._valid_tags is None: |
| | |
| | |
| | py_version_info = self._given_py_version_info |
| | if py_version_info is None: |
| | version = None |
| | else: |
| | version = version_info_to_nodot(py_version_info) |
| |
|
| | tags = get_supported( |
| | version=version, |
| | platforms=self.platforms, |
| | abis=self.abis, |
| | impl=self.implementation, |
| | ) |
| | self._valid_tags = tags |
| |
|
| | return self._valid_tags |
| |
|