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.

Files changed (180) hide show
  1. pex/auth.py +1 -1
  2. pex/bin/pex.py +15 -2
  3. pex/build_backend/configuration.py +5 -5
  4. pex/build_backend/wrap.py +27 -23
  5. pex/build_system/pep_517.py +4 -1
  6. pex/cache/dirs.py +17 -12
  7. pex/cli/commands/lock.py +302 -165
  8. pex/cli/commands/pip/core.py +4 -12
  9. pex/cli/commands/pip/wheel.py +1 -1
  10. pex/cli/commands/run.py +13 -20
  11. pex/cli/commands/venv.py +85 -16
  12. pex/cli/pex.py +11 -4
  13. pex/common.py +57 -7
  14. pex/compatibility.py +1 -1
  15. pex/dependency_configuration.py +87 -15
  16. pex/dist_metadata.py +143 -25
  17. pex/docs/html/_pagefind/fragment/en_4250138.pf_fragment +0 -0
  18. pex/docs/html/_pagefind/fragment/en_7125dad.pf_fragment +0 -0
  19. pex/docs/html/_pagefind/fragment/en_785d562.pf_fragment +0 -0
  20. pex/docs/html/_pagefind/fragment/en_8e94bb8.pf_fragment +0 -0
  21. pex/docs/html/_pagefind/fragment/en_a0396bb.pf_fragment +0 -0
  22. pex/docs/html/_pagefind/fragment/en_a8a3588.pf_fragment +0 -0
  23. pex/docs/html/_pagefind/fragment/en_c07d988.pf_fragment +0 -0
  24. pex/docs/html/_pagefind/fragment/en_d718411.pf_fragment +0 -0
  25. pex/docs/html/_pagefind/index/en_a2e3c5e.pf_index +0 -0
  26. pex/docs/html/_pagefind/pagefind-entry.json +1 -1
  27. pex/docs/html/_pagefind/pagefind.en_4ce1afa9e3.pf_meta +0 -0
  28. pex/docs/html/_static/documentation_options.js +1 -1
  29. pex/docs/html/_static/pygments.css +164 -146
  30. pex/docs/html/_static/styles/furo.css +1 -1
  31. pex/docs/html/_static/styles/furo.css.map +1 -1
  32. pex/docs/html/api/vars.html +25 -34
  33. pex/docs/html/buildingpex.html +25 -34
  34. pex/docs/html/genindex.html +24 -33
  35. pex/docs/html/index.html +25 -34
  36. pex/docs/html/recipes.html +25 -34
  37. pex/docs/html/scie.html +25 -34
  38. pex/docs/html/search.html +24 -33
  39. pex/docs/html/whatispex.html +25 -34
  40. pex/entry_points_txt.py +98 -0
  41. pex/environment.py +54 -33
  42. pex/finders.py +1 -1
  43. pex/hashing.py +71 -9
  44. pex/installed_wheel.py +141 -0
  45. pex/interpreter.py +41 -38
  46. pex/interpreter_constraints.py +25 -25
  47. pex/interpreter_implementation.py +40 -0
  48. pex/jobs.py +13 -6
  49. pex/pep_376.py +68 -384
  50. pex/pep_425.py +11 -2
  51. pex/pep_427.py +937 -205
  52. pex/pep_508.py +4 -5
  53. pex/pex_builder.py +5 -8
  54. pex/pex_info.py +14 -9
  55. pex/pip/dependencies/__init__.py +85 -13
  56. pex/pip/dependencies/requires.py +38 -3
  57. pex/pip/foreign_platform/__init__.py +4 -3
  58. pex/pip/installation.py +2 -2
  59. pex/pip/local_project.py +6 -14
  60. pex/pip/package_repositories/__init__.py +78 -0
  61. pex/pip/package_repositories/link_collector.py +96 -0
  62. pex/pip/tool.py +139 -33
  63. pex/pip/vcs.py +109 -43
  64. pex/pip/version.py +8 -1
  65. pex/requirements.py +121 -16
  66. pex/resolve/config.py +5 -1
  67. pex/resolve/configured_resolve.py +32 -10
  68. pex/resolve/configured_resolver.py +10 -39
  69. pex/resolve/downloads.py +4 -3
  70. pex/resolve/lock_downloader.py +16 -23
  71. pex/resolve/lock_resolver.py +41 -51
  72. pex/resolve/locked_resolve.py +89 -32
  73. pex/resolve/locker.py +145 -101
  74. pex/resolve/locker_patches.py +123 -197
  75. pex/resolve/lockfile/create.py +232 -87
  76. pex/resolve/lockfile/download_manager.py +5 -1
  77. pex/resolve/lockfile/json_codec.py +103 -28
  78. pex/resolve/lockfile/model.py +13 -35
  79. pex/resolve/lockfile/pep_751.py +117 -98
  80. pex/resolve/lockfile/requires_dist.py +17 -262
  81. pex/resolve/lockfile/subset.py +11 -0
  82. pex/resolve/lockfile/targets.py +445 -0
  83. pex/resolve/lockfile/updater.py +22 -10
  84. pex/resolve/package_repository.py +406 -0
  85. pex/resolve/pex_repository_resolver.py +1 -1
  86. pex/resolve/pre_resolved_resolver.py +19 -16
  87. pex/resolve/project.py +233 -47
  88. pex/resolve/requirement_configuration.py +28 -10
  89. pex/resolve/resolver_configuration.py +18 -32
  90. pex/resolve/resolver_options.py +234 -28
  91. pex/resolve/resolvers.py +3 -12
  92. pex/resolve/target_options.py +18 -2
  93. pex/resolve/target_system.py +908 -0
  94. pex/resolve/venv_resolver.py +670 -0
  95. pex/resolver.py +673 -209
  96. pex/scie/__init__.py +40 -1
  97. pex/scie/model.py +2 -0
  98. pex/scie/science.py +25 -3
  99. pex/sdist.py +219 -0
  100. pex/sh_boot.py +24 -21
  101. pex/sysconfig.py +5 -3
  102. pex/targets.py +31 -10
  103. pex/third_party/__init__.py +1 -1
  104. pex/tools/commands/repository.py +48 -25
  105. pex/vendor/__init__.py +4 -9
  106. pex/vendor/__main__.py +65 -41
  107. pex/vendor/_vendored/ansicolors/.layout.json +1 -1
  108. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/RECORD +11 -0
  109. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.pex-info/original-whl-info.json +1 -0
  110. pex/vendor/_vendored/appdirs/.layout.json +1 -1
  111. pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/RECORD +7 -0
  112. pex/vendor/_vendored/appdirs/appdirs-1.4.4.pex-info/original-whl-info.json +1 -0
  113. pex/vendor/_vendored/attrs/.layout.json +1 -1
  114. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/RECORD +37 -0
  115. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.pex-info/original-whl-info.json +1 -0
  116. pex/vendor/_vendored/packaging_20_9/.layout.json +1 -1
  117. pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/RECORD +20 -0
  118. pex/vendor/_vendored/packaging_20_9/packaging-20.9.pex-info/original-whl-info.json +1 -0
  119. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/RECORD +7 -0
  120. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.pex-info/original-whl-info.json +1 -0
  121. pex/vendor/_vendored/packaging_21_3/.layout.json +1 -1
  122. pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/RECORD +20 -0
  123. pex/vendor/_vendored/packaging_21_3/packaging-21.3.pex-info/original-whl-info.json +1 -0
  124. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/RECORD +18 -0
  125. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.pex-info/original-whl-info.json +1 -0
  126. pex/vendor/_vendored/packaging_24_0/.layout.json +1 -1
  127. pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/RECORD +22 -0
  128. pex/vendor/_vendored/packaging_24_0/packaging-24.0.pex-info/original-whl-info.json +1 -0
  129. pex/vendor/_vendored/packaging_25_0/.layout.json +1 -1
  130. pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/RECORD +24 -0
  131. pex/vendor/_vendored/packaging_25_0/packaging-25.0.pex-info/original-whl-info.json +1 -0
  132. pex/vendor/_vendored/pip/.layout.json +1 -1
  133. pex/vendor/_vendored/pip/pip/_vendor/certifi/cacert.pem +63 -1
  134. pex/vendor/_vendored/pip/pip-20.3.4.dist-info/RECORD +388 -0
  135. pex/vendor/_vendored/pip/pip-20.3.4.pex-info/original-whl-info.json +1 -0
  136. pex/vendor/_vendored/setuptools/.layout.json +1 -1
  137. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/RECORD +107 -0
  138. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.pex-info/original-whl-info.json +1 -0
  139. pex/vendor/_vendored/toml/.layout.json +1 -1
  140. pex/vendor/_vendored/toml/toml-0.10.2.dist-info/RECORD +11 -0
  141. pex/vendor/_vendored/toml/toml-0.10.2.pex-info/original-whl-info.json +1 -0
  142. pex/vendor/_vendored/tomli/.layout.json +1 -1
  143. pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/RECORD +10 -0
  144. pex/vendor/_vendored/tomli/tomli-2.0.1.pex-info/original-whl-info.json +1 -0
  145. pex/venv/installer.py +46 -19
  146. pex/venv/venv_pex.py +6 -3
  147. pex/version.py +1 -1
  148. pex/wheel.py +188 -40
  149. pex/whl.py +67 -0
  150. pex/windows/__init__.py +14 -11
  151. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/METADATA +6 -5
  152. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/RECORD +157 -133
  153. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/entry_points.txt +1 -0
  154. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/pylock/pylock.toml +1 -1
  155. pex/docs/html/_pagefind/fragment/en_42c9d8c.pf_fragment +0 -0
  156. pex/docs/html/_pagefind/fragment/en_45dd5a2.pf_fragment +0 -0
  157. pex/docs/html/_pagefind/fragment/en_4ca74d2.pf_fragment +0 -0
  158. pex/docs/html/_pagefind/fragment/en_77273d5.pf_fragment +0 -0
  159. pex/docs/html/_pagefind/fragment/en_87a59c5.pf_fragment +0 -0
  160. pex/docs/html/_pagefind/fragment/en_8dc89b5.pf_fragment +0 -0
  161. pex/docs/html/_pagefind/fragment/en_9d1319b.pf_fragment +0 -0
  162. pex/docs/html/_pagefind/fragment/en_e55df9d.pf_fragment +0 -0
  163. pex/docs/html/_pagefind/index/en_1e98c6f.pf_index +0 -0
  164. pex/docs/html/_pagefind/pagefind.en_d1c488ecae.pf_meta +0 -0
  165. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/INSTALLER +0 -1
  166. pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/INSTALLER +0 -1
  167. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/INSTALLER +0 -1
  168. pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/INSTALLER +0 -1
  169. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/INSTALLER +0 -1
  170. pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/INSTALLER +0 -1
  171. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/INSTALLER +0 -1
  172. pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/INSTALLER +0 -1
  173. pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/INSTALLER +0 -1
  174. pex/vendor/_vendored/pip/pip-20.3.4.dist-info/INSTALLER +0 -1
  175. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/INSTALLER +0 -1
  176. pex/vendor/_vendored/toml/toml-0.10.2.dist-info/INSTALLER +0 -1
  177. pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/INSTALLER +0 -1
  178. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/WHEEL +0 -0
  179. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/licenses/LICENSE +0 -0
  180. {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.pep_440 import Version
14
- from pex.pep_503 import ProjectName
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.third_party.packaging.markers import Marker, Variable
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
- requires_python=(), # type: Iterable[str]
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
- requires_python=(), # type: Iterable[str]
290
- target_systems=(), # type: Iterable[TargetSystem.Value]
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
- requirement, locked_req, requires_python=requires_python, target_systems=target_systems
314
- ):
315
- if dep.project_name in locked_req_by_project_name:
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
 
@@ -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: