3636
3737TRACE = False
3838
39- __version__ = "0.7.1 "
39+ __version__ = "0.7.2 "
4040
4141DEFAULT_PYTHON_VERSION = "38"
4242PYPI_SIMPLE_URL = "https://pypi.org/simple"
@@ -251,6 +251,8 @@ def resolve_dependencies(
251251 # TODO: deduplicate me
252252 direct_dependencies = []
253253
254+ files = []
255+
254256 if PYPI_SIMPLE_URL not in index_urls :
255257 index_urls = tuple ([PYPI_SIMPLE_URL ]) + tuple (index_urls )
256258
@@ -259,6 +261,16 @@ def resolve_dependencies(
259261 for extra_data in dependencies .get_extra_data_from_requirements (requirements_file = req_file ):
260262 index_urls = (* index_urls , * tuple (extra_data .get ("extra_index_urls" ) or []))
261263 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+ )
262274
263275 for specifier in specifiers :
264276 dep = dependencies .get_dependency (specifier = specifier )
@@ -282,6 +294,7 @@ def resolve_dependencies(
282294 )
283295 ctx .exit (1 )
284296
297+ setup_py_file_deps = package_data .dependencies
285298 for dep in package_data .dependencies :
286299 # TODO : we need to handle to all the scopes
287300 if dep .scope == "install" :
@@ -303,17 +316,30 @@ def resolve_dependencies(
303316 location = requirement_location ,
304317 )
305318 if deps :
319+ setup_py_file_deps = list (deps )
306320 has_deps = True
307321 direct_dependencies .extend (deps )
308322
309323 if not has_deps and contain_string (string = "_require" , files = [setup_py_file ]):
310324 if analyze_setup_py_insecurely :
311- direct_dependencies . extend (
325+ insecure_setup_py_deps = list (
312326 parse_deps_from_setup_py_insecurely (setup_py = setup_py_file )
313327 )
328+ setup_py_file_deps = insecure_setup_py_deps
329+ direct_dependencies .extend (insecure_setup_py_deps )
314330 else :
315331 raise Exception ("Unable to collect setup.py dependencies securely" )
316332
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+
317343 if not direct_dependencies :
318344 click .secho ("Error: no requirements requested." )
319345 ctx .exit (1 )
@@ -360,7 +386,7 @@ def resolve_dependencies(
360386 click .secho (f" { repo } " )
361387
362388 # resolve dependencies proper
363- requirements , resolved_dependencies , purls = resolve (
389+ resolved_dependencies , purls = resolve (
364390 direct_dependencies = direct_dependencies ,
365391 environment = environment ,
366392 repos = repos ,
@@ -381,7 +407,7 @@ def resolve_dependencies(
381407 notice = (
382408 "Dependency tree generated with python-inspector.\n "
383409 "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."
385411 )
386412
387413 headers = dict (
@@ -401,24 +427,17 @@ def resolve_dependencies(
401427 list (get_pypi_data_from_purl (package , repos = repos , environment = environment )),
402428 )
403429
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+ )
412436
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+ )
422441
423442 if verbose :
424443 click .secho ("done!" )
@@ -461,9 +480,7 @@ def resolve(
461480 analyze_setup_py_insecurely = analyze_setup_py_insecurely ,
462481 )
463482
464- initial_requirements = [d .to_dict () for d in direct_dependencies ]
465-
466- return initial_requirements , resolved_dependencies , packages
483+ return resolved_dependencies , packages
467484
468485
469486def get_requirements_from_direct_dependencies (
@@ -483,27 +500,11 @@ def get_requirements_from_direct_dependencies(
483500 yield req
484501
485502
486- def write_output (
487- headers , requirements , resolved_dependencies , json_output , packages , pdt_output = False
488- ):
503+ def write_output (output , json_output ):
489504 """
490505 Write headers, requirements and resolved_dependencies as JSON to ``json_output``.
491506 Return the output data.
492507 """
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-
507508 json .dump (output , json_output , indent = 2 )
508509 return output
509510
0 commit comments