Skip to content

Commit 9956d2e

Browse files
committed
Use nested_file for recursive parsing
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 4a0c92d commit 9956d2e

File tree

3 files changed

+25
-103
lines changed

3 files changed

+25
-103
lines changed

src/python_inspector/api.py

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -143,36 +143,21 @@ def resolve_dependencies(
143143
if PYPI_SIMPLE_URL not in index_urls:
144144
index_urls = tuple([PYPI_SIMPLE_URL]) + tuple(index_urls)
145145

146-
known_files = {*requirement_files}
147-
visited_files = set()
148-
while True:
149-
unvisited_files = known_files - visited_files
150-
for req_file in unvisited_files:
151-
deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file)
152-
for extra_data in dependencies.get_extra_data_from_requirements(
153-
requirements_file=req_file
154-
):
155-
index_urls = (*index_urls, *tuple(extra_data.get("extra_index_urls") or []))
156-
recursive_files = extra_data.get("requirements") or []
157-
direct_dependencies.extend(deps)
158-
dirname = os.path.dirname(req_file)
159-
recursive_files = [os.path.join(dirname, f) for f in recursive_files]
160-
package_data = [
161-
pkg_data.to_dict()
162-
for pkg_data in PipRequirementsFileHandler.parse(location=req_file)
163-
]
164-
files.append(
165-
dict(
166-
type="file",
167-
path=req_file,
168-
package_data=package_data,
169-
)
146+
for req_file in requirement_files:
147+
deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file)
148+
for extra_data in dependencies.get_extra_data_from_requirements(requirements_file=req_file):
149+
index_urls = (*index_urls, *tuple(extra_data.get("extra_index_urls") or []))
150+
direct_dependencies.extend(deps)
151+
package_data = [
152+
pkg_data.to_dict() for pkg_data in PipRequirementsFileHandler.parse(location=req_file)
153+
]
154+
files.append(
155+
dict(
156+
type="file",
157+
path=req_file,
158+
package_data=package_data,
170159
)
171-
visited_files.add(req_file)
172-
known_files.update(recursive_files)
173-
174-
if known_files == visited_files:
175-
break
160+
)
176161

177162
for specifier in specifiers:
178163
dep = dependencies.get_dependency(specifier=specifier)

src/python_inspector/dependencies.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515

1616
from _packagedcode import models
1717
from _packagedcode.pypi import PipRequirementsFileHandler
18-
from _packagedcode.pypi import PythonSetupPyHandler
19-
from python_inspector.resolution import get_requirements_from_distribution
18+
from _packagedcode.pypi import get_requirements_txt_dependencies
2019

2120
"""
2221
Utilities to resolve dependencies .
@@ -30,14 +29,16 @@ def get_dependencies_from_requirements(requirements_file="requirements.txt"):
3029
Yield DependentPackage for each requirement in a `requirement`
3130
file.
3231
"""
33-
for package_data in PipRequirementsFileHandler.parse(location=requirements_file):
34-
for dependent_package in package_data.dependencies:
35-
if TRACE:
36-
print(
37-
"dependent_package.extracted_requirement:",
38-
dependent_package.extracted_requirement,
39-
)
40-
yield dependent_package
32+
dependent_packages, _ = get_requirements_txt_dependencies(
33+
location=requirements_file, include_nested=True
34+
)
35+
for dependent_package in dependent_packages:
36+
if TRACE:
37+
print(
38+
"dependent_package.extracted_requirement:",
39+
dependent_package.extracted_requirement,
40+
)
41+
yield dependent_package
4142

4243

4344
def get_extra_data_from_requirements(requirements_file="requirements.txt"):

tests/data/test-api-with-recursive-requirement-file.json

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -109,70 +109,6 @@
109109
"purl": null
110110
}
111111
]
112-
},
113-
{
114-
"type": "file",
115-
"path": "/home/tg1999/Desktop/python-inspector-1/tests/data/recursive_requirements/com.txt",
116-
"package_data": [
117-
{
118-
"type": "pypi",
119-
"namespace": null,
120-
"name": null,
121-
"version": null,
122-
"qualifiers": {},
123-
"subpath": null,
124-
"primary_language": "Python",
125-
"description": null,
126-
"release_date": null,
127-
"parties": [],
128-
"keywords": [],
129-
"homepage_url": null,
130-
"download_url": null,
131-
"size": null,
132-
"sha1": null,
133-
"md5": null,
134-
"sha256": null,
135-
"sha512": null,
136-
"bug_tracking_url": null,
137-
"code_view_url": null,
138-
"vcs_url": null,
139-
"copyright": null,
140-
"license_expression": null,
141-
"declared_license": null,
142-
"notice_text": null,
143-
"source_packages": [],
144-
"file_references": [],
145-
"extra_data": {},
146-
"dependencies": [
147-
{
148-
"purl": "pkg:pypi/simplekml@1.3.5",
149-
"extracted_requirement": "simplekml==1.3.5",
150-
"scope": "install",
151-
"is_runtime": true,
152-
"is_optional": false,
153-
"is_resolved": true,
154-
"resolved_package": {},
155-
"extra_data": {
156-
"is_editable": false,
157-
"link": null,
158-
"hash_options": [],
159-
"is_constraint": false,
160-
"is_archive": null,
161-
"is_wheel": false,
162-
"is_url": null,
163-
"is_vcs_url": null,
164-
"is_name_at_url": false,
165-
"is_local_path": null
166-
}
167-
}
168-
],
169-
"repository_homepage_url": null,
170-
"repository_download_url": null,
171-
"api_data_url": null,
172-
"datasource_id": "pip_requirements",
173-
"purl": null
174-
}
175-
]
176112
}
177113
],
178114
"packages": [

0 commit comments

Comments
 (0)