Skip to content

Commit b83ec25

Browse files
authored
Refactoring oss item (#213)
* Update graph converter to ossitem --------- Signed-off-by: jiyeong.seok <[email protected]>
1 parent 062f34d commit b83ec25

19 files changed

+484
-377
lines changed

Diff for: requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ lxml
44
virtualenv
55
pyyaml
66
lastversion
7-
fosslight_util~=1.4.47
7+
fosslight_util>=2.0.0
88
PyGithub
99
requirements-parser
1010
defusedxml

Diff for: src/fosslight_dependency/_analyze_dependency.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def analyze_dependency(package_manager_name, input_dir, output_dir, pip_activate
2828
output_custom_dir='', app_name=const.default_app_name, github_token='', manifest_file_name=[],
2929
direct=True):
3030
ret = True
31-
package_sheet_list = []
31+
package_dep_item_list = []
3232
cover_comment = ''
3333

3434
if package_manager_name == const.PYPI:
@@ -60,7 +60,7 @@ def analyze_dependency(package_manager_name, input_dir, output_dir, pip_activate
6060
else:
6161
logger.error(f"Not supported package manager name: {package_manager_name}")
6262
ret = False
63-
return ret, package_sheet_list
63+
return ret, package_dep_item_list
6464

6565
if manifest_file_name:
6666
package_manager.set_manifest_file(manifest_file_name)
@@ -76,7 +76,8 @@ def analyze_dependency(package_manager_name, input_dir, output_dir, pip_activate
7676
logger.info(f"Parse oss information with file: {f_name}")
7777

7878
if os.path.isfile(f_name):
79-
package_sheet_list.extend(package_manager.parse_oss_information(f_name))
79+
package_manager.parse_oss_information(f_name)
80+
package_dep_item_list.extend(package_manager.dep_items)
8081
else:
8182
logger.error(f"Failed to open input file: {f_name}")
8283
ret = False
@@ -90,4 +91,4 @@ def analyze_dependency(package_manager_name, input_dir, output_dir, pip_activate
9091

9192
del package_manager
9293

93-
return ret, package_sheet_list, cover_comment
94+
return ret, package_dep_item_list, cover_comment

Diff for: src/fosslight_dependency/_graph_convertor.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,23 @@
88

99

1010
class GraphConvertor:
11-
def __init__(self, package_list: Optional[list] = None):
11+
def __init__(self, dep_items: Optional[list] = None):
1212
self._verticies = {}
1313
self._edges = []
14-
if package_list:
15-
self.init_list(package_list)
14+
if dep_items:
15+
self.init_list(dep_items)
1616

17-
def init_list(self, package_list: list):
17+
def init_list(self, dep_items: list):
1818
"""
19-
Initialize package_list to self._verticies and self._edges
19+
Initialize dep_items to self._verticies and self._edges
2020
2121
Args:
22-
package_list (list): List containing package information
22+
dep_items : List containing package information
2323
"""
2424
depend_on_package_dict = {}
25-
for idx, package_info in enumerate(package_list):
26-
package_name = package_info[0]
27-
depend_on_packages_str = package_info[-1]
28-
depend_on_packages = list(map((lambda x: x.strip()), depend_on_packages_str.split(",")))
25+
for idx, file_item in enumerate(dep_items):
26+
package_name = file_item.purl
27+
depend_on_packages = file_item.depends_on
2928
self._verticies[package_name] = idx
3029
depend_on_package_dict[package_name] = depend_on_packages
3130
else:

Diff for: src/fosslight_dependency/_package_manager.py

+2-13
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ def __init__(self, package_manager_name, dn_url, input_dir, output_dir):
4949
self.manifest_file_name = []
5050
self.relation_tree = {}
5151
self.package_name = ''
52-
self.purl_dict = {}
5352
self.cover_comment = ''
53+
self.dep_items = []
5454

5555
self.platform = platform.system()
5656
self.license_scanner_bin = check_license_scanner(self.platform)
@@ -67,6 +67,7 @@ def __del__(self):
6767
self.manifest_file_name = []
6868
self.relation_tree = {}
6969
self.package_name = ''
70+
self.dep_items = []
7071

7172
def run_plugin(self):
7273
ret = True
@@ -257,18 +258,6 @@ def parse_dependency_tree(self, f_name):
257258
except Exception as e:
258259
logger.warning(f'Fail to parse gradle dependency tree:{e}')
259260

260-
def change_dep_to_purl(self, sheet_list):
261-
for oss_item in sheet_list:
262-
try:
263-
if len(oss_item) < 10:
264-
break
265-
deps_list = oss_item[9]
266-
deps_purl = list(filter(None, map(lambda x: self.purl_dict.get(x, ''), deps_list)))
267-
oss_item[9] = ','.join(deps_purl)
268-
except Exception as e:
269-
logger.warning(f'Fail to change depend_on to purl:{e}')
270-
return sheet_list
271-
272261

273262
def get_url_to_purl(url, pkg_manager, oss_name='', oss_version=''):
274263
purl_prefix = f'pkg:{pkg_manager}'

Diff for: src/fosslight_dependency/dependency_item.py

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Copyright (c) 2024 LG Electronics Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
import logging
7+
from fosslight_util.constant import LOGGER_NAME
8+
from fosslight_util.oss_item import FileItem
9+
10+
_logger = logging.getLogger(LOGGER_NAME)
11+
12+
13+
class DependencyItem(FileItem):
14+
def __init__(self):
15+
super().__init__("")
16+
17+
self._depends_on_raw = [] # name(version) format
18+
self._depends_on = [] # purl format
19+
self.purl = ""
20+
21+
def __del__(self):
22+
pass
23+
24+
@property
25+
def depends_on(self):
26+
return self._depends_on
27+
28+
@depends_on.setter
29+
def depends_on(self, value):
30+
if not value:
31+
self._depends_on = []
32+
else:
33+
if not isinstance(value, list):
34+
value = value.split(",")
35+
self._depends_on.extend(value)
36+
self._depends_on = [item.strip() for item in self._depends_on]
37+
self._depends_on = list(set(self._depends_on))
38+
39+
@property
40+
def depends_on_raw(self):
41+
return self._depends_on_raw
42+
43+
@depends_on_raw.setter
44+
def depends_on_raw(self, value):
45+
if not value:
46+
self._depends_on_raw = []
47+
else:
48+
if not isinstance(value, list):
49+
value = value.split(",")
50+
self._depends_on_raw.extend(value)
51+
self._depends_on_raw = [item.strip() for item in self._depends_on_raw]
52+
self._depends_on_raw = list(set(self._depends_on_raw))
53+
54+
def get_print_array(self):
55+
items = []
56+
for oss in self.oss_items:
57+
exclude = "Exclude" if self.exclude or oss.exclude else ""
58+
lic = ",".join(oss.license)
59+
depends_on = ",".join(self.depends_on) if len(self.depends_on) > 0 else ""
60+
61+
oss_item = [self.purl, oss.name, oss.version, lic, oss.download_location, oss.homepage,
62+
oss.copyright, exclude, oss.comment, depends_on]
63+
items.append(oss_item)
64+
65+
return items
66+
67+
def get_print_json(self):
68+
items = []
69+
for oss in self.oss_items:
70+
json_item = {}
71+
json_item["name"] = oss.name
72+
json_item["version"] = oss.version
73+
74+
if self.purl != "":
75+
json_item["package url"] = self.purl
76+
if len(oss.license) > 0:
77+
json_item["license"] = oss.license
78+
if oss.download_location != "":
79+
json_item["download location"] = oss.download_location
80+
if oss.homepage != "":
81+
json_item["homepage"] = oss.homepage
82+
if oss.copyright != "":
83+
json_item["copyright text"] = oss.copyright
84+
if self.exclude or oss.exclude:
85+
json_item["exclude"] = True
86+
if oss.comment != "":
87+
json_item["comment"] = oss.comment
88+
if len(self.depends_on) > 0:
89+
json_item["depends on"] = self.depends_on
90+
91+
items.append(json_item)
92+
93+
return items
94+
95+
96+
def change_dependson_to_purl(purl_dict, dep_items):
97+
for dep_item in dep_items:
98+
try:
99+
dep_item.depends_on = list(filter(None, map(lambda x: purl_dict.get(x, ''), dep_item.depends_on_raw)))
100+
101+
except Exception as e:
102+
_logger.warning(f'Fail to change depend_on to purl:{e}')
103+
return dep_items

Diff for: src/fosslight_dependency/package_manager/Android.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import fosslight_util.constant as constant
99
import fosslight_dependency.constant as const
1010
from fosslight_dependency._package_manager import PackageManager, get_url_to_purl
11+
from fosslight_dependency.dependency_item import DependencyItem, change_dependson_to_purl
12+
from fosslight_util.oss_item import OssItem
1113

1214
logger = logging.getLogger(constant.LOGGER_NAME)
1315

@@ -40,43 +42,41 @@ def check_input_path(self):
4042

4143
def parse_oss_information(self, f_name):
4244
with open(f_name, 'r', encoding='utf8') as input_fp:
43-
sheet_list = []
44-
45+
purl_dict = {}
4546
for i, line in enumerate(input_fp.readlines()):
46-
comment = ''
47+
dep_item = DependencyItem()
48+
oss_item = OssItem()
4749
split_str = line.strip().split("\t")
4850
if i < 2:
4951
continue
5052

51-
if len(split_str) == 9:
52-
idx, manifest_file, oss_name, oss_version, license_name, dn_loc, homepage, NA, NA = split_str
53-
elif len(split_str) == 7:
54-
idx, manifest_file, oss_name, oss_version, license_name, dn_loc, homepage = split_str
53+
if len(split_str) == 9 or len(split_str) == 7:
54+
_, _, oss_item.name, oss_item.version, oss_item.license, \
55+
oss_item.download_location, oss_item.homepage = split_str[:7]
5556
else:
5657
continue
57-
purl = get_url_to_purl(dn_loc, 'maven')
58-
self.purl_dict[f'{oss_name}({oss_version})'] = purl
58+
dep_item.purl = get_url_to_purl(oss_item.download_location, 'maven')
59+
purl_dict[f'{oss_item.name}({oss_item.version})'] = dep_item.purl
5960

60-
comment_list = []
61-
deps_list = []
6261
if self.direct_dep:
63-
dep_key = f"{oss_name}({oss_version})"
62+
dep_key = f"{oss_item.name}({oss_item.version})"
6463
if self.total_dep_list:
6564
if dep_key not in self.total_dep_list:
6665
continue
6766
if dep_key in self.direct_dep_list:
68-
comment_list.append('direct')
67+
oss_item.comment = 'direct'
6968
else:
70-
comment_list.append('transitive')
69+
oss_item.comment = 'transitive'
7170
try:
7271
if dep_key in self.relation_tree:
73-
deps_list.extend(self.relation_tree[dep_key])
72+
dep_item.depends_on_raw = self.relation_tree[dep_key]
7473
except Exception as e:
7574
logger.error(f"Fail to find oss scope in dependency tree: {e}")
76-
comment = ','.join(comment_list)
7775

78-
sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
79-
'', '', comment, deps_list])
80-
sheet_list = self.change_dep_to_purl(sheet_list)
76+
dep_item.oss_items.append(oss_item)
77+
self.dep_items.append(dep_item)
78+
79+
if self.direct_dep:
80+
self.dep_items = change_dependson_to_purl(purl_dict, self.dep_items)
8181

82-
return sheet_list
82+
return

Diff for: src/fosslight_dependency/package_manager/Carthage.py

+18-17
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from fosslight_dependency._package_manager import PackageManager
1212
from fosslight_dependency._package_manager import connect_github, get_github_license, check_and_run_license_scanner
1313
from fosslight_dependency._package_manager import get_url_to_purl
14+
from fosslight_dependency.dependency_item import DependencyItem
15+
from fosslight_util.oss_item import OssItem
1416

1517
logger = logging.getLogger(constant.LOGGER_NAME)
1618

@@ -35,9 +37,8 @@ def __init__(self, input_dir, output_dir, github_token):
3537
def parse_oss_information(self, f_name):
3638
github = "github"
3739
checkout_dir_list = get_checkout_dirname()
38-
comment = ''
40+
3941
with open(f_name, 'r', encoding='utf8') as input_fp:
40-
sheet_list = []
4142
g = ''
4243
if not checkout_dir_list:
4344
g = connect_github(self.github_token)
@@ -47,21 +48,24 @@ def parse_oss_information(self, f_name):
4748
# Ref. https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md
4849
re_result = re.findall(r'(github|git)[\s]\"(\S*)\"[\s]\"(\S*)\"', line)
4950
try:
51+
dep_item = DependencyItem()
52+
oss_item = OssItem()
5053
repo = re_result[0][0]
5154
oss_path = re_result[0][1]
5255
if oss_path.endswith('.git'):
5356
oss_path = oss_path[:-4]
5457
oss_origin_name = oss_path.split('/')[-1]
55-
oss_name = self.package_manager_name + ":" + oss_origin_name
58+
oss_item.name = self.package_manager_name + ":" + oss_origin_name
5659

5760
if repo == github:
58-
homepage = self.dn_url + oss_path
61+
oss_item.homepage = self.dn_url + oss_path
5962
else:
60-
homepage = oss_path
61-
dn_loc = homepage
62-
oss_version = re_result[0][2]
63+
oss_item.homepage = oss_path
64+
oss_item.download_location = oss_item.homepage
65+
oss_item.version = re_result[0][2]
6366

64-
purl = get_url_to_purl(homepage, self.package_manager_name, oss_origin_name, oss_version)
67+
dep_item.purl = get_url_to_purl(oss_item.homepage, self.package_manager_name,
68+
oss_origin_name, oss_item.version)
6569

6670
license_name = ''
6771
find_license = False
@@ -89,20 +93,17 @@ def parse_oss_information(self, f_name):
8993
except Exception as e:
9094
logger.warning(f"Failed to get license with github api: {e}")
9195
license_name == ''
92-
96+
oss_item.license = license_name
9397
if self.direct_dep_list:
9498
if oss_origin_name in self.direct_dep_list:
95-
comment = 'direct'
99+
oss_item.comment = 'direct'
96100
else:
97-
comment = 'transitive'
98-
99-
sheet_list.append([purl, oss_name, oss_version, license_name, dn_loc, homepage,
100-
'', '', comment, ''])
101-
101+
oss_item.comment = 'transitive'
102+
dep_item.oss_items.append(oss_item)
103+
self.dep_items.append(dep_item)
102104
except Exception as e:
103105
logger.warning(f"Failed to parse oss information: {e}")
104-
105-
return sheet_list
106+
return
106107

107108
def parse_direct_dependencies(self):
108109
self.direct_dep = True

0 commit comments

Comments
 (0)