@@ -226,19 +226,40 @@ def __get_locked_package(
226
226
# return only with project level dependencies
227
227
return dependencies
228
228
229
- nested_dependencies = list ()
229
+ nested_dependencies = dict ()
230
+
231
+ def __walk_level (__dependencies ): # type: (List[Dependency]) -> None
232
+ if not __dependencies :
233
+ return
234
+
235
+ _next_level = []
236
+
237
+ for requirement in __dependencies :
238
+ __locked_package = __get_locked_package (requirement )
239
+
240
+ if __locked_package :
241
+ for require in __locked_package .requires :
242
+ if not require .marker .is_empty ():
243
+ require .marker = require .marker .intersect (
244
+ requirement .marker
245
+ )
246
+ else :
247
+ require .marker = requirement .marker
248
+ require .marker = require .marker .intersect (
249
+ __locked_package .marker
250
+ )
251
+ _next_level .append (require )
230
252
231
- for pkg in packages : # type: Package
232
- for requirement in pkg .requires : # type: Dependency
233
253
if requirement .name in project_level_dependencies :
234
254
# project level dependencies take precedence
235
255
continue
236
256
237
- locked_package = __get_locked_package (requirement )
238
- if locked_package :
257
+ if __locked_package :
239
258
# create dependency from locked package to retain dependency metadata
240
259
# if this is not done, we can end-up with incorrect nested dependencies
241
- requirement = locked_package .to_dependency ()
260
+ marker = requirement .marker
261
+ requirement = __locked_package .to_dependency ()
262
+ requirement .marker = requirement .marker .intersect (marker )
242
263
else :
243
264
# we make a copy to avoid any side-effects
244
265
requirement = deepcopy (requirement )
@@ -266,11 +287,20 @@ def __get_locked_package(
266
287
# this dependency was not from a project requirement
267
288
requirement .marker = marker .intersect (pkg .marker )
268
289
269
- if requirement not in nested_dependencies :
270
- nested_dependencies .append (requirement )
290
+ key = (requirement .name , requirement .pretty_constraint )
291
+ if key not in nested_dependencies :
292
+ nested_dependencies [key ] = requirement
293
+ else :
294
+ nested_dependencies [key ].marker = nested_dependencies [
295
+ key
296
+ ].marker .intersect (requirement .marker )
297
+
298
+ return __walk_level (_next_level )
299
+
300
+ __walk_level (dependencies )
271
301
272
302
return sorted (
273
- itertools .chain (dependencies , nested_dependencies ),
303
+ itertools .chain (dependencies , nested_dependencies . values () ),
274
304
key = lambda x : x .name .lower (),
275
305
)
276
306
0 commit comments