Skip to content

Commit a62fd94

Browse files
authored
Fix the pypi direct/transitive bug (#187)
Signed-off-by: Jiyeong Seok <[email protected]>
1 parent ac76ac2 commit a62fd94

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

src/fosslight_dependency/constant.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
# Supported package name and manifest file
2727
SUPPORT_PACKAE = {
28-
PYPI: ['requirements.txt', 'setup.py'],
28+
PYPI: ['requirements.txt', 'setup.py', 'pyproject.toml'],
2929
NPM: 'package.json',
3030
MAVEN: 'pom.xml',
3131
GRADLE: 'build.gradle',

src/fosslight_dependency/package_manager/Pypi.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ def create_virtualenv(self):
7575
install_cmd_list = []
7676
for manifest_file in manifest_files:
7777
if os.path.exists(manifest_file):
78-
if manifest_file == 'setup.py':
79-
install_cmd_list.append("pip install .")
80-
elif manifest_file == 'requirements.txt':
78+
if manifest_file == 'requirements.txt':
8179
install_cmd_list.append("pip install -r requirements.txt")
80+
else:
81+
install_cmd_list.append("pip install .")
8282
else:
8383
manifest_files.remove(manifest_file)
8484
self.set_manifest_file(manifest_files)
@@ -237,7 +237,7 @@ def start_pip_licenses(self):
237237
install_deptree_command = f"pip install {pipdeptree}"
238238
command_list.append(install_deptree_command)
239239
uninstall_deptree_command = f"pip uninstall -y {pipdeptree}"
240-
pipdeptree_command = f"{pipdeptree} --local-only --json-tree -e pipdeptree > {self.tmp_deptree_file}"
240+
pipdeptree_command = f"{pipdeptree} --json-tree -e 'pipdeptree,pip,wheel,setuptools' > {self.tmp_deptree_file}"
241241
command_list.append(pipdeptree_command)
242242
command_list.append(uninstall_deptree_command)
243243
command_list.append(deactivate_command)
@@ -247,8 +247,16 @@ def start_pip_licenses(self):
247247
cmd_ret = subprocess.call(command, shell=True)
248248
if cmd_ret == 0:
249249
self.append_input_package_list_file(self.tmp_file_name)
250+
with open(self.tmp_file_name, 'r', encoding='utf-8') as json_f:
251+
json_data = json.load(json_f)
252+
for d in json_data:
253+
self.total_dep_list.append(re.sub(r"[-_.]+", "-", d['Name']).lower())
250254
if len(pip_license_pkg_list) != 0:
251255
self.append_input_package_list_file(self.tmp_pip_license_info_file_name)
256+
with open(self.tmp_pip_license_info_file_name, 'r', encoding='utf-8') as json_f:
257+
json_data = json.load(json_f)
258+
for d in json_data:
259+
self.total_dep_list.append(re.sub(r"[-_.]+", "-", d['Name']).lower())
252260
else:
253261
logger.error(f"Failed to run command: {command}")
254262
ret = False
@@ -287,7 +295,9 @@ def parse_oss_information(self, f_name):
287295

288296
comment_list = []
289297
deps_list = []
290-
if self.direct_dep_list:
298+
if oss_init_name == self.package_name:
299+
comment_list.append('root package')
300+
elif self.direct_dep and len(self.direct_dep_list) > 0:
291301
if f'{oss_init_name}({oss_version})' in self.direct_dep_list:
292302
comment_list.append('direct')
293303
else:
@@ -312,12 +322,12 @@ def get_dependencies(self, dependencies, package):
312322
deps = 'dependencies'
313323
installed_ver = 'installed_version'
314324

315-
pkg_name = package[package_name]
325+
pkg_name = re.sub(r"[-_.]+", "-", package[package_name]).lower()
316326
pkg_ver = package[installed_ver]
317327
dependency_list = package[deps]
318328
dependencies[f"{pkg_name}({pkg_ver})"] = []
319329
for dependency in dependency_list:
320-
dep_name = dependency[package_name]
330+
dep_name = re.sub(r"[-_.]+", "-", dependency[package_name]).lower()
321331
dep_version = dependency[installed_ver]
322332
dependencies[f"{pkg_name}({pkg_ver})"].append(f"{dep_name}({dep_version})")
323333
if dependency[deps] != []:
@@ -332,8 +342,20 @@ def parse_direct_dependencies(self):
332342

333343
with open(self.tmp_deptree_file, 'r', encoding='utf8') as f:
334344
json_f = json.load(f)
335-
for package in json_f:
336-
self.direct_dep_list.append(f"{package['package_name']}({package['installed_version']})")
345+
root_package = json_f
346+
if ('pyproject.toml' in self.manifest_file_name) or ('setup.py' in self.manifest_file_name):
347+
direct_without_system_package = 0
348+
for package in root_package:
349+
package_name = re.sub(r"[-_.]+", "-", package['package_name']).lower()
350+
if package_name in self.total_dep_list:
351+
direct_without_system_package += 1
352+
if direct_without_system_package == 1:
353+
self.package_name = re.sub(r"[-_.]+", "-", json_f[0]['package_name']).lower()
354+
root_package = json_f[0]['dependencies']
355+
356+
for package in root_package:
357+
package_name = re.sub(r"[-_.]+", "-", package['package_name']).lower()
358+
self.direct_dep_list.append(f"{package_name}({package['installed_version']})")
337359
if package['dependencies'] == []:
338360
continue
339361
self.relation_tree = self.get_dependencies(self.relation_tree, package)

0 commit comments

Comments
 (0)