Skip to content

Commit 8af30de

Browse files
authored
Add Scanner info cover sheet into xlsx (#156)
Signed-off-by: jiyeong.seok <[email protected]>
1 parent 73d6add commit 8af30de

File tree

5 files changed

+129
-38
lines changed

5 files changed

+129
-38
lines changed

src/fosslight_util/cover.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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 os
7+
import sys
8+
from fosslight_util.help import print_package_version
9+
10+
11+
class CoverItem:
12+
tool_name_key = "Tool name"
13+
tool_version_key = "Tool version"
14+
start_time_key = "Start time"
15+
python_ver_key = "Python version"
16+
analyzed_path_key = "Analyzed path"
17+
comment_key = "Comment"
18+
19+
def __init__(self, tool_name="", start_time="", input_path="", comment=""):
20+
self.tool_name = tool_name
21+
if start_time:
22+
date, time = start_time.split('_')
23+
self.start_time = f'{date}, {time[0:2]}:{time[2:4]}'
24+
else:
25+
self.start_time = ""
26+
self.input_path = os.path.abspath(input_path)
27+
self.comment = comment
28+
29+
self.tool_version = print_package_version(self.tool_name, "", False)
30+
self.python_version = f'{sys.version_info.major}.{sys.version_info.minor}'
31+
32+
def __del__(self):
33+
pass
34+
35+
def get_print_json(self):
36+
json_item = {}
37+
json_item[self.tool_name_key] = self.tool_name
38+
json_item[self.tool_version_key] = self.tool_version
39+
json_item[self.start_time_key] = self.start_time
40+
json_item[self.python_ver_key] = self.python_version
41+
json_item[self.analyzed_path_key] = self.input_path
42+
json_item[self.comment_key] = self.comment
43+
44+
return json_item

src/fosslight_util/help.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,12 @@ def print_package_version(pkg_name, msg="", exitopt=True):
5252
if msg == "":
5353
msg = f"{pkg_name} Version:"
5454
cur_version = pkg_resources.get_distribution(pkg_name).version
55-
print(f'{msg} {cur_version}')
5655

5756
if exitopt:
57+
print(f'{msg} {cur_version}')
5858
sys.exit(0)
59+
else:
60+
return cur_version
5961

6062

6163
def print_help_msg_download(exitOpt=True):

src/fosslight_util/output_format.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Copyright (c) 2021 LG Electronics Inc.
44
# SPDX-License-Identifier: Apache-2.0
55
import os
6-
from fosslight_util.write_excel import write_result_to_excel, write_result_to_csv, remove_empty_sheet
6+
from fosslight_util.write_excel import write_result_to_excel, write_result_to_csv
77
from fosslight_util.write_opossum import write_opossum
88
from fosslight_util.write_yaml import write_yaml
99

@@ -56,29 +56,24 @@ def check_output_format(output='', format='', customized_format={}):
5656
return success, msg, output_path, output_file, output_extension
5757

5858

59-
def write_output_file(output_file_without_ext, file_extension, sheet_list, extended_header={}, hide_header={}):
59+
def write_output_file(output_file_without_ext, file_extension, sheet_list, extended_header={}, hide_header={}, cover=""):
6060
success = True
6161
msg = ''
6262

63-
is_not_null, sheet_list = remove_empty_sheet(sheet_list)
64-
if is_not_null:
65-
if file_extension == '':
66-
file_extension = '.xlsx'
67-
result_file = output_file_without_ext + file_extension
63+
if file_extension == '':
64+
file_extension = '.xlsx'
65+
result_file = output_file_without_ext + file_extension
6866

69-
if file_extension == '.xlsx':
70-
success, msg = write_result_to_excel(result_file, sheet_list, extended_header, hide_header)
71-
elif file_extension == '.csv':
72-
success, msg, result_file = write_result_to_csv(result_file, sheet_list)
73-
elif file_extension == '.json':
74-
success, msg = write_opossum(result_file, sheet_list)
75-
elif file_extension == '.yaml':
76-
success, msg, result_file = write_yaml(result_file, sheet_list, False)
77-
else:
78-
success = False
79-
msg = f'Not supported file extension({file_extension})'
67+
if file_extension == '.xlsx':
68+
success, msg = write_result_to_excel(result_file, sheet_list, extended_header, hide_header, cover)
69+
elif file_extension == '.csv':
70+
success, msg, result_file = write_result_to_csv(result_file, sheet_list)
71+
elif file_extension == '.json':
72+
success, msg = write_opossum(result_file, sheet_list)
73+
elif file_extension == '.yaml':
74+
success, msg, result_file = write_yaml(result_file, sheet_list, False)
8075
else:
81-
result_file = ""
82-
msg = "Nothing is detected from the scanner so output file is not generated."
76+
success = False
77+
msg = f'Not supported file extension({file_extension})'
8378

8479
return success, msg, result_file

src/fosslight_util/write_excel.py

Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from pathlib import Path
1414
import fosslight_util.constant as constant
1515
from jsonmerge import merge
16+
from fosslight_util.cover import CoverItem
1617

1718
_HEADER = {'BIN (': ['ID', 'Binary Name', 'Source Code Path',
1819
'NOTICE.html', 'OSS Name', 'OSS Version',
@@ -31,6 +32,7 @@
3132
IDX_FILE = 0
3233
IDX_EXCLUDE = 7
3334
logger = logging.getLogger(constant.LOGGER_NAME)
35+
COVER_SHEET_NAME = 'Scanner Info'
3436

3537

3638
def write_excel_and_csv(filename_without_extension, sheet_list, ignore_os=False, extended_header={}, hide_header={}):
@@ -105,9 +107,9 @@ def get_header_row(sheet_name, sheet_content, extended_header={}):
105107
if sheet_name.startswith(header_key):
106108
selected_header = merged_headers[header_key]
107109
break
108-
109-
if not selected_header:
110-
selected_header = sheet_content.pop(0)
110+
if len(sheet_content) > 0:
111+
if not selected_header:
112+
selected_header = sheet_content.pop(0)
111113
return selected_header, sheet_content
112114

113115

@@ -166,16 +168,18 @@ def write_result_to_csv(output_file, sheet_list_origin, separate_sheet=False, ex
166168
return success, error_msg, output
167169

168170

169-
def write_result_to_excel(out_file_name, sheet_list, extended_header={}, hide_header={}):
171+
def write_result_to_excel(out_file_name, sheet_list, extended_header={}, hide_header={}, cover=""):
170172
success = True
171173
error_msg = ""
172174

173175
try:
174-
if sheet_list:
175-
output_dir = os.path.dirname(out_file_name)
176-
Path(output_dir).mkdir(parents=True, exist_ok=True)
176+
output_dir = os.path.dirname(out_file_name)
177+
Path(output_dir).mkdir(parents=True, exist_ok=True)
177178

178-
workbook = xlsxwriter.Workbook(out_file_name)
179+
workbook = xlsxwriter.Workbook(out_file_name)
180+
if cover:
181+
write_cover_sheet(workbook, cover)
182+
if sheet_list:
179183
for sheet_name, sheet_contents in sheet_list.items():
180184
selected_header, sheet_content_without_header = get_header_row(sheet_name, sheet_contents[:], extended_header)
181185
try:
@@ -188,13 +192,33 @@ def write_result_to_excel(out_file_name, sheet_list, extended_header={}, hide_he
188192

189193
if hide_header:
190194
hide_column(worksheet, selected_header, hide_header)
191-
workbook.close()
195+
workbook.close()
192196
except Exception as ex:
193197
error_msg = str(ex)
194198
success = False
195199
return success, error_msg
196200

197201

202+
def write_cover_sheet(workbook, cover):
203+
worksheet = workbook.add_worksheet(COVER_SHEET_NAME)
204+
205+
format_bold = workbook.add_format({'bold': True})
206+
worksheet.merge_range('A1:B1', 'About the scanner', format_bold)
207+
208+
key_format = workbook.add_format({'bold': True, 'font_color': 'white', 'bg_color': 'navy'})
209+
item_format = workbook.add_format()
210+
item_format.set_text_wrap()
211+
212+
cover_json = cover.get_print_json()
213+
row = 1
214+
for item in cover_json:
215+
worksheet.write(row, 0, item, key_format)
216+
worksheet.write(row, 1, cover_json[item], item_format)
217+
row += 1
218+
worksheet.set_column(0, 0, 30)
219+
worksheet.set_column(1, 1, 100)
220+
221+
198222
def write_result_to_sheet(worksheet, sheet_contents):
199223
row = 1
200224
for row_item in sheet_contents:
@@ -221,7 +245,33 @@ def create_worksheet(workbook, sheet_name, header_row):
221245
return worksheet
222246

223247

224-
def merge_excels(find_excel_dir, final_out, merge_files=''):
248+
def merge_cover_comment(find_excel_dir, merge_files=''):
249+
FIND_EXTENSION = '.xlsx'
250+
merge_comment = []
251+
cover_comment = ''
252+
try:
253+
files = os.listdir(find_excel_dir)
254+
255+
if len([name for name in files if name.endswith(FIND_EXTENSION)]) > 0:
256+
for file in files:
257+
if merge_files:
258+
if file not in merge_files:
259+
continue
260+
if file.endswith(FIND_EXTENSION):
261+
file = os.path.join(find_excel_dir, file)
262+
df_excel = pd.read_excel(file, sheet_name=COVER_SHEET_NAME, index_col=0, engine='openpyxl')
263+
if not df_excel.empty:
264+
tool_name = df_excel.loc[CoverItem.tool_name_key].values[0]
265+
comment = df_excel.loc[CoverItem.comment_key].values[0]
266+
merge_comment.append(str(f"[{tool_name}] {comment}"))
267+
cover_comment = '\n'.join(merge_comment)
268+
except Exception as ex:
269+
logger.warning(f'Fail to merge comment of Scanner info: {str(ex)}')
270+
271+
return cover_comment
272+
273+
274+
def merge_excels(find_excel_dir, final_out, merge_files='', cover=''):
225275
success = True
226276
msg = ""
227277
FIND_EXTENSION = '.xlsx'
@@ -231,7 +281,7 @@ def merge_excels(find_excel_dir, final_out, merge_files=''):
231281

232282
if len([name for name in files if name.endswith(FIND_EXTENSION)]) > 0:
233283
writer = pd.ExcelWriter(final_out)
234-
284+
write_cover_sheet(writer.book, cover)
235285
for file in files:
236286
if merge_files:
237287
if file not in merge_files:
@@ -243,13 +293,14 @@ def merge_excels(find_excel_dir, final_out, merge_files=''):
243293
excel_file = pd.ExcelFile(file, engine='openpyxl')
244294

245295
for sheet_name in excel_file.sheet_names:
246-
sheet_name_to_copy = f"{f_short_name}_{sheet_name}"
296+
if sheet_name == COVER_SHEET_NAME:
297+
continue
247298
df_excel = pd.read_excel(
248299
file, sheet_name=sheet_name, engine='openpyxl')
249-
if sheet_name not in added_sheet_names:
250-
sheet_name_to_copy = sheet_name
251-
df_excel.to_excel(writer, sheet_name_to_copy,
252-
index=False)
300+
if sheet_name in added_sheet_names:
301+
sheet_name = f"{f_short_name}_{sheet_name}"
302+
df_excel.to_excel(writer, sheet_name, index=False)
303+
added_sheet_names.append(sheet_name)
253304
writer.close()
254305
except Exception as ex:
255306
msg = str(ex)

tests/test_excel_and_csv.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ def main():
5050
sheet_contents['SRC'] = src_sheet_items
5151
sheet_contents['BIN_TEST'] = bin_sheet_items
5252
sheet_contents['SRC_NULL'] = []
53-
sheet_contents['NULL_SHEET'] = []
5453
sheet_contents['CUSTOM_HEADER_SHEET'] = sheet_items
5554

5655
logger.warning("TESTING - Writing an excel and csv")

0 commit comments

Comments
 (0)