@@ -215,10 +215,18 @@ def __get_locked_package(
215
215
216
216
for dependency in project_requires :
217
217
dependency = deepcopy (dependency )
218
- if pinned_versions :
219
- locked_package = __get_locked_package (dependency )
220
- if locked_package :
221
- dependency .set_constraint (locked_package .to_dependency ().constraint )
218
+ locked_package = __get_locked_package (dependency )
219
+ if locked_package :
220
+ locked_dependency = locked_package .to_dependency ()
221
+ locked_dependency .marker = dependency .marker .intersect (
222
+ locked_package .marker
223
+ )
224
+
225
+ if not pinned_versions :
226
+ locked_dependency .set_constraint (dependency .constraint )
227
+
228
+ dependency = locked_dependency
229
+
222
230
project_level_dependencies .add (dependency .name )
223
231
dependencies .append (dependency )
224
232
@@ -228,7 +236,9 @@ def __get_locked_package(
228
236
229
237
nested_dependencies = dict ()
230
238
231
- def __walk_level (__dependencies ): # type: (List[Dependency]) -> None
239
+ def __walk_level (
240
+ __dependencies , __level
241
+ ): # type: (List[Dependency], int) -> None
232
242
if not __dependencies :
233
243
return
234
244
@@ -239,18 +249,19 @@ def __walk_level(__dependencies): # type: (List[Dependency]) -> None
239
249
240
250
if __locked_package :
241
251
for require in __locked_package .requires :
242
- if not require .marker .is_empty ():
252
+ if require .marker .is_empty ():
253
+ require .marker = requirement .marker
254
+ else :
243
255
require .marker = require .marker .intersect (
244
256
requirement .marker
245
257
)
246
- else :
247
- require .marker = requirement .marker
258
+
248
259
require .marker = require .marker .intersect (
249
260
__locked_package .marker
250
261
)
251
262
_next_level .append (require )
252
263
253
- if requirement .name in project_level_dependencies :
264
+ if requirement .name in project_level_dependencies and __level == 0 :
254
265
# project level dependencies take precedence
255
266
continue
256
267
@@ -272,20 +283,11 @@ def __walk_level(__dependencies): # type: (List[Dependency]) -> None
272
283
)
273
284
274
285
# dependencies use extra to indicate that it was activated via parent
275
- # package's extras
276
- marker = requirement .marker .without_extras ()
277
- for project_requirement in project_requires :
278
- if (
279
- pkg .name == project_requirement .name
280
- and project_requirement .constraint .allows (pkg .version )
281
- ):
282
- requirement .marker = marker .intersect (
283
- project_requirement .marker
284
- )
285
- break
286
- else :
287
- # this dependency was not from a project requirement
288
- requirement .marker = marker .intersect (pkg .marker )
286
+ # package's extras, this is not required for nested exports as we assume
287
+ # the resolver already selected this dependency
288
+ requirement .marker = requirement .marker .without_extras ().intersect (
289
+ pkg .marker
290
+ )
289
291
290
292
key = (requirement .name , requirement .pretty_constraint )
291
293
if key not in nested_dependencies :
@@ -295,9 +297,9 @@ def __walk_level(__dependencies): # type: (List[Dependency]) -> None
295
297
key
296
298
].marker .intersect (requirement .marker )
297
299
298
- return __walk_level (_next_level )
300
+ return __walk_level (_next_level , __level + 1 )
299
301
300
- __walk_level (dependencies )
302
+ __walk_level (dependencies , 0 )
301
303
302
304
return sorted (
303
305
itertools .chain (dependencies , nested_dependencies .values ()),
0 commit comments