36
36
37
37
TRACE = False
38
38
39
- __version__ = "0.7.1 "
39
+ __version__ = "0.7.2 "
40
40
41
41
DEFAULT_PYTHON_VERSION = "38"
42
42
PYPI_SIMPLE_URL = "https://pypi.org/simple"
@@ -251,6 +251,8 @@ def resolve_dependencies(
251
251
# TODO: deduplicate me
252
252
direct_dependencies = []
253
253
254
+ files = []
255
+
254
256
if PYPI_SIMPLE_URL not in index_urls :
255
257
index_urls = tuple ([PYPI_SIMPLE_URL ]) + tuple (index_urls )
256
258
@@ -259,6 +261,16 @@ def resolve_dependencies(
259
261
for extra_data in dependencies .get_extra_data_from_requirements (requirements_file = req_file ):
260
262
index_urls = (* index_urls , * tuple (extra_data .get ("extra_index_urls" ) or []))
261
263
direct_dependencies .extend (deps )
264
+ package_data = [
265
+ pkg_data .to_dict () for pkg_data in PipRequirementsFileHandler .parse (location = req_file )
266
+ ]
267
+ files .append (
268
+ dict (
269
+ type = "file" ,
270
+ path = req_file ,
271
+ package_data = package_data ,
272
+ )
273
+ )
262
274
263
275
for specifier in specifiers :
264
276
dep = dependencies .get_dependency (specifier = specifier )
@@ -282,6 +294,7 @@ def resolve_dependencies(
282
294
)
283
295
ctx .exit (1 )
284
296
297
+ setup_py_file_deps = package_data .dependencies
285
298
for dep in package_data .dependencies :
286
299
# TODO : we need to handle to all the scopes
287
300
if dep .scope == "install" :
@@ -303,17 +316,30 @@ def resolve_dependencies(
303
316
location = requirement_location ,
304
317
)
305
318
if deps :
319
+ setup_py_file_deps = list (deps )
306
320
has_deps = True
307
321
direct_dependencies .extend (deps )
308
322
309
323
if not has_deps and contain_string (string = "_require" , files = [setup_py_file ]):
310
324
if analyze_setup_py_insecurely :
311
- direct_dependencies . extend (
325
+ insecure_setup_py_deps = list (
312
326
parse_deps_from_setup_py_insecurely (setup_py = setup_py_file )
313
327
)
328
+ setup_py_file_deps = insecure_setup_py_deps
329
+ direct_dependencies .extend (insecure_setup_py_deps )
314
330
else :
315
331
raise Exception ("Unable to collect setup.py dependencies securely" )
316
332
333
+ package_data .dependencies = setup_py_file_deps
334
+ file_package_data = [package_data .to_dict ()]
335
+ files .append (
336
+ dict (
337
+ type = "file" ,
338
+ path = setup_py_file ,
339
+ package_data = file_package_data ,
340
+ )
341
+ )
342
+
317
343
if not direct_dependencies :
318
344
click .secho ("Error: no requirements requested." )
319
345
ctx .exit (1 )
@@ -360,7 +386,7 @@ def resolve_dependencies(
360
386
click .secho (f" { repo } " )
361
387
362
388
# resolve dependencies proper
363
- requirements , resolved_dependencies , purls = resolve (
389
+ resolved_dependencies , purls = resolve (
364
390
direct_dependencies = direct_dependencies ,
365
391
environment = environment ,
366
392
repos = repos ,
@@ -381,7 +407,7 @@ def resolve_dependencies(
381
407
notice = (
382
408
"Dependency tree generated with python-inspector.\n "
383
409
"python-inspector is a free software tool from nexB Inc. and others.\n "
384
- "Visit https://github.com/nexB/scancode-toolkit / for support and download."
410
+ "Visit https://github.com/nexB/python-inspector / for support and download."
385
411
)
386
412
387
413
headers = dict (
@@ -401,24 +427,17 @@ def resolve_dependencies(
401
427
list (get_pypi_data_from_purl (package , repos = repos , environment = environment )),
402
428
)
403
429
404
- if json_output :
405
- write_output (
406
- headers = headers ,
407
- requirements = requirements ,
408
- resolved_dependencies = resolved_dependencies ,
409
- json_output = json_output ,
410
- packages = packages ,
411
- )
430
+ output = dict (
431
+ headers = headers ,
432
+ files = files ,
433
+ resolved_dependencies_graph = resolved_dependencies ,
434
+ packages = packages ,
435
+ )
412
436
413
- else :
414
- write_output (
415
- headers = headers ,
416
- requirements = requirements ,
417
- resolved_dependencies = resolved_dependencies ,
418
- json_output = pdt_output ,
419
- packages = packages ,
420
- pdt_output = True ,
421
- )
437
+ write_output (
438
+ json_output = json_output or pdt_output ,
439
+ output = output ,
440
+ )
422
441
423
442
if verbose :
424
443
click .secho ("done!" )
@@ -461,9 +480,7 @@ def resolve(
461
480
analyze_setup_py_insecurely = analyze_setup_py_insecurely ,
462
481
)
463
482
464
- initial_requirements = [d .to_dict () for d in direct_dependencies ]
465
-
466
- return initial_requirements , resolved_dependencies , packages
483
+ return resolved_dependencies , packages
467
484
468
485
469
486
def get_requirements_from_direct_dependencies (
@@ -483,27 +500,11 @@ def get_requirements_from_direct_dependencies(
483
500
yield req
484
501
485
502
486
- def write_output (
487
- headers , requirements , resolved_dependencies , json_output , packages , pdt_output = False
488
- ):
503
+ def write_output (output , json_output ):
489
504
"""
490
505
Write headers, requirements and resolved_dependencies as JSON to ``json_output``.
491
506
Return the output data.
492
507
"""
493
-
494
- if not pdt_output :
495
- output = dict (
496
- headers = headers ,
497
- requirements = requirements ,
498
- resolved_dependencies = resolved_dependencies ,
499
- packages = packages ,
500
- )
501
- else :
502
- output = dict (
503
- resolved_dependencies = resolved_dependencies ,
504
- packages = packages ,
505
- )
506
-
507
508
json .dump (output , json_output , indent = 2 )
508
509
return output
509
510
0 commit comments