fosslight-util 1.4.48__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,9 +4,7 @@
4
4
  # SPDX-License-Identifier: Apache-2.0
5
5
 
6
6
  import logging
7
- import os
8
7
  from fosslight_util.constant import LOGGER_NAME
9
- from fosslight_util.parsing_yaml import parsing_yml
10
8
 
11
9
  logger = logging.getLogger(LOGGER_NAME)
12
10
  VERSION = 'version'
@@ -14,12 +12,16 @@ LICENSE = 'license'
14
12
  NAME = 'name'
15
13
 
16
14
 
17
- def compare_yaml(before_file, after_file):
18
- before_oss_items, _, _ = parsing_yml(before_file, os.path.dirname(before_file))
19
- after_oss_items, _, _ = parsing_yml(after_file, os.path.dirname(after_file))
15
+ def compare_yaml(before_fileitems, after_fileitems):
16
+ bf_raw = []
17
+ af_raw = []
18
+ for bf in before_fileitems:
19
+ bf_raw.extend(bf.get_print_json())
20
+ for af in after_fileitems:
21
+ af_raw.extend(af.get_print_json())
20
22
 
21
- before_items = get_merged_item(before_oss_items)
22
- after_items = get_merged_item(after_oss_items)
23
+ before_items = get_merged_item(bf_raw)
24
+ after_items = get_merged_item(af_raw)
23
25
 
24
26
  new_before = []
25
27
  for bi in before_items:
@@ -72,13 +74,18 @@ def compare_yaml(before_file, after_file):
72
74
  def get_merged_item(oss_items):
73
75
  item_list = []
74
76
  for oi in oss_items:
75
- if oi.exclude:
77
+ if oi.get("exclude", None):
76
78
  continue
77
- item_info = {NAME: oi.name, VERSION: oi.version, LICENSE: oi.license}
79
+ oi_name = oi.get("name", '')
80
+ oi_version = oi.get("version", '')
81
+ oi_license = oi.get("license", '')
82
+ if not (oi_name and oi_version and oi_license):
83
+ continue
84
+ item_info = {NAME: oi_name, VERSION: oi_version, LICENSE: oi_license}
78
85
 
79
- filtered = next(filter(lambda oss_dict: oss_dict[NAME] == oi.name and oss_dict[VERSION] == oi.version, item_list), None)
86
+ filtered = next(filter(lambda oss_dict: oss_dict[NAME] == oi_name and oss_dict[VERSION] == oi_version, item_list), None)
80
87
  if filtered:
81
- filtered[LICENSE].extend(oi.license)
88
+ filtered[LICENSE].extend(oi_license)
82
89
  filtered[LICENSE] = list(set(filtered[LICENSE]))
83
90
  else:
84
91
  item_list.append(item_info)
@@ -15,6 +15,17 @@ supported_sheet_and_scanner = {'SRC': FL_SOURCE,
15
15
  f'BIN_{FL_BINARY}': FL_BINARY,
16
16
  f'DEP_{FL_DEPENDENCY}': FL_DEPENDENCY}
17
17
 
18
+ FOSSLIGHT_SCANNER = 'fosslight_scanner'
19
+ FOSSLIGHT_SOURCE = 'fosslight_source'
20
+ FOSSLIGHT_DEPENDENCY = 'fosslight_dependency'
21
+ FOSSLIGHT_BINARY = 'fosslight_binary'
22
+
23
+ SHEET_NAME_FOR_SCANNER = {
24
+ FOSSLIGHT_SOURCE: 'SRC_FL_Source',
25
+ FOSSLIGHT_BINARY: 'BIN_FL_Binary',
26
+ FOSSLIGHT_DEPENDENCY: 'DEP_FL_Dependency'
27
+ }
28
+
18
29
  # Github : https://github.com/(owner)/(repo)
19
30
  # npm : https://www.npmjs.com/package/(package)/v/(version)
20
31
  # npm2 : https://www.npmjs.com/package/@(group)/(package)/v/(version)
@@ -33,7 +33,7 @@ def find_report_file(path_to_find):
33
33
  return ""
34
34
 
35
35
 
36
- def convert_excel_to_yaml(oss_report_to_read, output_file, sheet_names=""):
36
+ def convert_excel_to_yaml(oss_report_to_read: str, output_file: str, sheet_names: str = "") -> None:
37
37
  _file_extension = ".yaml"
38
38
  yaml_dict = {}
39
39
 
fosslight_util/correct.py CHANGED
@@ -7,19 +7,16 @@ import logging
7
7
  import os
8
8
  import copy
9
9
  import re
10
- from fosslight_util.constant import LOGGER_NAME
10
+ from fosslight_util.constant import LOGGER_NAME, FOSSLIGHT_SOURCE
11
11
  from fosslight_util.parsing_yaml import parsing_yml
12
- import fosslight_util.constant as constant
13
- from fosslight_util.oss_item import OssItem
14
12
 
15
13
  logger = logging.getLogger(LOGGER_NAME)
16
14
  SBOM_INFO_YAML = r"sbom(-|_)info[\s\S]*.ya?ml"
17
15
 
18
16
 
19
- def correct_with_yaml(correct_filepath, path_to_scan, scanner_oss_list):
17
+ def correct_with_yaml(correct_filepath, path_to_scan, scan_item):
20
18
  success = True
21
19
  msg = ""
22
- correct_list = {}
23
20
  correct_yaml = ""
24
21
  if correct_filepath == "":
25
22
  correct_filepath = path_to_scan
@@ -33,101 +30,60 @@ def correct_with_yaml(correct_filepath, path_to_scan, scanner_oss_list):
33
30
  if not correct_yaml:
34
31
  msg = f"Cannot find sbom-info.yaml in {correct_filepath}."
35
32
  success = False
36
- return success, msg, correct_list
33
+ return success, msg, scan_item
37
34
 
38
35
  rel_path = os.path.relpath(path_to_scan, correct_filepath)
39
36
 
40
- yaml_oss_list, _, err_msg = parsing_yml(correct_yaml, os.path.dirname(correct_yaml), print_log=True)
41
-
37
+ yaml_file_list, _, err_msg = parsing_yml(correct_yaml, os.path.dirname(correct_yaml), print_log=True)
42
38
  find_match = False
43
- matched_yaml = []
44
- for yitem in yaml_oss_list:
45
- matched_yaml.append([0]*len(yitem.source_name_or_path))
46
-
47
- for sheet_name, sheet_contents in scanner_oss_list.items():
48
- if sheet_name not in constant.supported_sheet_and_scanner.keys():
49
- continue
50
- correct_contents = copy.deepcopy(sheet_contents)
51
- scanner_name = constant.supported_sheet_and_scanner[sheet_name]
52
- matched_source_path_with_sbom = []
53
- for idx, oss_raw_item in enumerate(sheet_contents):
54
- if len(oss_raw_item) < 9:
55
- logger.warning(f"sheet list is too short ({len(oss_raw_item)}): {oss_raw_item}")
39
+ for scanner_name, _ in scan_item.file_items.items():
40
+ correct_fileitems = []
41
+ exclude_fileitems = []
42
+ for yaml_file_item in yaml_file_list:
43
+ yaml_path_exists = False
44
+ if yaml_file_item.source_name_or_path == '':
45
+ if scanner_name == FOSSLIGHT_SOURCE:
46
+ correct_item = copy.deepcopy(yaml_file_item)
47
+ correct_item.comment = 'Added by sbom-info.yaml'
48
+ correct_fileitems.append(correct_item)
56
49
  continue
57
- oss_item = OssItem('')
58
- oss_item.set_sheet_item(oss_raw_item, scanner_name)
50
+ for idx, scan_file_item in enumerate(scan_item.file_items[scanner_name]):
51
+ oss_rel_path = os.path.normpath(os.path.join(rel_path, scan_file_item.source_name_or_path))
52
+ yi_path = yaml_file_item.source_name_or_path
53
+ if ((os.path.normpath(yi_path) == os.path.normpath(oss_rel_path)) or
54
+ ((os.path.normpath(oss_rel_path).startswith(os.path.normpath(yi_path.rstrip('*')))))):
55
+ correct_item = copy.deepcopy(scan_file_item)
56
+ correct_item.exclude = yaml_file_item.exclude
57
+ correct_item.oss_items = copy.deepcopy(yaml_file_item.oss_items)
58
+ correct_item.comment = ''
59
+ correct_item.comment = 'Loaded from sbom-info.yaml'
60
+ correct_fileitems.append(correct_item)
59
61
 
60
- matched_yi = []
61
- if not oss_item.source_name_or_path[0] in matched_source_path_with_sbom:
62
- oss_rel_path = os.path.normpath(os.path.join(rel_path, oss_item.source_name_or_path[0]))
63
- for y_idx, yi in enumerate(yaml_oss_list):
64
- if not yi.source_name_or_path:
65
- continue
66
- for ys_idx, yi_path in enumerate(yi.source_name_or_path):
67
- yi_item = copy.deepcopy(yi)
68
- if ((os.path.normpath(yi_path) == os.path.normpath(oss_rel_path)) or
69
- ((os.path.normpath(oss_rel_path).startswith(os.path.normpath(yi_path.rstrip('*')))))):
70
- find_match = True
71
- yi_item.source_name_or_path = []
72
- yi_item.source_name_or_path = oss_item.source_name_or_path[0]
73
- matched_source_path_with_sbom.append(oss_item.source_name_or_path[0])
74
- matched_yi.append(yi_item)
75
- matched_yaml[y_idx][ys_idx] = 1
76
- if len(matched_yi) > 0:
77
- for matched_yi_item in matched_yi:
78
- matched_oss_item = copy.deepcopy(matched_yi_item)
79
- if matched_oss_item.comment:
80
- matched_oss_item.comment += '/'
81
- matched_oss_item.comment += 'Loaded from sbom-info.yaml'
82
- if sheet_name == 'BIN_FL_Binary':
83
- matched_oss_item.bin_vulnerability = oss_item.bin_vulnerability
84
- matched_oss_item.bin_tlsh = oss_item.bin_tlsh
85
- matched_oss_item.bin_sha1 = oss_item.bin_sha1
86
- matched_oss_array = matched_oss_item.get_print_array(scanner_name)[0]
87
- correct_contents.append(matched_oss_array)
88
- oss_item.exclude = True
89
- if oss_item.comment:
90
- oss_item.comment += '/'
91
- oss_item.comment += 'Excluded by sbom-info.yaml'
92
- correct_contents[idx] = oss_item.get_print_array(scanner_name)[0]
93
- else:
94
- oss_item.exclude = True
95
- if oss_item.comment:
96
- oss_item.comment += '/'
97
- oss_item.comment += 'Excluded by sbom-info.yaml'
98
- correct_contents[idx] = oss_item.get_print_array(scanner_name)[0]
62
+ yaml_path_exists = True
63
+ exclude_fileitems.append(idx)
99
64
 
100
- if sheet_name == 'SRC_FL_Source':
101
- for n_idx, ni in enumerate(matched_yaml):
102
- y_item = copy.deepcopy(yaml_oss_list[n_idx])
103
- all_matched = False
104
- if sum(ni) != 0:
105
- not_matched_path = []
106
- for idx, id in enumerate(ni):
107
- if not id:
108
- not_matched_path.append(y_item.source_name_or_path[idx])
109
- y_item.source_name_or_path = []
110
- y_item.source_name_or_path = not_matched_path
111
- if len(not_matched_path) == 0:
112
- all_matched = True
113
- if y_item.comment:
114
- y_item.comment += '/'
115
- y_item.comment += 'Added by sbom-info.yaml'
116
- if not (y_item.source_name_or_path or all_matched):
117
- correct_contents.append(y_item.get_print_array()[0])
118
- continue
119
- for y_path in y_item.source_name_or_path:
120
- y_item_i = copy.deepcopy(y_item)
121
- if not os.path.exists(os.path.normpath(os.path.join(correct_filepath, y_path))):
122
- y_item_i.exclude = True
123
- y_item_i.source_name_or_path = []
124
- y_item_i.source_name_or_path = y_path
125
- correct_contents.append(y_item_i.get_print_array()[0])
126
- correct_list[sheet_name] = correct_contents
65
+ if not yaml_path_exists:
66
+ correct_item = copy.deepcopy(yaml_file_item)
67
+ if os.path.exists(os.path.normpath(yaml_file_item.source_name_or_path)):
68
+ correct_item.comment = 'Loaded from sbom-info.yaml'
69
+ correct_fileitems.append(correct_item)
70
+ else:
71
+ if scanner_name == FOSSLIGHT_SOURCE:
72
+ correct_item.exclude = True
73
+ correct_item.comment = 'Added by sbom-info.yaml'
74
+ correct_fileitems.append(correct_item)
75
+ if correct_fileitems:
76
+ scan_item.append_file_items(correct_fileitems, scanner_name)
77
+ find_match = True
78
+ if exclude_fileitems:
79
+ exclude_fileitems = list(set(exclude_fileitems))
80
+ for e_idx in exclude_fileitems:
81
+ scan_item.file_items[scanner_name][e_idx].exclude = True
82
+ scan_item.file_items[scanner_name][e_idx].comment = 'Excluded by sbom-info.yaml'
127
83
 
128
84
  if not find_match:
129
85
  success = False
130
86
  err_msg = 'No match items in sbom-info.yaml'
131
- return success, err_msg, yaml_oss_list
87
+ return success, err_msg, scan_item
132
88
 
133
- return success, msg, correct_list
89
+ return success, msg, scan_item
fosslight_util/help.py CHANGED
@@ -35,12 +35,11 @@ _HELP_MESSAGE_DOWNLOAD = """
35
35
 
36
36
 
37
37
  class PrintHelpMsg():
38
- message_suffix = ""
39
38
 
40
- def __init__(self, value):
39
+ def __init__(self, value: str = ""):
41
40
  self.message_suffix = value
42
41
 
43
- def print_help_msg(self, exitopt):
42
+ def print_help_msg(self, exitopt: bool) -> None:
44
43
  print(_HELP_MESSAGE_COMMON)
45
44
  print(self.message_suffix)
46
45
 
@@ -48,7 +47,7 @@ class PrintHelpMsg():
48
47
  sys.exit()
49
48
 
50
49
 
51
- def print_package_version(pkg_name, msg="", exitopt=True):
50
+ def print_package_version(pkg_name: str, msg: str = "", exitopt: bool = True) -> str:
52
51
  if msg == "":
53
52
  msg = f"{pkg_name} Version:"
54
53
  cur_version = pkg_resources.get_distribution(pkg_name).version
@@ -5,46 +5,41 @@
5
5
 
6
6
  import logging
7
7
  import os
8
- from fosslight_util.constant import LOGGER_NAME, FL_DEPENDENCY, FL_BINARY
8
+ from fosslight_util.constant import LOGGER_NAME, FOSSLIGHT_SCANNER
9
+ from fosslight_util.cover import CoverItem
10
+ from typing import List, Dict
9
11
 
10
12
  _logger = logging.getLogger(LOGGER_NAME)
11
13
 
12
14
 
13
15
  class OssItem:
14
- def __init__(self, value):
15
- self._name = ""
16
- self._version = ""
16
+
17
+ def __init__(self, name="", version="", license="", dl_url=""):
18
+ self.name = name
19
+ self.version = version
17
20
  self._license = []
18
- self._copyright = ""
21
+ self.license = license
22
+ self.download_location = dl_url
23
+ self.exclude = False
19
24
  self.comment = ""
20
- self._exclude = False
21
25
  self.homepage = ""
22
- self.relative_path = value
23
- self._source_name_or_path = []
24
- self.download_location = ""
25
- self._yocto_recipe = []
26
- self._yocto_package = []
27
- self.is_binary = False
28
- self._depends_on = []
29
- self.purl = ""
30
- self.bin_vulnerability = ""
31
- self.bin_tlsh = ""
32
- self.bin_sha1 = ""
26
+ self._copyright = ""
33
27
 
34
28
  def __del__(self):
35
29
  pass
36
30
 
37
31
  @property
38
- def copyright(self):
39
- return self._copyright
32
+ def license(self):
33
+ return self._license
40
34
 
41
- @copyright.setter
42
- def copyright(self, value):
35
+ @license.setter
36
+ def license(self, value):
43
37
  if value != "":
44
- if isinstance(value, list):
45
- value = "\n".join(value)
46
- value = value.strip()
47
- self._copyright = value
38
+ if not isinstance(value, list):
39
+ value = value.split(",")
40
+ self._license.extend(value)
41
+ self._license = [item.strip() for item in self._license]
42
+ self._license = list(set(self._license))
48
43
 
49
44
  @property
50
45
  def exclude(self):
@@ -58,13 +53,16 @@ class OssItem:
58
53
  self._exclude = False
59
54
 
60
55
  @property
61
- def name(self):
62
- return self._name
56
+ def copyright(self):
57
+ return self._copyright
63
58
 
64
- @name.setter
65
- def name(self, value):
59
+ @copyright.setter
60
+ def copyright(self, value):
66
61
  if value != "":
67
- self._name = value
62
+ if isinstance(value, list):
63
+ value = "\n".join(value)
64
+ value = value.strip()
65
+ self._copyright = value
68
66
 
69
67
  @property
70
68
  def version(self):
@@ -78,149 +76,144 @@ class OssItem:
78
76
  self._version = ""
79
77
 
80
78
  @property
81
- def license(self):
82
- return self._license
83
-
84
- @license.setter
85
- def license(self, value):
86
- if not isinstance(value, list):
87
- value = value.split(",")
88
- self._license.extend(value)
89
- self._license = [item.strip() for item in self._license]
90
- self._license = list(set(self._license))
91
-
92
- @property
93
- def source_name_or_path(self):
94
- return self._source_name_or_path
79
+ def comment(self):
80
+ return self._comment
95
81
 
96
- @source_name_or_path.setter
97
- def source_name_or_path(self, value):
82
+ @comment.setter
83
+ def comment(self, value):
98
84
  if not value:
99
- self._source_name_or_path = []
85
+ self._comment = ""
100
86
  else:
101
- if not isinstance(value, list):
102
- value = value.split(",")
103
- self._source_name_or_path.extend(value)
104
- self._source_name_or_path = [item.strip() for item in self._source_name_or_path]
105
- self._source_name_or_path = list(set(self._source_name_or_path))
87
+ if self._comment:
88
+ self._comment = f"{self._comment} / {value}"
89
+ else:
90
+ self._comment = value
106
91
 
107
- @property
108
- def yocto_recipe(self):
109
- return self._yocto_recipe
110
92
 
111
- @yocto_recipe.setter
112
- def yocto_recipe(self, value):
113
- if not isinstance(value, list):
114
- value = value.split(",")
115
- self._yocto_recipe.extend(value)
116
- self._yocto_recipe = [item.strip() for item in self._yocto_recipe]
117
- self._yocto_recipe = list(set(self._yocto_recipe))
93
+ class FileItem:
94
+ def __init__(self, value):
95
+ self.relative_path = value
96
+ self.source_name_or_path = ""
97
+ self._exclude = False
98
+ self._comment = ""
99
+ self.is_binary = False
100
+ self.oss_items: List[OssItem] = []
101
+
102
+ def __del__(self):
103
+ pass
118
104
 
119
105
  @property
120
- def yocto_package(self):
121
- return self._yocto_package
106
+ def exclude(self):
107
+ return self._exclude
122
108
 
123
- @yocto_package.setter
124
- def yocto_package(self, value):
125
- if not isinstance(value, list):
126
- value = value.split(",")
127
- self._yocto_package.extend(value)
128
- self._yocto_package = [item.strip() for item in self._yocto_package]
129
- self._yocto_package = list(set(self._yocto_package))
109
+ @exclude.setter
110
+ def exclude(self, value):
111
+ if value:
112
+ self._exclude = True
113
+ else:
114
+ self._exclude = False
115
+ for oss in self.oss_items:
116
+ oss.exclude = value
130
117
 
131
118
  @property
132
- def depends_on(self):
133
- return self._depends_on
119
+ def comment(self):
120
+ return self._comment
134
121
 
135
- @depends_on.setter
136
- def depends_on(self, value):
122
+ @comment.setter
123
+ def comment(self, value):
137
124
  if not value:
138
- self._depends_on = []
139
- else:
140
- if not isinstance(value, list):
141
- value = value.split(",")
142
- self._depends_on.extend(value)
143
- self._depends_on = [item.strip() for item in self._depends_on]
144
- self._depends_on = list(set(self._depends_on))
145
-
146
- def set_sheet_item(self, item, scanner_name=''):
147
- if len(item) < 9:
148
- _logger.warning(f"sheet list is too short ({len(item)}): {item}")
149
- return
150
- if scanner_name == FL_DEPENDENCY:
151
- self.purl = item[0]
125
+ self._comment = ""
152
126
  else:
153
- self.source_name_or_path = item[0]
154
- self.name = item[1]
155
- self.version = item[2]
156
- self.license = item[3]
157
- self.download_location = item[4]
158
- self.homepage = item[5]
159
- self.copyright = item[6]
160
- self.exclude = item[7]
161
- self.comment = item[8]
162
-
163
- if len(item) >= 10 and scanner_name == FL_DEPENDENCY:
164
- self.depends_on = item[9]
165
- if len(item) >= 10 and scanner_name == FL_BINARY:
166
- self.bin_vulnerability = item[9]
167
- if len(item) >= 12:
168
- self.bin_tlsh = item[10]
169
- self.bin_sha1 = item[11]
170
-
171
- def get_print_array(self, scanner_name=''):
127
+ if self._comment:
128
+ self._comment = f"{self._comment} / {value}"
129
+ else:
130
+ self._comment = value
131
+ for oss in self.oss_items:
132
+ oss.comment = value
133
+
134
+ def get_print_array(self):
172
135
  items = []
173
- if scanner_name != FL_DEPENDENCY:
174
- if len(self.source_name_or_path) == 0:
175
- self.source_name_or_path.append("")
176
- if len(self.license) == 0:
177
- self.license.append("")
178
-
179
- exclude = "Exclude" if self.exclude else ""
180
- lic = ",".join(self.license)
181
- if scanner_name == FL_DEPENDENCY:
182
- items = [self.purl, self.name, self.version, lic,
183
- self.download_location, self.homepage, self.copyright, exclude, self.comment]
184
- if len(self.depends_on) > 0:
185
- items.append(",".join(self.depends_on))
186
- else:
187
- for source_name_or_path in self.source_name_or_path:
188
- if scanner_name == FL_BINARY:
189
- oss_item = [os.path.join(self.relative_path, source_name_or_path), self.name, self.version, lic,
190
- self.download_location, self.homepage, self.copyright, exclude, self.comment,
191
- self.bin_vulnerability, self.bin_tlsh, self.bin_sha1]
192
- else:
193
- oss_item = [os.path.join(self.relative_path, source_name_or_path), self.name, self.version, lic,
194
- self.download_location, self.homepage, self.copyright, exclude, self.comment]
195
- items.append(oss_item)
136
+
137
+ for oss in self.oss_items:
138
+ exclude = "Exclude" if self.exclude or oss.exclude else ""
139
+ lic = ",".join(oss.license)
140
+
141
+ oss_item = [os.path.join(self.relative_path, self.source_name_or_path), oss.name, oss.version, lic,
142
+ oss.download_location, oss.homepage, oss.copyright, exclude, oss.comment]
143
+ items.append(oss_item)
196
144
  return items
197
145
 
198
146
  def get_print_json(self):
199
- json_item = {}
200
- json_item["name"] = self.name
201
-
202
- json_item["version"] = self.version
203
- if len(self.source_name_or_path) > 0:
204
- json_item["source path"] = self.source_name_or_path
205
- if len(self.license) > 0:
206
- json_item["license"] = self.license
207
- if self.download_location != "":
208
- json_item["download location"] = self.download_location
209
- if self.homepage != "":
210
- json_item["homepage"] = self.homepage
211
- if self.copyright != "":
212
- json_item["copyright text"] = self.copyright
213
- if self.exclude:
214
- json_item["exclude"] = self.exclude
215
- if self.comment != "":
216
- json_item["comment"] = self.comment
217
- if len(self.depends_on) > 0:
218
- json_item["depends on"] = self.depends_on
219
- if self.purl != "":
220
- json_item["package url"] = self.purl
221
-
222
- return json_item
147
+ items = []
148
+
149
+ for oss in self.oss_items:
150
+ json_item = {}
151
+ json_item["name"] = oss.name
152
+ json_item["version"] = oss.version
153
+
154
+ if self.source_name_or_path != "":
155
+ json_item["source path"] = self.source_name_or_path
156
+ if len(oss.license) > 0:
157
+ json_item["license"] = oss.license
158
+ if oss.download_location != "":
159
+ json_item["download location"] = oss.download_location
160
+ if oss.homepage != "":
161
+ json_item["homepage"] = oss.homepage
162
+ if oss.copyright != "":
163
+ json_item["copyright text"] = oss.copyright
164
+ if self.exclude or oss.exclude:
165
+ json_item["exclude"] = True
166
+ if oss.comment != "":
167
+ json_item["comment"] = oss.comment
168
+ items.append(json_item)
169
+ return items
223
170
 
224
171
 
225
172
  def invalid(cmd):
226
173
  _logger.info('[{}] is invalid'.format(cmd))
174
+
175
+
176
+ class ScannerItem:
177
+ def __init__(self, pkg_name, start_time=""):
178
+ self.cover = CoverItem(tool_name=pkg_name, start_time=start_time)
179
+ self.file_items: Dict[str, List[FileItem]] = {pkg_name: []} if pkg_name != FOSSLIGHT_SCANNER else {}
180
+ self.external_sheets: Dict[str, List[List[str]]] = {}
181
+
182
+ def set_cover_pathinfo(self, input_dir, path_to_exclude):
183
+ self.cover.input_path = input_dir
184
+ self.cover.exclude_path = ", ".join(path_to_exclude)
185
+
186
+ def set_cover_comment(self, value):
187
+ if value:
188
+ if self.cover.comment:
189
+ self.cover.comment = f"{self.cover.comment} / {value}"
190
+ else:
191
+ self.cover.comment = value
192
+
193
+ def get_cover_comment(self):
194
+ return [item.strip() for item in self.cover.comment.split(" / ")]
195
+
196
+ def append_file_items(self, file_item: List[FileItem], pkg_name=""):
197
+ if pkg_name == "":
198
+ if len(self.file_items.keys()) != 1:
199
+ _logger.error("Package name is not set. Cannot append file_item into ScannerItem.")
200
+ else:
201
+ pkg_name = list(self.file_items.keys())[0]
202
+ if pkg_name not in self.file_items:
203
+ self.file_items[pkg_name] = []
204
+ self.file_items[pkg_name].extend(file_item)
205
+
206
+ def get_print_array(self, scanner_name):
207
+ items = []
208
+ for file_item in self.file_items[scanner_name]:
209
+ items.extend(file_item.get_print_array())
210
+ return items
211
+
212
+ def get_print_json(self, scanner_name):
213
+ items = []
214
+ for file_item in self.file_items[scanner_name]:
215
+ items.extend(file_item.get_print_json())
216
+ return items
217
+
218
+ def __del__(self):
219
+ pass