1212from pex .dist_metadata import DistributionType , Requirement
1313from pex .interpreter import PythonInterpreter
1414from pex .pep_427 import InstallableType
15- from pex .pex_builder import PEXBuilder
1615from pex .pex_info import PexInfo
1716from pex .platforms import Platform
1817from pex .requirements import parse_requirement_string , parse_requirement_strings
1918from pex .resolve import abbreviated_platforms
20- from pex .resolve .configured_resolver import ConfiguredResolver
2119from pex .resolve .pex_repository_resolver import resolve_from_pex
22- from pex .resolve .resolver_configuration import PipConfiguration
2320from pex .resolve .resolvers import ResolveResult , Unsatisfiable
24- from pex .resolver import resolve
2521from pex .sysconfig import SysPlatform
2622from pex .targets import Targets
27- from pex .typing import TYPE_CHECKING , cast
28- from testing import IS_LINUX , PY27 , PY310 , ensure_python_interpreter
23+ from pex .typing import TYPE_CHECKING
24+ from testing import IS_LINUX , run_pex_command
25+ from testing .pytest_utils .tmp import Tempdir
2926
3027if TYPE_CHECKING :
3128 from typing import DefaultDict , Iterable , Optional , Set
3431
3532
3633def create_pex_repository (
34+ tmpdir , # type: Tempdir
3735 interpreters = None , # type: Optional[Iterable[PythonInterpreter]]
3836 platforms = None , # type: Optional[Iterable[Platform]]
3937 requirements = None , # type: Optional[Iterable[ParsedRequirement]]
@@ -42,24 +40,36 @@ def create_pex_repository(
4240 result_type = InstallableType .INSTALLED_WHEEL_CHROOT , # type: InstallableType.Value
4341):
4442 # type: (...) -> str
45- pex_builder = PEXBuilder ()
46- pex_builder .info .deps_are_wheel_files = result_type is InstallableType .WHEEL_FILE
47- for resolved_dist in resolve (
48- targets = Targets (
49- interpreters = tuple (interpreters ) if interpreters else (),
50- platforms = tuple (platforms ) if platforms else (),
51- ),
52- requirements = requirements ,
53- requirement_files = requirement_files ,
54- constraint_files = constraint_files ,
55- resolver = ConfiguredResolver (PipConfiguration ()),
56- result_type = result_type ,
57- ).distributions :
58- pex_builder .add_distribution (resolved_dist .distribution )
59- for direct_req in resolved_dist .direct_requirements :
60- pex_builder .add_requirement (direct_req )
61- pex_builder .freeze ()
62- return os .path .realpath (cast (str , pex_builder .path ()))
43+ pex_repository = tmpdir .join ("repository.pex" )
44+ args = [
45+ "--pip-version" ,
46+ "latest-compatible" ,
47+ "--resolver-version" ,
48+ "pip-2020-resolver" ,
49+ "--layout" ,
50+ "loose" ,
51+ "-o" ,
52+ pex_repository ,
53+ ]
54+ python = None # type: Optional[str]
55+ for interpreter in interpreters or ():
56+ args .append ("--python" )
57+ args .append (interpreter .binary )
58+ python = interpreter .binary
59+ for platform in platforms or ():
60+ args .append ("--abbreviated-platform" )
61+ args .append (str (platform ))
62+ args .extend (str (req ) for req in requirements or ())
63+ for requirement_file in requirement_files or ():
64+ args .append ("-r" )
65+ args .append (requirement_file )
66+ for constraint_file in constraint_files or ():
67+ args .append ("--constraints" )
68+ args .append (constraint_file )
69+ if result_type == InstallableType .WHEEL_FILE :
70+ args .append ("--no-pre-install-wheels" )
71+ run_pex_command (args = args , python = python ).assert_success ()
72+ return pex_repository
6373
6474
6575def create_constraints_file (* requirements ):
@@ -71,31 +81,19 @@ def create_constraints_file(*requirements):
7181 return constraints_file
7282
7383
74- @pytest .fixture (scope = "module" )
75- def py27 ():
76- # type: () -> PythonInterpreter
77- return PythonInterpreter .from_binary (ensure_python_interpreter (PY27 ))
78-
79-
80- @pytest .fixture (scope = "module" )
81- def py310 ():
82- # type: () -> PythonInterpreter
83- return PythonInterpreter .from_binary (ensure_python_interpreter (PY310 ))
84-
85-
86- @pytest .fixture (scope = "module" )
84+ @pytest .fixture
8785def macosx ():
8886 # type: () -> Platform
8987 return abbreviated_platforms .create ("macosx-10.13-x86_64-cp-36-m" )
9088
9189
92- @pytest .fixture ( scope = "module" )
90+ @pytest .fixture
9391def linux ():
9492 # type: () -> Platform
9593 return abbreviated_platforms .create ("linux-x86_64-cp-36-m" , manylinux = "manylinux2014" )
9694
9795
98- @pytest .fixture ( scope = "module" )
96+ @pytest .fixture
9997def foreign_platform (
10098 macosx , # type: Platform
10199 linux , # type: Platform
@@ -105,13 +103,13 @@ def foreign_platform(
105103
106104
107105@pytest .fixture (
108- scope = "module" ,
109106 params = [
110107 pytest .param (installable_type , id = installable_type .value )
111108 for installable_type in InstallableType .values ()
112109 ],
113110)
114111def pex_repository (
112+ tmpdir , # type: Tempdir
115113 py27 , # type: PythonInterpreter
116114 py310 , # type: PythonInterpreter
117115 foreign_platform , # type: Platform
@@ -138,6 +136,7 @@ def pex_repository(
138136 )
139137
140138 return create_pex_repository (
139+ tmpdir ,
141140 interpreters = [py27 , py310 ],
142141 platforms = [foreign_platform ],
143142 requirements = [parse_requirement_string ("requests[security,socks]==2.25.1" )],
0 commit comments