pex 2.54.2__py2.py3-none-any.whl → 2.69.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pex might be problematic. Click here for more details.
- pex/auth.py +1 -1
- pex/bin/pex.py +15 -2
- pex/build_backend/configuration.py +5 -5
- pex/build_backend/wrap.py +27 -23
- pex/build_system/pep_517.py +4 -1
- pex/cache/dirs.py +17 -12
- pex/cli/commands/lock.py +302 -165
- pex/cli/commands/pip/core.py +4 -12
- pex/cli/commands/pip/wheel.py +1 -1
- pex/cli/commands/run.py +13 -20
- pex/cli/commands/venv.py +85 -16
- pex/cli/pex.py +11 -4
- pex/common.py +57 -7
- pex/compatibility.py +1 -1
- pex/dependency_configuration.py +87 -15
- pex/dist_metadata.py +143 -25
- pex/docs/html/_pagefind/fragment/en_4250138.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_7125dad.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_785d562.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_8e94bb8.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_a0396bb.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_a8a3588.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_c07d988.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_d718411.pf_fragment +0 -0
- pex/docs/html/_pagefind/index/en_a2e3c5e.pf_index +0 -0
- pex/docs/html/_pagefind/pagefind-entry.json +1 -1
- pex/docs/html/_pagefind/pagefind.en_4ce1afa9e3.pf_meta +0 -0
- pex/docs/html/_static/documentation_options.js +1 -1
- pex/docs/html/_static/pygments.css +164 -146
- pex/docs/html/_static/styles/furo.css +1 -1
- pex/docs/html/_static/styles/furo.css.map +1 -1
- pex/docs/html/api/vars.html +25 -34
- pex/docs/html/buildingpex.html +25 -34
- pex/docs/html/genindex.html +24 -33
- pex/docs/html/index.html +25 -34
- pex/docs/html/recipes.html +25 -34
- pex/docs/html/scie.html +25 -34
- pex/docs/html/search.html +24 -33
- pex/docs/html/whatispex.html +25 -34
- pex/entry_points_txt.py +98 -0
- pex/environment.py +54 -33
- pex/finders.py +1 -1
- pex/hashing.py +71 -9
- pex/installed_wheel.py +141 -0
- pex/interpreter.py +41 -38
- pex/interpreter_constraints.py +25 -25
- pex/interpreter_implementation.py +40 -0
- pex/jobs.py +13 -6
- pex/pep_376.py +68 -384
- pex/pep_425.py +11 -2
- pex/pep_427.py +937 -205
- pex/pep_508.py +4 -5
- pex/pex_builder.py +5 -8
- pex/pex_info.py +14 -9
- pex/pip/dependencies/__init__.py +85 -13
- pex/pip/dependencies/requires.py +38 -3
- pex/pip/foreign_platform/__init__.py +4 -3
- pex/pip/installation.py +2 -2
- pex/pip/local_project.py +6 -14
- pex/pip/package_repositories/__init__.py +78 -0
- pex/pip/package_repositories/link_collector.py +96 -0
- pex/pip/tool.py +139 -33
- pex/pip/vcs.py +109 -43
- pex/pip/version.py +8 -1
- pex/requirements.py +121 -16
- pex/resolve/config.py +5 -1
- pex/resolve/configured_resolve.py +32 -10
- pex/resolve/configured_resolver.py +10 -39
- pex/resolve/downloads.py +4 -3
- pex/resolve/lock_downloader.py +16 -23
- pex/resolve/lock_resolver.py +41 -51
- pex/resolve/locked_resolve.py +89 -32
- pex/resolve/locker.py +145 -101
- pex/resolve/locker_patches.py +123 -197
- pex/resolve/lockfile/create.py +232 -87
- pex/resolve/lockfile/download_manager.py +5 -1
- pex/resolve/lockfile/json_codec.py +103 -28
- pex/resolve/lockfile/model.py +13 -35
- pex/resolve/lockfile/pep_751.py +117 -98
- pex/resolve/lockfile/requires_dist.py +17 -262
- pex/resolve/lockfile/subset.py +11 -0
- pex/resolve/lockfile/targets.py +445 -0
- pex/resolve/lockfile/updater.py +22 -10
- pex/resolve/package_repository.py +406 -0
- pex/resolve/pex_repository_resolver.py +1 -1
- pex/resolve/pre_resolved_resolver.py +19 -16
- pex/resolve/project.py +233 -47
- pex/resolve/requirement_configuration.py +28 -10
- pex/resolve/resolver_configuration.py +18 -32
- pex/resolve/resolver_options.py +234 -28
- pex/resolve/resolvers.py +3 -12
- pex/resolve/target_options.py +18 -2
- pex/resolve/target_system.py +908 -0
- pex/resolve/venv_resolver.py +670 -0
- pex/resolver.py +673 -209
- pex/scie/__init__.py +40 -1
- pex/scie/model.py +2 -0
- pex/scie/science.py +25 -3
- pex/sdist.py +219 -0
- pex/sh_boot.py +24 -21
- pex/sysconfig.py +5 -3
- pex/targets.py +31 -10
- pex/third_party/__init__.py +1 -1
- pex/tools/commands/repository.py +48 -25
- pex/vendor/__init__.py +4 -9
- pex/vendor/__main__.py +65 -41
- pex/vendor/_vendored/ansicolors/.layout.json +1 -1
- pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/RECORD +11 -0
- pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/appdirs/.layout.json +1 -1
- pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/RECORD +7 -0
- pex/vendor/_vendored/appdirs/appdirs-1.4.4.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/attrs/.layout.json +1 -1
- pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/RECORD +37 -0
- pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/packaging_20_9/.layout.json +1 -1
- pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/RECORD +20 -0
- pex/vendor/_vendored/packaging_20_9/packaging-20.9.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/RECORD +7 -0
- pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/packaging_21_3/.layout.json +1 -1
- pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/RECORD +20 -0
- pex/vendor/_vendored/packaging_21_3/packaging-21.3.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/RECORD +18 -0
- pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/packaging_24_0/.layout.json +1 -1
- pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/RECORD +22 -0
- pex/vendor/_vendored/packaging_24_0/packaging-24.0.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/packaging_25_0/.layout.json +1 -1
- pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/RECORD +24 -0
- pex/vendor/_vendored/packaging_25_0/packaging-25.0.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/pip/.layout.json +1 -1
- pex/vendor/_vendored/pip/pip/_vendor/certifi/cacert.pem +63 -1
- pex/vendor/_vendored/pip/pip-20.3.4.dist-info/RECORD +388 -0
- pex/vendor/_vendored/pip/pip-20.3.4.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/setuptools/.layout.json +1 -1
- pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/RECORD +107 -0
- pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/toml/.layout.json +1 -1
- pex/vendor/_vendored/toml/toml-0.10.2.dist-info/RECORD +11 -0
- pex/vendor/_vendored/toml/toml-0.10.2.pex-info/original-whl-info.json +1 -0
- pex/vendor/_vendored/tomli/.layout.json +1 -1
- pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/RECORD +10 -0
- pex/vendor/_vendored/tomli/tomli-2.0.1.pex-info/original-whl-info.json +1 -0
- pex/venv/installer.py +46 -19
- pex/venv/venv_pex.py +6 -3
- pex/version.py +1 -1
- pex/wheel.py +188 -40
- pex/whl.py +67 -0
- pex/windows/__init__.py +14 -11
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/METADATA +6 -5
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/RECORD +157 -133
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/entry_points.txt +1 -0
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/pylock/pylock.toml +1 -1
- pex/docs/html/_pagefind/fragment/en_42c9d8c.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_45dd5a2.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_4ca74d2.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_77273d5.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_87a59c5.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_8dc89b5.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_9d1319b.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_e55df9d.pf_fragment +0 -0
- pex/docs/html/_pagefind/index/en_1e98c6f.pf_index +0 -0
- pex/docs/html/_pagefind/pagefind.en_d1c488ecae.pf_meta +0 -0
- pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/pip/pip-20.3.4.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/toml/toml-0.10.2.dist-info/INSTALLER +0 -1
- pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/INSTALLER +0 -1
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/WHEEL +0 -0
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/licenses/LICENSE +0 -0
- {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/top_level.txt +0 -0
|
@@ -3,291 +3,43 @@
|
|
|
3
3
|
|
|
4
4
|
from __future__ import absolute_import
|
|
5
5
|
|
|
6
|
-
import operator
|
|
7
6
|
from collections import defaultdict, deque
|
|
8
7
|
|
|
8
|
+
from pex.dependency_configuration import DependencyConfiguration
|
|
9
9
|
from pex.dist_metadata import Requirement
|
|
10
|
-
from pex.exceptions import production_assert
|
|
11
|
-
from pex.interpreter_constraints import iter_compatible_versions
|
|
12
10
|
from pex.orderedset import OrderedSet
|
|
13
|
-
from pex.
|
|
14
|
-
from pex.
|
|
15
|
-
from pex.resolve.locked_resolve import LockedRequirement, LockedResolve, TargetSystem
|
|
11
|
+
from pex.resolve.locked_resolve import LockedRequirement, LockedResolve
|
|
12
|
+
from pex.resolve.target_system import MarkerEnv, UniversalTarget
|
|
16
13
|
from pex.sorted_tuple import SortedTuple
|
|
17
|
-
from pex.
|
|
18
|
-
from pex.typing import TYPE_CHECKING, Generic, cast
|
|
14
|
+
from pex.typing import TYPE_CHECKING
|
|
19
15
|
|
|
20
16
|
if TYPE_CHECKING:
|
|
21
|
-
from typing import
|
|
22
|
-
Any,
|
|
23
|
-
Callable,
|
|
24
|
-
DefaultDict,
|
|
25
|
-
Dict,
|
|
26
|
-
FrozenSet,
|
|
27
|
-
Iterable,
|
|
28
|
-
Iterator,
|
|
29
|
-
List,
|
|
30
|
-
Optional,
|
|
31
|
-
Tuple,
|
|
32
|
-
Type,
|
|
33
|
-
TypeVar,
|
|
34
|
-
Union,
|
|
35
|
-
)
|
|
17
|
+
from typing import DefaultDict, Iterable, Iterator, Optional
|
|
36
18
|
|
|
37
19
|
import attr # vendor:skip
|
|
38
20
|
|
|
39
|
-
EvalMarker = Callable[["MarkerEnv"], bool]
|
|
40
21
|
else:
|
|
41
22
|
from pex.third_party import attr
|
|
42
23
|
|
|
43
24
|
|
|
44
|
-
@attr.s(frozen=True)
|
|
45
|
-
class MarkerEnv(object):
|
|
46
|
-
@classmethod
|
|
47
|
-
def create(
|
|
48
|
-
cls,
|
|
49
|
-
extras, # type: Iterable[str]
|
|
50
|
-
requires_python, # type: Iterable[str]
|
|
51
|
-
target_systems, # type: Iterable[TargetSystem.Value]
|
|
52
|
-
):
|
|
53
|
-
# type: (...) -> MarkerEnv
|
|
54
|
-
|
|
55
|
-
python_full_versions = (
|
|
56
|
-
list(iter_compatible_versions(requires_python)) if requires_python else []
|
|
57
|
-
)
|
|
58
|
-
python_versions = OrderedSet(
|
|
59
|
-
python_full_version[:2] for python_full_version in python_full_versions
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
os_names = []
|
|
63
|
-
platform_systems = []
|
|
64
|
-
sys_platforms = []
|
|
65
|
-
for target_system in target_systems:
|
|
66
|
-
if target_system is TargetSystem.LINUX:
|
|
67
|
-
os_names.append("posix")
|
|
68
|
-
platform_systems.append("Linux")
|
|
69
|
-
sys_platforms.append("linux")
|
|
70
|
-
sys_platforms.append("linux2")
|
|
71
|
-
elif target_system is TargetSystem.MAC:
|
|
72
|
-
os_names.append("posix")
|
|
73
|
-
platform_systems.append("Darwin")
|
|
74
|
-
sys_platforms.append("darwin")
|
|
75
|
-
elif target_system is TargetSystem.WINDOWS:
|
|
76
|
-
os_names.append("nt")
|
|
77
|
-
platform_systems.append("Windows")
|
|
78
|
-
sys_platforms.append("win32")
|
|
79
|
-
|
|
80
|
-
return cls(
|
|
81
|
-
extras=frozenset(ProjectName(extra) for extra in (extras or [""])),
|
|
82
|
-
os_names=frozenset(os_names),
|
|
83
|
-
platform_systems=frozenset(platform_systems),
|
|
84
|
-
sys_platforms=frozenset(sys_platforms),
|
|
85
|
-
python_versions=frozenset(
|
|
86
|
-
Version(".".join(map(str, python_version))) for python_version in python_versions
|
|
87
|
-
),
|
|
88
|
-
python_full_versions=frozenset(
|
|
89
|
-
Version(".".join(map(str, python_full_version)))
|
|
90
|
-
for python_full_version in python_full_versions
|
|
91
|
-
),
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
extras = attr.ib() # type: FrozenSet[ProjectName]
|
|
95
|
-
os_names = attr.ib() # type: FrozenSet[str]
|
|
96
|
-
platform_systems = attr.ib() # type: FrozenSet[str]
|
|
97
|
-
sys_platforms = attr.ib() # type: FrozenSet[str]
|
|
98
|
-
python_versions = attr.ib() # type: FrozenSet[Version]
|
|
99
|
-
python_full_versions = attr.ib() # type: FrozenSet[Version]
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
_OPERATORS = {
|
|
103
|
-
"in": lambda lhs, rhs: lhs in rhs,
|
|
104
|
-
"not in": lambda lhs, rhs: lhs not in rhs,
|
|
105
|
-
"<": operator.lt,
|
|
106
|
-
"<=": operator.le,
|
|
107
|
-
"==": operator.eq,
|
|
108
|
-
"!=": operator.ne,
|
|
109
|
-
">=": operator.ge,
|
|
110
|
-
">": operator.gt,
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class _Op(object):
|
|
115
|
-
def __init__(self, lhs):
|
|
116
|
-
self.lhs = lhs # type: EvalMarker
|
|
117
|
-
self.rhs = None # type: Optional[EvalMarker]
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
class _And(_Op):
|
|
121
|
-
def __call__(self, marker_env):
|
|
122
|
-
# type: (MarkerEnv) -> bool
|
|
123
|
-
production_assert(self.rhs is not None)
|
|
124
|
-
return self.lhs(marker_env) and cast("EvalMarker", self.rhs)(marker_env)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
class _Or(_Op):
|
|
128
|
-
def __call__(self, marker_env):
|
|
129
|
-
# type: (MarkerEnv) -> bool
|
|
130
|
-
production_assert(self.rhs is not None)
|
|
131
|
-
return self.lhs(marker_env) or cast("EvalMarker", self.rhs)(marker_env)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def _get_values_func(marker):
|
|
135
|
-
# type: (str) -> Optional[Tuple[Callable[[MarkerEnv], FrozenSet], Type]]
|
|
136
|
-
|
|
137
|
-
if marker == "extra":
|
|
138
|
-
return lambda marker_env: marker_env.extras, ProjectName
|
|
139
|
-
elif marker == "os_name":
|
|
140
|
-
return lambda marker_env: marker_env.os_names, str
|
|
141
|
-
elif marker == "platform_system":
|
|
142
|
-
return lambda marker_env: marker_env.platform_systems, str
|
|
143
|
-
elif marker == "sys_platform":
|
|
144
|
-
return lambda marker_env: marker_env.sys_platforms, str
|
|
145
|
-
elif marker == "python_version":
|
|
146
|
-
return lambda marker_env: marker_env.python_versions, Version
|
|
147
|
-
elif marker == "python_full_version":
|
|
148
|
-
return lambda marker_env: marker_env.python_full_versions, Version
|
|
149
|
-
return None
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if TYPE_CHECKING:
|
|
153
|
-
_T = TypeVar("_T")
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
class EvalMarkerFunc(Generic["_T"]):
|
|
157
|
-
@classmethod
|
|
158
|
-
def create(
|
|
159
|
-
cls,
|
|
160
|
-
lhs, # type: Any
|
|
161
|
-
op, # type: Any
|
|
162
|
-
rhs, # type: Any
|
|
163
|
-
):
|
|
164
|
-
# type: (...) -> Callable[[MarkerEnv], bool]
|
|
165
|
-
|
|
166
|
-
if isinstance(lhs, Variable):
|
|
167
|
-
value = _get_values_func(str(lhs))
|
|
168
|
-
if value:
|
|
169
|
-
get_values, operand_type = value
|
|
170
|
-
return cls(
|
|
171
|
-
get_values=get_values,
|
|
172
|
-
op=_OPERATORS[str(op)],
|
|
173
|
-
operand_type=operand_type,
|
|
174
|
-
rhs=operand_type(rhs),
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
if isinstance(rhs, Variable):
|
|
178
|
-
value = _get_values_func(str(rhs))
|
|
179
|
-
if value:
|
|
180
|
-
get_values, operand_type = value
|
|
181
|
-
return cls(
|
|
182
|
-
get_values=get_values,
|
|
183
|
-
op=_OPERATORS[str(op)],
|
|
184
|
-
operand_type=operand_type,
|
|
185
|
-
lhs=operand_type(lhs),
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
return lambda _: True
|
|
189
|
-
|
|
190
|
-
def __init__(
|
|
191
|
-
self,
|
|
192
|
-
get_values, # type: Callable[[MarkerEnv], Iterable[_T]]
|
|
193
|
-
op, # type: Callable[[_T, _T], bool]
|
|
194
|
-
operand_type, # type: Callable[[Any], _T]
|
|
195
|
-
lhs=None, # type: Optional[_T]
|
|
196
|
-
rhs=None, # type: Optional[_T]
|
|
197
|
-
):
|
|
198
|
-
# type: (...) -> None
|
|
199
|
-
|
|
200
|
-
self._get_values = get_values
|
|
201
|
-
if lhs is not None:
|
|
202
|
-
self._func = lambda value: op(cast("_T", lhs), operand_type(value))
|
|
203
|
-
elif rhs is not None:
|
|
204
|
-
self._func = lambda value: op(operand_type(value), cast("_T", rhs))
|
|
205
|
-
else:
|
|
206
|
-
raise ValueError(
|
|
207
|
-
"Must be called with exactly one of lhs or rhs but not both. "
|
|
208
|
-
"Given lhs={lhs} and rhs={rhs}".format(lhs=lhs, rhs=rhs)
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
def __call__(self, marker_env):
|
|
212
|
-
# type: (MarkerEnv) -> bool
|
|
213
|
-
|
|
214
|
-
values = self._get_values(marker_env)
|
|
215
|
-
return any(map(self._func, values)) if values else True
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
def _parse_marker_item(
|
|
219
|
-
stack, # type: List[EvalMarker]
|
|
220
|
-
item, # type: Union[str, List, Tuple]
|
|
221
|
-
marker, # type: Marker
|
|
222
|
-
):
|
|
223
|
-
# type: (...) -> None
|
|
224
|
-
|
|
225
|
-
if item == "and":
|
|
226
|
-
stack.append(_And(stack.pop()))
|
|
227
|
-
elif item == "or":
|
|
228
|
-
stack.append(_Or(stack.pop()))
|
|
229
|
-
elif isinstance(item, list):
|
|
230
|
-
for element in item:
|
|
231
|
-
_parse_marker_item(stack, element, marker)
|
|
232
|
-
elif isinstance(item, tuple):
|
|
233
|
-
lhs, op, rhs = item
|
|
234
|
-
check = EvalMarkerFunc.create(lhs, op, rhs)
|
|
235
|
-
if stack:
|
|
236
|
-
production_assert(isinstance(stack[-1], _Op))
|
|
237
|
-
cast(_Op, stack[-1]).rhs = check
|
|
238
|
-
else:
|
|
239
|
-
stack.append(check)
|
|
240
|
-
else:
|
|
241
|
-
raise ValueError("Marker is invalid: {marker}".format(marker=marker))
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def _parse_marker_check(marker):
|
|
245
|
-
# type: (Marker) -> EvalMarker
|
|
246
|
-
checks = [] # type: List[EvalMarker]
|
|
247
|
-
for item in marker._markers:
|
|
248
|
-
_parse_marker_item(checks, item, marker)
|
|
249
|
-
production_assert(len(checks) == 1)
|
|
250
|
-
return checks[0]
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
_MARKER_CHECKS = {} # type: Dict[str, EvalMarker]
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def _parse_marker(marker):
|
|
257
|
-
# type: (Marker) -> EvalMarker
|
|
258
|
-
maker_str = str(marker)
|
|
259
|
-
eval_marker = _MARKER_CHECKS.get(maker_str)
|
|
260
|
-
if not eval_marker:
|
|
261
|
-
eval_marker = _parse_marker_check(marker)
|
|
262
|
-
_MARKER_CHECKS[maker_str] = eval_marker
|
|
263
|
-
return eval_marker
|
|
264
|
-
|
|
265
|
-
|
|
266
25
|
def filter_dependencies(
|
|
267
26
|
requirement, # type: Requirement
|
|
268
27
|
locked_requirement, # type: LockedRequirement
|
|
269
|
-
|
|
270
|
-
target_systems=(), # type: Iterable[TargetSystem.Value]
|
|
28
|
+
universal_target=None, # type: Optional[UniversalTarget]
|
|
271
29
|
):
|
|
272
30
|
# type: (...) -> Iterator[Requirement]
|
|
273
31
|
|
|
274
|
-
marker_env = MarkerEnv.create(
|
|
275
|
-
extras=requirement.extras, requires_python=requires_python, target_systems=target_systems
|
|
276
|
-
)
|
|
32
|
+
marker_env = MarkerEnv.create(extras=requirement.extras, universal_target=universal_target)
|
|
277
33
|
for dep in locked_requirement.requires_dists:
|
|
278
|
-
if not dep.marker:
|
|
34
|
+
if not dep.marker or marker_env.evaluate(dep.marker):
|
|
279
35
|
yield dep
|
|
280
|
-
else:
|
|
281
|
-
eval_marker = _parse_marker(dep.marker)
|
|
282
|
-
if eval_marker(marker_env):
|
|
283
|
-
yield dep
|
|
284
36
|
|
|
285
37
|
|
|
286
38
|
def remove_unused_requires_dist(
|
|
287
39
|
resolve_requirements, # type: Iterable[Requirement]
|
|
288
40
|
locked_resolve, # type: LockedResolve
|
|
289
|
-
|
|
290
|
-
|
|
41
|
+
universal_target=None, # type: Optional[UniversalTarget]
|
|
42
|
+
dependency_configuration=DependencyConfiguration(), # type: DependencyConfiguration
|
|
291
43
|
):
|
|
292
44
|
# type: (...) -> LockedResolve
|
|
293
45
|
|
|
@@ -309,10 +61,13 @@ def remove_unused_requires_dist(
|
|
|
309
61
|
if not locked_req:
|
|
310
62
|
continue
|
|
311
63
|
|
|
312
|
-
for dep in filter_dependencies(
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
if
|
|
64
|
+
for dep in filter_dependencies(requirement, locked_req, universal_target=universal_target):
|
|
65
|
+
if dependency_configuration.excluded_by(dep):
|
|
66
|
+
continue
|
|
67
|
+
if any(
|
|
68
|
+
d.project_name in locked_req_by_project_name
|
|
69
|
+
for d in dependency_configuration.overrides_for(dep) or [dep]
|
|
70
|
+
):
|
|
316
71
|
requires_dist_by_locked_req[locked_req].add(dep)
|
|
317
72
|
requirements.append(dep)
|
|
318
73
|
|
pex/resolve/lockfile/subset.py
CHANGED
|
@@ -146,6 +146,17 @@ def subset(
|
|
|
146
146
|
else:
|
|
147
147
|
errors.append(resolve_result)
|
|
148
148
|
|
|
149
|
+
if len(resolveds) > 1:
|
|
150
|
+
# We may have a split universal resolve; in which case we want to apply split
|
|
151
|
+
# markers to winnow down to the appropriate locked resolves.
|
|
152
|
+
marker_environment = target.marker_environment.as_dict()
|
|
153
|
+
resolveds = [
|
|
154
|
+
resolved
|
|
155
|
+
for resolved in resolveds
|
|
156
|
+
if not resolved.source.marker
|
|
157
|
+
or resolved.source.marker.evaluate(marker_environment)
|
|
158
|
+
]
|
|
159
|
+
|
|
149
160
|
if resolveds:
|
|
150
161
|
resolved_by_target[target] = Resolved.most_specific(resolveds)
|
|
151
162
|
elif errors:
|