Skip to content

Commit b9f688d

Browse files
committed
Use nested_file for recursive parsing
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 6a8d23a commit b9f688d

3 files changed

Lines changed: 25 additions & 103 deletions

File tree

src/python_inspector/api.py

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

124-
known_files = {*requirement_files}
125-
visited_files = set()
126-
while True:
127-
unvisited_files = known_files - visited_files
128-
for req_file in unvisited_files:
129-
deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file)
130-
for extra_data in dependencies.get_extra_data_from_requirements(
131-
requirements_file=req_file
132-
):
133-
index_urls = (*index_urls, *tuple(extra_data.get("extra_index_urls") or []))
134-
recursive_files = extra_data.get("requirements") or []
135-
direct_dependencies.extend(deps)
136-
dirname = os.path.dirname(req_file)
137-
recursive_files = [os.path.join(dirname, f) for f in recursive_files]
138-
package_data = [
139-
pkg_data.to_dict()
140-
for pkg_data in PipRequirementsFileHandler.parse(location=req_file)
141-
]
142-
files.append(
143-
dict(
144-
type="file",
145-
path=req_file,
146-
package_data=package_data,
147-
)
124+
for req_file in requirement_files:
125+
deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file)
126+
for extra_data in dependencies.get_extra_data_from_requirements(requirements_file=req_file):
127+
index_urls = (*index_urls, *tuple(extra_data.get("extra_index_urls") or []))
128+
direct_dependencies.extend(deps)
129+
package_data = [
130+
pkg_data.to_dict() for pkg_data in PipRequirementsFileHandler.parse(location=req_file)
131+
]
132+
files.append(
133+
dict(
134+
type="file",
135+
path=req_file,
136+
package_data=package_data,
148137
)
149-
visited_files.add(req_file)
150-
known_files.update(recursive_files)
151-
152-
if known_files == visited_files:
153-
break
138+
)
154139

155140
for specifier in specifiers:
156141
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)