From fa0995b0a8f9afab11f8be50607a02ebb11f9596 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 12 Apr 2024 06:36:31 -0700 Subject: [PATCH] Fix lock downloads to use all lock info. (#2396) Previously, the lock target systems and requires python configuration were left out, which could lead to critical Pip runtime patches being left off; causing downloads to fail when they should not. Fixes #2395 --- CHANGES.md | 7 + pex/resolve/downloads.py | 5 +- pex/resolve/lock_resolver.py | 6 + pex/resolve/lockfile/create.py | 1 + pex/version.py | 2 +- testing/cli.py | 14 +- .../complete_platform_linux_x86-64_py11.json | 907 ++++++++++++++++++ tests/integration/test_downloads.py | 7 +- tests/integration/test_issue_1726.py | 2 + tests/integration/test_issue_2391.py | 2 +- tests/integration/test_issue_2395.py | 56 ++ tests/resolve/test_pex_repository_resolver.py | 2 + 12 files changed, 1000 insertions(+), 11 deletions(-) create mode 100644 testing/data/platforms/complete_platform_linux_x86-64_py11.json create mode 100644 tests/integration/test_issue_2395.py diff --git a/CHANGES.md b/CHANGES.md index a471ca569..a5535798e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # Release Notes +## 2.3.1 + +This release fixes Pex to respect lock file interpreter constraints and +target systems when downloading artifacts. + +* Fix lock downloads to use all lock info. (#2396) + ## 2.3.0 This release introduces `pex3 lock sync` as a higher-level tool that diff --git a/pex/resolve/downloads.py b/pex/resolve/downloads.py index 56c7e4605..b7f2b621c 100644 --- a/pex/resolve/downloads.py +++ b/pex/resolve/downloads.py @@ -15,7 +15,7 @@ from pex.pip.installation import get_pip from pex.pip.tool import PackageIndexConfiguration, Pip from pex.resolve import locker -from pex.resolve.locked_resolve import Artifact, FileArtifact, LockConfiguration, LockStyle +from pex.resolve.locked_resolve import Artifact, FileArtifact, LockConfiguration from pex.resolve.resolved_requirement import ArtifactURL, Fingerprint, PartialArtifact from pex.resolve.resolvers import Resolver from pex.result import Error @@ -50,6 +50,7 @@ def get_downloads_dir(pex_root=None): @attr.s(frozen=True) class ArtifactDownloader(object): resolver = attr.ib() # type: Resolver + lock_configuration = attr.ib() # type: LockConfiguration target = attr.ib(factory=LocalInterpreter.create) # type: Target package_index_configuration = attr.ib( factory=PackageIndexConfiguration.create @@ -113,7 +114,7 @@ def _download( # restrictions. download_observer = DownloadObserver( analyzer=None, - patch_set=locker.patch(lock_configuration=LockConfiguration(style=LockStyle.UNIVERSAL)), + patch_set=locker.patch(lock_configuration=self.lock_configuration), ) return self.pip.spawn_download_distributions( download_dir=download_dir, diff --git a/pex/resolve/lock_resolver.py b/pex/resolve/lock_resolver.py index 3255ffa91..ad1cdd438 100644 --- a/pex/resolve/lock_resolver.py +++ b/pex/resolve/lock_resolver.py @@ -27,6 +27,7 @@ DownloadableArtifact, FileArtifact, LocalProjectArtifact, + LockConfiguration, VCSArtifact, ) from pex.resolve.lockfile.download_manager import DownloadedArtifact, DownloadManager @@ -281,6 +282,11 @@ def resolve_from_lock( file_lock_style=file_lock_style, downloader=ArtifactDownloader( resolver=resolver, + lock_configuration=LockConfiguration( + style=lock.style, + requires_python=lock.requires_python, + target_systems=lock.target_systems, + ), target=resolved_subset.target, package_index_configuration=PackageIndexConfiguration.create( pip_version=pip_version, diff --git a/pex/resolve/lockfile/create.py b/pex/resolve/lockfile/create.py index 59bed8851..9492d253f 100644 --- a/pex/resolve/lockfile/create.py +++ b/pex/resolve/lockfile/create.py @@ -331,6 +331,7 @@ def lock(self, downloaded): dist_metadatas=dist_metadatas_by_target[target], fingerprinter=ArtifactDownloader( resolver=self.resolver, + lock_configuration=self.lock_configuration, target=target, package_index_configuration=self.package_index_configuration, max_parallel_jobs=self.max_parallel_jobs, diff --git a/pex/version.py b/pex/version.py index 5c3a173f6..3601e2355 100644 --- a/pex/version.py +++ b/pex/version.py @@ -1,4 +1,4 @@ # Copyright 2015 Pex project contributors. # Licensed under the Apache License, Version 2.0 (see LICENSE). -__version__ = "2.3.0" +__version__ = "2.3.1" diff --git a/testing/cli.py b/testing/cli.py index 2c99a8865..a35d9962d 100644 --- a/testing/cli.py +++ b/testing/cli.py @@ -1,28 +1,32 @@ # Copyright 2022 Pex project contributors. # Licensed under the Apache License, Version 2.0 (see LICENSE). -from __future__ import absolute_import, division, print_function, unicode_literals +from __future__ import absolute_import import subprocess import sys -from pex.typing import TYPE_CHECKING +from pex.compatibility import to_unicode +from pex.typing import TYPE_CHECKING, cast from testing import IntegResults if TYPE_CHECKING: + from typing import Text # noqa from typing import Any def run_pex3( *args, # type: str - **popen_kwargs # type: Any + **kwargs # type: Any ): # type: (...) -> IntegResults + + python = cast("Text", kwargs.pop("python", to_unicode(sys.executable))) process = subprocess.Popen( - args=[sys.executable, "-mpex.cli"] + list(args), + args=[python, "-mpex.cli"] + list(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, - **popen_kwargs + **kwargs ) stdout, stderr = process.communicate() return IntegResults( diff --git a/testing/data/platforms/complete_platform_linux_x86-64_py11.json b/testing/data/platforms/complete_platform_linux_x86-64_py11.json new file mode 100644 index 000000000..a49a2dec7 --- /dev/null +++ b/testing/data/platforms/complete_platform_linux_x86-64_py11.json @@ -0,0 +1,907 @@ +{ + "path": "/home/jsirois/dev/pex-tool/pex/.tox/py311-integration/bin/python", + "compatible_tags": [ + "cp311-cp311-manylinux_2_35_x86_64", + "cp311-cp311-manylinux_2_34_x86_64", + "cp311-cp311-manylinux_2_33_x86_64", + "cp311-cp311-manylinux_2_32_x86_64", + "cp311-cp311-manylinux_2_31_x86_64", + "cp311-cp311-manylinux_2_30_x86_64", + "cp311-cp311-manylinux_2_29_x86_64", + "cp311-cp311-manylinux_2_28_x86_64", + "cp311-cp311-manylinux_2_27_x86_64", + "cp311-cp311-manylinux_2_26_x86_64", + "cp311-cp311-manylinux_2_25_x86_64", + "cp311-cp311-manylinux_2_24_x86_64", + "cp311-cp311-manylinux_2_23_x86_64", + "cp311-cp311-manylinux_2_22_x86_64", + "cp311-cp311-manylinux_2_21_x86_64", + "cp311-cp311-manylinux_2_20_x86_64", + "cp311-cp311-manylinux_2_19_x86_64", + "cp311-cp311-manylinux_2_18_x86_64", + "cp311-cp311-manylinux_2_17_x86_64", + "cp311-cp311-manylinux2014_x86_64", + "cp311-cp311-manylinux_2_16_x86_64", + "cp311-cp311-manylinux_2_15_x86_64", + "cp311-cp311-manylinux_2_14_x86_64", + "cp311-cp311-manylinux_2_13_x86_64", + "cp311-cp311-manylinux_2_12_x86_64", + "cp311-cp311-manylinux2010_x86_64", + "cp311-cp311-manylinux_2_11_x86_64", + "cp311-cp311-manylinux_2_10_x86_64", + "cp311-cp311-manylinux_2_9_x86_64", + "cp311-cp311-manylinux_2_8_x86_64", + "cp311-cp311-manylinux_2_7_x86_64", + "cp311-cp311-manylinux_2_6_x86_64", + "cp311-cp311-manylinux_2_5_x86_64", + "cp311-cp311-manylinux1_x86_64", + "cp311-cp311-linux_x86_64", + "cp311-abi3-manylinux_2_35_x86_64", + "cp311-abi3-manylinux_2_34_x86_64", + "cp311-abi3-manylinux_2_33_x86_64", + "cp311-abi3-manylinux_2_32_x86_64", + "cp311-abi3-manylinux_2_31_x86_64", + "cp311-abi3-manylinux_2_30_x86_64", + "cp311-abi3-manylinux_2_29_x86_64", + "cp311-abi3-manylinux_2_28_x86_64", + "cp311-abi3-manylinux_2_27_x86_64", + "cp311-abi3-manylinux_2_26_x86_64", + "cp311-abi3-manylinux_2_25_x86_64", + "cp311-abi3-manylinux_2_24_x86_64", + "cp311-abi3-manylinux_2_23_x86_64", + "cp311-abi3-manylinux_2_22_x86_64", + "cp311-abi3-manylinux_2_21_x86_64", + "cp311-abi3-manylinux_2_20_x86_64", + "cp311-abi3-manylinux_2_19_x86_64", + "cp311-abi3-manylinux_2_18_x86_64", + "cp311-abi3-manylinux_2_17_x86_64", + "cp311-abi3-manylinux2014_x86_64", + "cp311-abi3-manylinux_2_16_x86_64", + "cp311-abi3-manylinux_2_15_x86_64", + "cp311-abi3-manylinux_2_14_x86_64", + "cp311-abi3-manylinux_2_13_x86_64", + "cp311-abi3-manylinux_2_12_x86_64", + "cp311-abi3-manylinux2010_x86_64", + "cp311-abi3-manylinux_2_11_x86_64", + "cp311-abi3-manylinux_2_10_x86_64", + "cp311-abi3-manylinux_2_9_x86_64", + "cp311-abi3-manylinux_2_8_x86_64", + "cp311-abi3-manylinux_2_7_x86_64", + "cp311-abi3-manylinux_2_6_x86_64", + "cp311-abi3-manylinux_2_5_x86_64", + "cp311-abi3-manylinux1_x86_64", + "cp311-abi3-linux_x86_64", + "cp311-none-manylinux_2_35_x86_64", + "cp311-none-manylinux_2_34_x86_64", + "cp311-none-manylinux_2_33_x86_64", + "cp311-none-manylinux_2_32_x86_64", + "cp311-none-manylinux_2_31_x86_64", + "cp311-none-manylinux_2_30_x86_64", + "cp311-none-manylinux_2_29_x86_64", + "cp311-none-manylinux_2_28_x86_64", + "cp311-none-manylinux_2_27_x86_64", + "cp311-none-manylinux_2_26_x86_64", + "cp311-none-manylinux_2_25_x86_64", + "cp311-none-manylinux_2_24_x86_64", + "cp311-none-manylinux_2_23_x86_64", + "cp311-none-manylinux_2_22_x86_64", + "cp311-none-manylinux_2_21_x86_64", + "cp311-none-manylinux_2_20_x86_64", + "cp311-none-manylinux_2_19_x86_64", + "cp311-none-manylinux_2_18_x86_64", + "cp311-none-manylinux_2_17_x86_64", + "cp311-none-manylinux2014_x86_64", + "cp311-none-manylinux_2_16_x86_64", + "cp311-none-manylinux_2_15_x86_64", + "cp311-none-manylinux_2_14_x86_64", + "cp311-none-manylinux_2_13_x86_64", + "cp311-none-manylinux_2_12_x86_64", + "cp311-none-manylinux2010_x86_64", + "cp311-none-manylinux_2_11_x86_64", + "cp311-none-manylinux_2_10_x86_64", + "cp311-none-manylinux_2_9_x86_64", + "cp311-none-manylinux_2_8_x86_64", + "cp311-none-manylinux_2_7_x86_64", + "cp311-none-manylinux_2_6_x86_64", + "cp311-none-manylinux_2_5_x86_64", + "cp311-none-manylinux1_x86_64", + "cp311-none-linux_x86_64", + "cp310-abi3-manylinux_2_35_x86_64", + "cp310-abi3-manylinux_2_34_x86_64", + "cp310-abi3-manylinux_2_33_x86_64", + "cp310-abi3-manylinux_2_32_x86_64", + "cp310-abi3-manylinux_2_31_x86_64", + "cp310-abi3-manylinux_2_30_x86_64", + "cp310-abi3-manylinux_2_29_x86_64", + "cp310-abi3-manylinux_2_28_x86_64", + "cp310-abi3-manylinux_2_27_x86_64", + "cp310-abi3-manylinux_2_26_x86_64", + "cp310-abi3-manylinux_2_25_x86_64", + "cp310-abi3-manylinux_2_24_x86_64", + "cp310-abi3-manylinux_2_23_x86_64", + "cp310-abi3-manylinux_2_22_x86_64", + "cp310-abi3-manylinux_2_21_x86_64", + "cp310-abi3-manylinux_2_20_x86_64", + "cp310-abi3-manylinux_2_19_x86_64", + "cp310-abi3-manylinux_2_18_x86_64", + "cp310-abi3-manylinux_2_17_x86_64", + "cp310-abi3-manylinux2014_x86_64", + "cp310-abi3-manylinux_2_16_x86_64", + "cp310-abi3-manylinux_2_15_x86_64", + "cp310-abi3-manylinux_2_14_x86_64", + "cp310-abi3-manylinux_2_13_x86_64", + "cp310-abi3-manylinux_2_12_x86_64", + "cp310-abi3-manylinux2010_x86_64", + "cp310-abi3-manylinux_2_11_x86_64", + "cp310-abi3-manylinux_2_10_x86_64", + "cp310-abi3-manylinux_2_9_x86_64", + "cp310-abi3-manylinux_2_8_x86_64", + "cp310-abi3-manylinux_2_7_x86_64", + "cp310-abi3-manylinux_2_6_x86_64", + "cp310-abi3-manylinux_2_5_x86_64", + "cp310-abi3-manylinux1_x86_64", + "cp310-abi3-linux_x86_64", + "cp39-abi3-manylinux_2_35_x86_64", + "cp39-abi3-manylinux_2_34_x86_64", + "cp39-abi3-manylinux_2_33_x86_64", + "cp39-abi3-manylinux_2_32_x86_64", + "cp39-abi3-manylinux_2_31_x86_64", + "cp39-abi3-manylinux_2_30_x86_64", + "cp39-abi3-manylinux_2_29_x86_64", + "cp39-abi3-manylinux_2_28_x86_64", + "cp39-abi3-manylinux_2_27_x86_64", + "cp39-abi3-manylinux_2_26_x86_64", + "cp39-abi3-manylinux_2_25_x86_64", + "cp39-abi3-manylinux_2_24_x86_64", + "cp39-abi3-manylinux_2_23_x86_64", + "cp39-abi3-manylinux_2_22_x86_64", + "cp39-abi3-manylinux_2_21_x86_64", + "cp39-abi3-manylinux_2_20_x86_64", + "cp39-abi3-manylinux_2_19_x86_64", + "cp39-abi3-manylinux_2_18_x86_64", + "cp39-abi3-manylinux_2_17_x86_64", + "cp39-abi3-manylinux2014_x86_64", + "cp39-abi3-manylinux_2_16_x86_64", + "cp39-abi3-manylinux_2_15_x86_64", + "cp39-abi3-manylinux_2_14_x86_64", + "cp39-abi3-manylinux_2_13_x86_64", + "cp39-abi3-manylinux_2_12_x86_64", + "cp39-abi3-manylinux2010_x86_64", + "cp39-abi3-manylinux_2_11_x86_64", + "cp39-abi3-manylinux_2_10_x86_64", + "cp39-abi3-manylinux_2_9_x86_64", + "cp39-abi3-manylinux_2_8_x86_64", + "cp39-abi3-manylinux_2_7_x86_64", + "cp39-abi3-manylinux_2_6_x86_64", + "cp39-abi3-manylinux_2_5_x86_64", + "cp39-abi3-manylinux1_x86_64", + "cp39-abi3-linux_x86_64", + "cp38-abi3-manylinux_2_35_x86_64", + "cp38-abi3-manylinux_2_34_x86_64", + "cp38-abi3-manylinux_2_33_x86_64", + "cp38-abi3-manylinux_2_32_x86_64", + "cp38-abi3-manylinux_2_31_x86_64", + "cp38-abi3-manylinux_2_30_x86_64", + "cp38-abi3-manylinux_2_29_x86_64", + "cp38-abi3-manylinux_2_28_x86_64", + "cp38-abi3-manylinux_2_27_x86_64", + "cp38-abi3-manylinux_2_26_x86_64", + "cp38-abi3-manylinux_2_25_x86_64", + "cp38-abi3-manylinux_2_24_x86_64", + "cp38-abi3-manylinux_2_23_x86_64", + "cp38-abi3-manylinux_2_22_x86_64", + "cp38-abi3-manylinux_2_21_x86_64", + "cp38-abi3-manylinux_2_20_x86_64", + "cp38-abi3-manylinux_2_19_x86_64", + "cp38-abi3-manylinux_2_18_x86_64", + "cp38-abi3-manylinux_2_17_x86_64", + "cp38-abi3-manylinux2014_x86_64", + "cp38-abi3-manylinux_2_16_x86_64", + "cp38-abi3-manylinux_2_15_x86_64", + "cp38-abi3-manylinux_2_14_x86_64", + "cp38-abi3-manylinux_2_13_x86_64", + "cp38-abi3-manylinux_2_12_x86_64", + "cp38-abi3-manylinux2010_x86_64", + "cp38-abi3-manylinux_2_11_x86_64", + "cp38-abi3-manylinux_2_10_x86_64", + "cp38-abi3-manylinux_2_9_x86_64", + "cp38-abi3-manylinux_2_8_x86_64", + "cp38-abi3-manylinux_2_7_x86_64", + "cp38-abi3-manylinux_2_6_x86_64", + "cp38-abi3-manylinux_2_5_x86_64", + "cp38-abi3-manylinux1_x86_64", + "cp38-abi3-linux_x86_64", + "cp37-abi3-manylinux_2_35_x86_64", + "cp37-abi3-manylinux_2_34_x86_64", + "cp37-abi3-manylinux_2_33_x86_64", + "cp37-abi3-manylinux_2_32_x86_64", + "cp37-abi3-manylinux_2_31_x86_64", + "cp37-abi3-manylinux_2_30_x86_64", + "cp37-abi3-manylinux_2_29_x86_64", + "cp37-abi3-manylinux_2_28_x86_64", + "cp37-abi3-manylinux_2_27_x86_64", + "cp37-abi3-manylinux_2_26_x86_64", + "cp37-abi3-manylinux_2_25_x86_64", + "cp37-abi3-manylinux_2_24_x86_64", + "cp37-abi3-manylinux_2_23_x86_64", + "cp37-abi3-manylinux_2_22_x86_64", + "cp37-abi3-manylinux_2_21_x86_64", + "cp37-abi3-manylinux_2_20_x86_64", + "cp37-abi3-manylinux_2_19_x86_64", + "cp37-abi3-manylinux_2_18_x86_64", + "cp37-abi3-manylinux_2_17_x86_64", + "cp37-abi3-manylinux2014_x86_64", + "cp37-abi3-manylinux_2_16_x86_64", + "cp37-abi3-manylinux_2_15_x86_64", + "cp37-abi3-manylinux_2_14_x86_64", + "cp37-abi3-manylinux_2_13_x86_64", + "cp37-abi3-manylinux_2_12_x86_64", + "cp37-abi3-manylinux2010_x86_64", + "cp37-abi3-manylinux_2_11_x86_64", + "cp37-abi3-manylinux_2_10_x86_64", + "cp37-abi3-manylinux_2_9_x86_64", + "cp37-abi3-manylinux_2_8_x86_64", + "cp37-abi3-manylinux_2_7_x86_64", + "cp37-abi3-manylinux_2_6_x86_64", + "cp37-abi3-manylinux_2_5_x86_64", + "cp37-abi3-manylinux1_x86_64", + "cp37-abi3-linux_x86_64", + "cp36-abi3-manylinux_2_35_x86_64", + "cp36-abi3-manylinux_2_34_x86_64", + "cp36-abi3-manylinux_2_33_x86_64", + "cp36-abi3-manylinux_2_32_x86_64", + "cp36-abi3-manylinux_2_31_x86_64", + "cp36-abi3-manylinux_2_30_x86_64", + "cp36-abi3-manylinux_2_29_x86_64", + "cp36-abi3-manylinux_2_28_x86_64", + "cp36-abi3-manylinux_2_27_x86_64", + "cp36-abi3-manylinux_2_26_x86_64", + "cp36-abi3-manylinux_2_25_x86_64", + "cp36-abi3-manylinux_2_24_x86_64", + "cp36-abi3-manylinux_2_23_x86_64", + "cp36-abi3-manylinux_2_22_x86_64", + "cp36-abi3-manylinux_2_21_x86_64", + "cp36-abi3-manylinux_2_20_x86_64", + "cp36-abi3-manylinux_2_19_x86_64", + "cp36-abi3-manylinux_2_18_x86_64", + "cp36-abi3-manylinux_2_17_x86_64", + "cp36-abi3-manylinux2014_x86_64", + "cp36-abi3-manylinux_2_16_x86_64", + "cp36-abi3-manylinux_2_15_x86_64", + "cp36-abi3-manylinux_2_14_x86_64", + "cp36-abi3-manylinux_2_13_x86_64", + "cp36-abi3-manylinux_2_12_x86_64", + "cp36-abi3-manylinux2010_x86_64", + "cp36-abi3-manylinux_2_11_x86_64", + "cp36-abi3-manylinux_2_10_x86_64", + "cp36-abi3-manylinux_2_9_x86_64", + "cp36-abi3-manylinux_2_8_x86_64", + "cp36-abi3-manylinux_2_7_x86_64", + "cp36-abi3-manylinux_2_6_x86_64", + "cp36-abi3-manylinux_2_5_x86_64", + "cp36-abi3-manylinux1_x86_64", + "cp36-abi3-linux_x86_64", + "cp35-abi3-manylinux_2_35_x86_64", + "cp35-abi3-manylinux_2_34_x86_64", + "cp35-abi3-manylinux_2_33_x86_64", + "cp35-abi3-manylinux_2_32_x86_64", + "cp35-abi3-manylinux_2_31_x86_64", + "cp35-abi3-manylinux_2_30_x86_64", + "cp35-abi3-manylinux_2_29_x86_64", + "cp35-abi3-manylinux_2_28_x86_64", + "cp35-abi3-manylinux_2_27_x86_64", + "cp35-abi3-manylinux_2_26_x86_64", + "cp35-abi3-manylinux_2_25_x86_64", + "cp35-abi3-manylinux_2_24_x86_64", + "cp35-abi3-manylinux_2_23_x86_64", + "cp35-abi3-manylinux_2_22_x86_64", + "cp35-abi3-manylinux_2_21_x86_64", + "cp35-abi3-manylinux_2_20_x86_64", + "cp35-abi3-manylinux_2_19_x86_64", + "cp35-abi3-manylinux_2_18_x86_64", + "cp35-abi3-manylinux_2_17_x86_64", + "cp35-abi3-manylinux2014_x86_64", + "cp35-abi3-manylinux_2_16_x86_64", + "cp35-abi3-manylinux_2_15_x86_64", + "cp35-abi3-manylinux_2_14_x86_64", + "cp35-abi3-manylinux_2_13_x86_64", + "cp35-abi3-manylinux_2_12_x86_64", + "cp35-abi3-manylinux2010_x86_64", + "cp35-abi3-manylinux_2_11_x86_64", + "cp35-abi3-manylinux_2_10_x86_64", + "cp35-abi3-manylinux_2_9_x86_64", + "cp35-abi3-manylinux_2_8_x86_64", + "cp35-abi3-manylinux_2_7_x86_64", + "cp35-abi3-manylinux_2_6_x86_64", + "cp35-abi3-manylinux_2_5_x86_64", + "cp35-abi3-manylinux1_x86_64", + "cp35-abi3-linux_x86_64", + "cp34-abi3-manylinux_2_35_x86_64", + "cp34-abi3-manylinux_2_34_x86_64", + "cp34-abi3-manylinux_2_33_x86_64", + "cp34-abi3-manylinux_2_32_x86_64", + "cp34-abi3-manylinux_2_31_x86_64", + "cp34-abi3-manylinux_2_30_x86_64", + "cp34-abi3-manylinux_2_29_x86_64", + "cp34-abi3-manylinux_2_28_x86_64", + "cp34-abi3-manylinux_2_27_x86_64", + "cp34-abi3-manylinux_2_26_x86_64", + "cp34-abi3-manylinux_2_25_x86_64", + "cp34-abi3-manylinux_2_24_x86_64", + "cp34-abi3-manylinux_2_23_x86_64", + "cp34-abi3-manylinux_2_22_x86_64", + "cp34-abi3-manylinux_2_21_x86_64", + "cp34-abi3-manylinux_2_20_x86_64", + "cp34-abi3-manylinux_2_19_x86_64", + "cp34-abi3-manylinux_2_18_x86_64", + "cp34-abi3-manylinux_2_17_x86_64", + "cp34-abi3-manylinux2014_x86_64", + "cp34-abi3-manylinux_2_16_x86_64", + "cp34-abi3-manylinux_2_15_x86_64", + "cp34-abi3-manylinux_2_14_x86_64", + "cp34-abi3-manylinux_2_13_x86_64", + "cp34-abi3-manylinux_2_12_x86_64", + "cp34-abi3-manylinux2010_x86_64", + "cp34-abi3-manylinux_2_11_x86_64", + "cp34-abi3-manylinux_2_10_x86_64", + "cp34-abi3-manylinux_2_9_x86_64", + "cp34-abi3-manylinux_2_8_x86_64", + "cp34-abi3-manylinux_2_7_x86_64", + "cp34-abi3-manylinux_2_6_x86_64", + "cp34-abi3-manylinux_2_5_x86_64", + "cp34-abi3-manylinux1_x86_64", + "cp34-abi3-linux_x86_64", + "cp33-abi3-manylinux_2_35_x86_64", + "cp33-abi3-manylinux_2_34_x86_64", + "cp33-abi3-manylinux_2_33_x86_64", + "cp33-abi3-manylinux_2_32_x86_64", + "cp33-abi3-manylinux_2_31_x86_64", + "cp33-abi3-manylinux_2_30_x86_64", + "cp33-abi3-manylinux_2_29_x86_64", + "cp33-abi3-manylinux_2_28_x86_64", + "cp33-abi3-manylinux_2_27_x86_64", + "cp33-abi3-manylinux_2_26_x86_64", + "cp33-abi3-manylinux_2_25_x86_64", + "cp33-abi3-manylinux_2_24_x86_64", + "cp33-abi3-manylinux_2_23_x86_64", + "cp33-abi3-manylinux_2_22_x86_64", + "cp33-abi3-manylinux_2_21_x86_64", + "cp33-abi3-manylinux_2_20_x86_64", + "cp33-abi3-manylinux_2_19_x86_64", + "cp33-abi3-manylinux_2_18_x86_64", + "cp33-abi3-manylinux_2_17_x86_64", + "cp33-abi3-manylinux2014_x86_64", + "cp33-abi3-manylinux_2_16_x86_64", + "cp33-abi3-manylinux_2_15_x86_64", + "cp33-abi3-manylinux_2_14_x86_64", + "cp33-abi3-manylinux_2_13_x86_64", + "cp33-abi3-manylinux_2_12_x86_64", + "cp33-abi3-manylinux2010_x86_64", + "cp33-abi3-manylinux_2_11_x86_64", + "cp33-abi3-manylinux_2_10_x86_64", + "cp33-abi3-manylinux_2_9_x86_64", + "cp33-abi3-manylinux_2_8_x86_64", + "cp33-abi3-manylinux_2_7_x86_64", + "cp33-abi3-manylinux_2_6_x86_64", + "cp33-abi3-manylinux_2_5_x86_64", + "cp33-abi3-manylinux1_x86_64", + "cp33-abi3-linux_x86_64", + "cp32-abi3-manylinux_2_35_x86_64", + "cp32-abi3-manylinux_2_34_x86_64", + "cp32-abi3-manylinux_2_33_x86_64", + "cp32-abi3-manylinux_2_32_x86_64", + "cp32-abi3-manylinux_2_31_x86_64", + "cp32-abi3-manylinux_2_30_x86_64", + "cp32-abi3-manylinux_2_29_x86_64", + "cp32-abi3-manylinux_2_28_x86_64", + "cp32-abi3-manylinux_2_27_x86_64", + "cp32-abi3-manylinux_2_26_x86_64", + "cp32-abi3-manylinux_2_25_x86_64", + "cp32-abi3-manylinux_2_24_x86_64", + "cp32-abi3-manylinux_2_23_x86_64", + "cp32-abi3-manylinux_2_22_x86_64", + "cp32-abi3-manylinux_2_21_x86_64", + "cp32-abi3-manylinux_2_20_x86_64", + "cp32-abi3-manylinux_2_19_x86_64", + "cp32-abi3-manylinux_2_18_x86_64", + "cp32-abi3-manylinux_2_17_x86_64", + "cp32-abi3-manylinux2014_x86_64", + "cp32-abi3-manylinux_2_16_x86_64", + "cp32-abi3-manylinux_2_15_x86_64", + "cp32-abi3-manylinux_2_14_x86_64", + "cp32-abi3-manylinux_2_13_x86_64", + "cp32-abi3-manylinux_2_12_x86_64", + "cp32-abi3-manylinux2010_x86_64", + "cp32-abi3-manylinux_2_11_x86_64", + "cp32-abi3-manylinux_2_10_x86_64", + "cp32-abi3-manylinux_2_9_x86_64", + "cp32-abi3-manylinux_2_8_x86_64", + "cp32-abi3-manylinux_2_7_x86_64", + "cp32-abi3-manylinux_2_6_x86_64", + "cp32-abi3-manylinux_2_5_x86_64", + "cp32-abi3-manylinux1_x86_64", + "cp32-abi3-linux_x86_64", + "py311-none-manylinux_2_35_x86_64", + "py311-none-manylinux_2_34_x86_64", + "py311-none-manylinux_2_33_x86_64", + "py311-none-manylinux_2_32_x86_64", + "py311-none-manylinux_2_31_x86_64", + "py311-none-manylinux_2_30_x86_64", + "py311-none-manylinux_2_29_x86_64", + "py311-none-manylinux_2_28_x86_64", + "py311-none-manylinux_2_27_x86_64", + "py311-none-manylinux_2_26_x86_64", + "py311-none-manylinux_2_25_x86_64", + "py311-none-manylinux_2_24_x86_64", + "py311-none-manylinux_2_23_x86_64", + "py311-none-manylinux_2_22_x86_64", + "py311-none-manylinux_2_21_x86_64", + "py311-none-manylinux_2_20_x86_64", + "py311-none-manylinux_2_19_x86_64", + "py311-none-manylinux_2_18_x86_64", + "py311-none-manylinux_2_17_x86_64", + "py311-none-manylinux2014_x86_64", + "py311-none-manylinux_2_16_x86_64", + "py311-none-manylinux_2_15_x86_64", + "py311-none-manylinux_2_14_x86_64", + "py311-none-manylinux_2_13_x86_64", + "py311-none-manylinux_2_12_x86_64", + "py311-none-manylinux2010_x86_64", + "py311-none-manylinux_2_11_x86_64", + "py311-none-manylinux_2_10_x86_64", + "py311-none-manylinux_2_9_x86_64", + "py311-none-manylinux_2_8_x86_64", + "py311-none-manylinux_2_7_x86_64", + "py311-none-manylinux_2_6_x86_64", + "py311-none-manylinux_2_5_x86_64", + "py311-none-manylinux1_x86_64", + "py311-none-linux_x86_64", + "py3-none-manylinux_2_35_x86_64", + "py3-none-manylinux_2_34_x86_64", + "py3-none-manylinux_2_33_x86_64", + "py3-none-manylinux_2_32_x86_64", + "py3-none-manylinux_2_31_x86_64", + "py3-none-manylinux_2_30_x86_64", + "py3-none-manylinux_2_29_x86_64", + "py3-none-manylinux_2_28_x86_64", + "py3-none-manylinux_2_27_x86_64", + "py3-none-manylinux_2_26_x86_64", + "py3-none-manylinux_2_25_x86_64", + "py3-none-manylinux_2_24_x86_64", + "py3-none-manylinux_2_23_x86_64", + "py3-none-manylinux_2_22_x86_64", + "py3-none-manylinux_2_21_x86_64", + "py3-none-manylinux_2_20_x86_64", + "py3-none-manylinux_2_19_x86_64", + "py3-none-manylinux_2_18_x86_64", + "py3-none-manylinux_2_17_x86_64", + "py3-none-manylinux2014_x86_64", + "py3-none-manylinux_2_16_x86_64", + "py3-none-manylinux_2_15_x86_64", + "py3-none-manylinux_2_14_x86_64", + "py3-none-manylinux_2_13_x86_64", + "py3-none-manylinux_2_12_x86_64", + "py3-none-manylinux2010_x86_64", + "py3-none-manylinux_2_11_x86_64", + "py3-none-manylinux_2_10_x86_64", + "py3-none-manylinux_2_9_x86_64", + "py3-none-manylinux_2_8_x86_64", + "py3-none-manylinux_2_7_x86_64", + "py3-none-manylinux_2_6_x86_64", + "py3-none-manylinux_2_5_x86_64", + "py3-none-manylinux1_x86_64", + "py3-none-linux_x86_64", + "py310-none-manylinux_2_35_x86_64", + "py310-none-manylinux_2_34_x86_64", + "py310-none-manylinux_2_33_x86_64", + "py310-none-manylinux_2_32_x86_64", + "py310-none-manylinux_2_31_x86_64", + "py310-none-manylinux_2_30_x86_64", + "py310-none-manylinux_2_29_x86_64", + "py310-none-manylinux_2_28_x86_64", + "py310-none-manylinux_2_27_x86_64", + "py310-none-manylinux_2_26_x86_64", + "py310-none-manylinux_2_25_x86_64", + "py310-none-manylinux_2_24_x86_64", + "py310-none-manylinux_2_23_x86_64", + "py310-none-manylinux_2_22_x86_64", + "py310-none-manylinux_2_21_x86_64", + "py310-none-manylinux_2_20_x86_64", + "py310-none-manylinux_2_19_x86_64", + "py310-none-manylinux_2_18_x86_64", + "py310-none-manylinux_2_17_x86_64", + "py310-none-manylinux2014_x86_64", + "py310-none-manylinux_2_16_x86_64", + "py310-none-manylinux_2_15_x86_64", + "py310-none-manylinux_2_14_x86_64", + "py310-none-manylinux_2_13_x86_64", + "py310-none-manylinux_2_12_x86_64", + "py310-none-manylinux2010_x86_64", + "py310-none-manylinux_2_11_x86_64", + "py310-none-manylinux_2_10_x86_64", + "py310-none-manylinux_2_9_x86_64", + "py310-none-manylinux_2_8_x86_64", + "py310-none-manylinux_2_7_x86_64", + "py310-none-manylinux_2_6_x86_64", + "py310-none-manylinux_2_5_x86_64", + "py310-none-manylinux1_x86_64", + "py310-none-linux_x86_64", + "py39-none-manylinux_2_35_x86_64", + "py39-none-manylinux_2_34_x86_64", + "py39-none-manylinux_2_33_x86_64", + "py39-none-manylinux_2_32_x86_64", + "py39-none-manylinux_2_31_x86_64", + "py39-none-manylinux_2_30_x86_64", + "py39-none-manylinux_2_29_x86_64", + "py39-none-manylinux_2_28_x86_64", + "py39-none-manylinux_2_27_x86_64", + "py39-none-manylinux_2_26_x86_64", + "py39-none-manylinux_2_25_x86_64", + "py39-none-manylinux_2_24_x86_64", + "py39-none-manylinux_2_23_x86_64", + "py39-none-manylinux_2_22_x86_64", + "py39-none-manylinux_2_21_x86_64", + "py39-none-manylinux_2_20_x86_64", + "py39-none-manylinux_2_19_x86_64", + "py39-none-manylinux_2_18_x86_64", + "py39-none-manylinux_2_17_x86_64", + "py39-none-manylinux2014_x86_64", + "py39-none-manylinux_2_16_x86_64", + "py39-none-manylinux_2_15_x86_64", + "py39-none-manylinux_2_14_x86_64", + "py39-none-manylinux_2_13_x86_64", + "py39-none-manylinux_2_12_x86_64", + "py39-none-manylinux2010_x86_64", + "py39-none-manylinux_2_11_x86_64", + "py39-none-manylinux_2_10_x86_64", + "py39-none-manylinux_2_9_x86_64", + "py39-none-manylinux_2_8_x86_64", + "py39-none-manylinux_2_7_x86_64", + "py39-none-manylinux_2_6_x86_64", + "py39-none-manylinux_2_5_x86_64", + "py39-none-manylinux1_x86_64", + "py39-none-linux_x86_64", + "py38-none-manylinux_2_35_x86_64", + "py38-none-manylinux_2_34_x86_64", + "py38-none-manylinux_2_33_x86_64", + "py38-none-manylinux_2_32_x86_64", + "py38-none-manylinux_2_31_x86_64", + "py38-none-manylinux_2_30_x86_64", + "py38-none-manylinux_2_29_x86_64", + "py38-none-manylinux_2_28_x86_64", + "py38-none-manylinux_2_27_x86_64", + "py38-none-manylinux_2_26_x86_64", + "py38-none-manylinux_2_25_x86_64", + "py38-none-manylinux_2_24_x86_64", + "py38-none-manylinux_2_23_x86_64", + "py38-none-manylinux_2_22_x86_64", + "py38-none-manylinux_2_21_x86_64", + "py38-none-manylinux_2_20_x86_64", + "py38-none-manylinux_2_19_x86_64", + "py38-none-manylinux_2_18_x86_64", + "py38-none-manylinux_2_17_x86_64", + "py38-none-manylinux2014_x86_64", + "py38-none-manylinux_2_16_x86_64", + "py38-none-manylinux_2_15_x86_64", + "py38-none-manylinux_2_14_x86_64", + "py38-none-manylinux_2_13_x86_64", + "py38-none-manylinux_2_12_x86_64", + "py38-none-manylinux2010_x86_64", + "py38-none-manylinux_2_11_x86_64", + "py38-none-manylinux_2_10_x86_64", + "py38-none-manylinux_2_9_x86_64", + "py38-none-manylinux_2_8_x86_64", + "py38-none-manylinux_2_7_x86_64", + "py38-none-manylinux_2_6_x86_64", + "py38-none-manylinux_2_5_x86_64", + "py38-none-manylinux1_x86_64", + "py38-none-linux_x86_64", + "py37-none-manylinux_2_35_x86_64", + "py37-none-manylinux_2_34_x86_64", + "py37-none-manylinux_2_33_x86_64", + "py37-none-manylinux_2_32_x86_64", + "py37-none-manylinux_2_31_x86_64", + "py37-none-manylinux_2_30_x86_64", + "py37-none-manylinux_2_29_x86_64", + "py37-none-manylinux_2_28_x86_64", + "py37-none-manylinux_2_27_x86_64", + "py37-none-manylinux_2_26_x86_64", + "py37-none-manylinux_2_25_x86_64", + "py37-none-manylinux_2_24_x86_64", + "py37-none-manylinux_2_23_x86_64", + "py37-none-manylinux_2_22_x86_64", + "py37-none-manylinux_2_21_x86_64", + "py37-none-manylinux_2_20_x86_64", + "py37-none-manylinux_2_19_x86_64", + "py37-none-manylinux_2_18_x86_64", + "py37-none-manylinux_2_17_x86_64", + "py37-none-manylinux2014_x86_64", + "py37-none-manylinux_2_16_x86_64", + "py37-none-manylinux_2_15_x86_64", + "py37-none-manylinux_2_14_x86_64", + "py37-none-manylinux_2_13_x86_64", + "py37-none-manylinux_2_12_x86_64", + "py37-none-manylinux2010_x86_64", + "py37-none-manylinux_2_11_x86_64", + "py37-none-manylinux_2_10_x86_64", + "py37-none-manylinux_2_9_x86_64", + "py37-none-manylinux_2_8_x86_64", + "py37-none-manylinux_2_7_x86_64", + "py37-none-manylinux_2_6_x86_64", + "py37-none-manylinux_2_5_x86_64", + "py37-none-manylinux1_x86_64", + "py37-none-linux_x86_64", + "py36-none-manylinux_2_35_x86_64", + "py36-none-manylinux_2_34_x86_64", + "py36-none-manylinux_2_33_x86_64", + "py36-none-manylinux_2_32_x86_64", + "py36-none-manylinux_2_31_x86_64", + "py36-none-manylinux_2_30_x86_64", + "py36-none-manylinux_2_29_x86_64", + "py36-none-manylinux_2_28_x86_64", + "py36-none-manylinux_2_27_x86_64", + "py36-none-manylinux_2_26_x86_64", + "py36-none-manylinux_2_25_x86_64", + "py36-none-manylinux_2_24_x86_64", + "py36-none-manylinux_2_23_x86_64", + "py36-none-manylinux_2_22_x86_64", + "py36-none-manylinux_2_21_x86_64", + "py36-none-manylinux_2_20_x86_64", + "py36-none-manylinux_2_19_x86_64", + "py36-none-manylinux_2_18_x86_64", + "py36-none-manylinux_2_17_x86_64", + "py36-none-manylinux2014_x86_64", + "py36-none-manylinux_2_16_x86_64", + "py36-none-manylinux_2_15_x86_64", + "py36-none-manylinux_2_14_x86_64", + "py36-none-manylinux_2_13_x86_64", + "py36-none-manylinux_2_12_x86_64", + "py36-none-manylinux2010_x86_64", + "py36-none-manylinux_2_11_x86_64", + "py36-none-manylinux_2_10_x86_64", + "py36-none-manylinux_2_9_x86_64", + "py36-none-manylinux_2_8_x86_64", + "py36-none-manylinux_2_7_x86_64", + "py36-none-manylinux_2_6_x86_64", + "py36-none-manylinux_2_5_x86_64", + "py36-none-manylinux1_x86_64", + "py36-none-linux_x86_64", + "py35-none-manylinux_2_35_x86_64", + "py35-none-manylinux_2_34_x86_64", + "py35-none-manylinux_2_33_x86_64", + "py35-none-manylinux_2_32_x86_64", + "py35-none-manylinux_2_31_x86_64", + "py35-none-manylinux_2_30_x86_64", + "py35-none-manylinux_2_29_x86_64", + "py35-none-manylinux_2_28_x86_64", + "py35-none-manylinux_2_27_x86_64", + "py35-none-manylinux_2_26_x86_64", + "py35-none-manylinux_2_25_x86_64", + "py35-none-manylinux_2_24_x86_64", + "py35-none-manylinux_2_23_x86_64", + "py35-none-manylinux_2_22_x86_64", + "py35-none-manylinux_2_21_x86_64", + "py35-none-manylinux_2_20_x86_64", + "py35-none-manylinux_2_19_x86_64", + "py35-none-manylinux_2_18_x86_64", + "py35-none-manylinux_2_17_x86_64", + "py35-none-manylinux2014_x86_64", + "py35-none-manylinux_2_16_x86_64", + "py35-none-manylinux_2_15_x86_64", + "py35-none-manylinux_2_14_x86_64", + "py35-none-manylinux_2_13_x86_64", + "py35-none-manylinux_2_12_x86_64", + "py35-none-manylinux2010_x86_64", + "py35-none-manylinux_2_11_x86_64", + "py35-none-manylinux_2_10_x86_64", + "py35-none-manylinux_2_9_x86_64", + "py35-none-manylinux_2_8_x86_64", + "py35-none-manylinux_2_7_x86_64", + "py35-none-manylinux_2_6_x86_64", + "py35-none-manylinux_2_5_x86_64", + "py35-none-manylinux1_x86_64", + "py35-none-linux_x86_64", + "py34-none-manylinux_2_35_x86_64", + "py34-none-manylinux_2_34_x86_64", + "py34-none-manylinux_2_33_x86_64", + "py34-none-manylinux_2_32_x86_64", + "py34-none-manylinux_2_31_x86_64", + "py34-none-manylinux_2_30_x86_64", + "py34-none-manylinux_2_29_x86_64", + "py34-none-manylinux_2_28_x86_64", + "py34-none-manylinux_2_27_x86_64", + "py34-none-manylinux_2_26_x86_64", + "py34-none-manylinux_2_25_x86_64", + "py34-none-manylinux_2_24_x86_64", + "py34-none-manylinux_2_23_x86_64", + "py34-none-manylinux_2_22_x86_64", + "py34-none-manylinux_2_21_x86_64", + "py34-none-manylinux_2_20_x86_64", + "py34-none-manylinux_2_19_x86_64", + "py34-none-manylinux_2_18_x86_64", + "py34-none-manylinux_2_17_x86_64", + "py34-none-manylinux2014_x86_64", + "py34-none-manylinux_2_16_x86_64", + "py34-none-manylinux_2_15_x86_64", + "py34-none-manylinux_2_14_x86_64", + "py34-none-manylinux_2_13_x86_64", + "py34-none-manylinux_2_12_x86_64", + "py34-none-manylinux2010_x86_64", + "py34-none-manylinux_2_11_x86_64", + "py34-none-manylinux_2_10_x86_64", + "py34-none-manylinux_2_9_x86_64", + "py34-none-manylinux_2_8_x86_64", + "py34-none-manylinux_2_7_x86_64", + "py34-none-manylinux_2_6_x86_64", + "py34-none-manylinux_2_5_x86_64", + "py34-none-manylinux1_x86_64", + "py34-none-linux_x86_64", + "py33-none-manylinux_2_35_x86_64", + "py33-none-manylinux_2_34_x86_64", + "py33-none-manylinux_2_33_x86_64", + "py33-none-manylinux_2_32_x86_64", + "py33-none-manylinux_2_31_x86_64", + "py33-none-manylinux_2_30_x86_64", + "py33-none-manylinux_2_29_x86_64", + "py33-none-manylinux_2_28_x86_64", + "py33-none-manylinux_2_27_x86_64", + "py33-none-manylinux_2_26_x86_64", + "py33-none-manylinux_2_25_x86_64", + "py33-none-manylinux_2_24_x86_64", + "py33-none-manylinux_2_23_x86_64", + "py33-none-manylinux_2_22_x86_64", + "py33-none-manylinux_2_21_x86_64", + "py33-none-manylinux_2_20_x86_64", + "py33-none-manylinux_2_19_x86_64", + "py33-none-manylinux_2_18_x86_64", + "py33-none-manylinux_2_17_x86_64", + "py33-none-manylinux2014_x86_64", + "py33-none-manylinux_2_16_x86_64", + "py33-none-manylinux_2_15_x86_64", + "py33-none-manylinux_2_14_x86_64", + "py33-none-manylinux_2_13_x86_64", + "py33-none-manylinux_2_12_x86_64", + "py33-none-manylinux2010_x86_64", + "py33-none-manylinux_2_11_x86_64", + "py33-none-manylinux_2_10_x86_64", + "py33-none-manylinux_2_9_x86_64", + "py33-none-manylinux_2_8_x86_64", + "py33-none-manylinux_2_7_x86_64", + "py33-none-manylinux_2_6_x86_64", + "py33-none-manylinux_2_5_x86_64", + "py33-none-manylinux1_x86_64", + "py33-none-linux_x86_64", + "py32-none-manylinux_2_35_x86_64", + "py32-none-manylinux_2_34_x86_64", + "py32-none-manylinux_2_33_x86_64", + "py32-none-manylinux_2_32_x86_64", + "py32-none-manylinux_2_31_x86_64", + "py32-none-manylinux_2_30_x86_64", + "py32-none-manylinux_2_29_x86_64", + "py32-none-manylinux_2_28_x86_64", + "py32-none-manylinux_2_27_x86_64", + "py32-none-manylinux_2_26_x86_64", + "py32-none-manylinux_2_25_x86_64", + "py32-none-manylinux_2_24_x86_64", + "py32-none-manylinux_2_23_x86_64", + "py32-none-manylinux_2_22_x86_64", + "py32-none-manylinux_2_21_x86_64", + "py32-none-manylinux_2_20_x86_64", + "py32-none-manylinux_2_19_x86_64", + "py32-none-manylinux_2_18_x86_64", + "py32-none-manylinux_2_17_x86_64", + "py32-none-manylinux2014_x86_64", + "py32-none-manylinux_2_16_x86_64", + "py32-none-manylinux_2_15_x86_64", + "py32-none-manylinux_2_14_x86_64", + "py32-none-manylinux_2_13_x86_64", + "py32-none-manylinux_2_12_x86_64", + "py32-none-manylinux2010_x86_64", + "py32-none-manylinux_2_11_x86_64", + "py32-none-manylinux_2_10_x86_64", + "py32-none-manylinux_2_9_x86_64", + "py32-none-manylinux_2_8_x86_64", + "py32-none-manylinux_2_7_x86_64", + "py32-none-manylinux_2_6_x86_64", + "py32-none-manylinux_2_5_x86_64", + "py32-none-manylinux1_x86_64", + "py32-none-linux_x86_64", + "py31-none-manylinux_2_35_x86_64", + "py31-none-manylinux_2_34_x86_64", + "py31-none-manylinux_2_33_x86_64", + "py31-none-manylinux_2_32_x86_64", + "py31-none-manylinux_2_31_x86_64", + "py31-none-manylinux_2_30_x86_64", + "py31-none-manylinux_2_29_x86_64", + "py31-none-manylinux_2_28_x86_64", + "py31-none-manylinux_2_27_x86_64", + "py31-none-manylinux_2_26_x86_64", + "py31-none-manylinux_2_25_x86_64", + "py31-none-manylinux_2_24_x86_64", + "py31-none-manylinux_2_23_x86_64", + "py31-none-manylinux_2_22_x86_64", + "py31-none-manylinux_2_21_x86_64", + "py31-none-manylinux_2_20_x86_64", + "py31-none-manylinux_2_19_x86_64", + "py31-none-manylinux_2_18_x86_64", + "py31-none-manylinux_2_17_x86_64", + "py31-none-manylinux2014_x86_64", + "py31-none-manylinux_2_16_x86_64", + "py31-none-manylinux_2_15_x86_64", + "py31-none-manylinux_2_14_x86_64", + "py31-none-manylinux_2_13_x86_64", + "py31-none-manylinux_2_12_x86_64", + "py31-none-manylinux2010_x86_64", + "py31-none-manylinux_2_11_x86_64", + "py31-none-manylinux_2_10_x86_64", + "py31-none-manylinux_2_9_x86_64", + "py31-none-manylinux_2_8_x86_64", + "py31-none-manylinux_2_7_x86_64", + "py31-none-manylinux_2_6_x86_64", + "py31-none-manylinux_2_5_x86_64", + "py31-none-manylinux1_x86_64", + "py31-none-linux_x86_64", + "py30-none-manylinux_2_35_x86_64", + "py30-none-manylinux_2_34_x86_64", + "py30-none-manylinux_2_33_x86_64", + "py30-none-manylinux_2_32_x86_64", + "py30-none-manylinux_2_31_x86_64", + "py30-none-manylinux_2_30_x86_64", + "py30-none-manylinux_2_29_x86_64", + "py30-none-manylinux_2_28_x86_64", + "py30-none-manylinux_2_27_x86_64", + "py30-none-manylinux_2_26_x86_64", + "py30-none-manylinux_2_25_x86_64", + "py30-none-manylinux_2_24_x86_64", + "py30-none-manylinux_2_23_x86_64", + "py30-none-manylinux_2_22_x86_64", + "py30-none-manylinux_2_21_x86_64", + "py30-none-manylinux_2_20_x86_64", + "py30-none-manylinux_2_19_x86_64", + "py30-none-manylinux_2_18_x86_64", + "py30-none-manylinux_2_17_x86_64", + "py30-none-manylinux2014_x86_64", + "py30-none-manylinux_2_16_x86_64", + "py30-none-manylinux_2_15_x86_64", + "py30-none-manylinux_2_14_x86_64", + "py30-none-manylinux_2_13_x86_64", + "py30-none-manylinux_2_12_x86_64", + "py30-none-manylinux2010_x86_64", + "py30-none-manylinux_2_11_x86_64", + "py30-none-manylinux_2_10_x86_64", + "py30-none-manylinux_2_9_x86_64", + "py30-none-manylinux_2_8_x86_64", + "py30-none-manylinux_2_7_x86_64", + "py30-none-manylinux_2_6_x86_64", + "py30-none-manylinux_2_5_x86_64", + "py30-none-manylinux1_x86_64", + "py30-none-linux_x86_64", + "cp311-none-any", + "py311-none-any", + "py3-none-any", + "py310-none-any", + "py39-none-any", + "py38-none-any", + "py37-none-any", + "py36-none-any", + "py35-none-any", + "py34-none-any", + "py33-none-any", + "py32-none-any", + "py31-none-any", + "py30-none-any" + ], + "marker_environment": { + "implementation_name": "cpython", + "implementation_version": "3.11.9", + "os_name": "posix", + "platform_machine": "x86_64", + "platform_python_implementation": "CPython", + "platform_release": "5.15.146.1-microsoft-standard-WSL2", + "platform_system": "Linux", + "platform_version": "#1 SMP Thu Jan 11 04:09:03 UTC 2024", + "python_full_version": "3.11.9", + "python_version": "3.11", + "sys_platform": "linux" + } +} diff --git a/tests/integration/test_downloads.py b/tests/integration/test_downloads.py index 582d4005c..2ea026f74 100644 --- a/tests/integration/test_downloads.py +++ b/tests/integration/test_downloads.py @@ -7,7 +7,7 @@ from pex.resolve.configured_resolver import ConfiguredResolver from pex.resolve.downloads import ArtifactDownloader -from pex.resolve.locked_resolve import Artifact, FileArtifact +from pex.resolve.locked_resolve import Artifact, FileArtifact, LockConfiguration, LockStyle from pex.resolve.resolved_requirement import Fingerprint, PartialArtifact from pex.typing import TYPE_CHECKING from testing import IS_LINUX @@ -54,7 +54,10 @@ def file_artifact( @pytest.fixture def downloader(): # type: () -> ArtifactDownloader - return ArtifactDownloader(ConfiguredResolver.default()) + return ArtifactDownloader( + resolver=ConfiguredResolver.default(), + lock_configuration=LockConfiguration(style=LockStyle.UNIVERSAL), + ) def test_issue_1849_download_foreign_artifact( diff --git a/tests/integration/test_issue_1726.py b/tests/integration/test_issue_1726.py index 858fc882c..c6be497e3 100644 --- a/tests/integration/test_issue_1726.py +++ b/tests/integration/test_issue_1726.py @@ -62,6 +62,8 @@ def test_check_install_issue_1726( src, "--constraints", constraints, + "--resolver-version", + "pip-2020-resolver", "--", "-c", "from jaraco import collections; print(collections.__file__)", diff --git a/tests/integration/test_issue_2391.py b/tests/integration/test_issue_2391.py index 6de9f9b83..84c013a92 100644 --- a/tests/integration/test_issue_2391.py +++ b/tests/integration/test_issue_2391.py @@ -1,4 +1,4 @@ -# Copyright 2014 Pex project contributors. +# Copyright 2024 Pex project contributors. # Licensed under the Apache License, Version 2.0 (see LICENSE). import os.path diff --git a/tests/integration/test_issue_2395.py b/tests/integration/test_issue_2395.py new file mode 100644 index 000000000..fd7d4dea8 --- /dev/null +++ b/tests/integration/test_issue_2395.py @@ -0,0 +1,56 @@ +# Copyright 2024 Pex project contributors. +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +import os.path +import shutil +import sys + +from pex.typing import TYPE_CHECKING +from testing import PY39, data, ensure_python_interpreter, run_pex_command +from testing.cli import run_pex3 + +if TYPE_CHECKING: + from typing import Any + + +def test_download_incompatible_python(tmpdir): + # type: (Any) -> None + + python = ensure_python_interpreter(PY39) if sys.version_info >= (3, 10) else sys.executable + + pex_root = os.path.join(str(tmpdir), "pex_root") + lock = os.path.join(str(tmpdir), "lock.json") + run_pex3( + "lock", + "create", + "--pex-root", + pex_root, + "--style", + "universal", + "--interpreter-constraint", + "CPython==3.11.*", + "pbipy==2.8.2", + "--indent", + "2", + "-o", + lock, + python=python, + ).assert_success() + + complete_platform = data.path("platforms", "complete_platform_linux_x86-64_py11.json") + pex = os.path.join(str(tmpdir), "pex") + shutil.rmtree(pex_root) + run_pex_command( + args=[ + "--pex-root", + pex_root, + "--complete-platform", + complete_platform, + "pbipy==2.8.2", + "--lock", + lock, + "-o", + pex, + ], + python=python, + ).assert_success() diff --git a/tests/resolve/test_pex_repository_resolver.py b/tests/resolve/test_pex_repository_resolver.py index a8c165f24..299fd2c5e 100644 --- a/tests/resolve/test_pex_repository_resolver.py +++ b/tests/resolve/test_pex_repository_resolver.py @@ -130,6 +130,8 @@ def pex_repository( "pyOpenSSL<22", # The 2022 and later releases only support Python>=3.6; so we pin lower. "certifi<2022", + # The 2.22 release of pycparser drops support for Python 2.7. + "pycparser<2.22", ) return create_pex_repository(