Skip to content

Commit 70d82f0

Browse files
authored
Merge pull request #69 from nexB/output_format_change
Change output format #68
2 parents 5b7fb3f + 7a6251f commit 70d82f0

18 files changed

+3770
-1355
lines changed

CHANGELOG.rst

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,20 @@ Changelog
22
=========
33

44

5+
v0.7.2
6+
------
7+
8+
- Change Output Format to look like ScanCode-Toolkit #68
9+
https://github.com/nexB/python-inspector/issues/68 , we have removed
10+
"requirements" from the ouptut and added a new field "files".
11+
12+
513
v0.7.1
614
------
715

8-
- Correct version reporting #70.
16+
- Correct version reporting #70
17+
https://github.com/nexB/python-inspector/issues/70 .
18+
919

1020
v0.7.0
1121
------

src/python_inspector/resolve_cli.py

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
TRACE = False
3838

39-
__version__ = "0.7.1"
39+
__version__ = "0.7.2"
4040

4141
DEFAULT_PYTHON_VERSION = "38"
4242
PYPI_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

469486
def 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

tests/data/default-url-expected.json

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,20 @@
22
"headers": {
33
"tool_name": "python-inspector",
44
"tool_homepageurl": "https://github.com/nexB/python-inspector",
5-
"tool_version": "0.7.1",
5+
"tool_version": "0.7.2",
66
"options": [
77
"--specifier zipp==3.8.0",
88
"--index-url https://pypi.org/simple",
99
"--python-version 38",
1010
"--operating-system linux",
1111
"--json <file>"
1212
],
13-
"notice": "Dependency tree generated with python-inspector.\npython-inspector is a free software tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.",
13+
"notice": "Dependency tree generated with python-inspector.\npython-inspector is a free software tool from nexB Inc. and others.\nVisit https://github.com/nexB/python-inspector/ for support and download.",
1414
"warnings": [],
1515
"errors": []
1616
},
17-
"requirements": [
18-
{
19-
"purl": "pkg:pypi/zipp@3.8.0",
20-
"extracted_requirement": "zipp==3.8.0",
21-
"scope": "install",
22-
"is_runtime": true,
23-
"is_optional": false,
24-
"is_resolved": true,
25-
"resolved_package": {},
26-
"extra_data": {}
27-
}
28-
],
29-
"resolved_dependencies": [
17+
"files": [],
18+
"resolved_dependencies_graph": [
3019
{
3120
"package": "pkg:pypi/zipp@3.8.0",
3221
"dependencies": []

0 commit comments

Comments
 (0)