fosslight-scanner 2.0.1__py3-none-any.whl → 2.1.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.
@@ -25,8 +25,9 @@ _HELP_MESSAGE_SCANNER = """
25
25
  * Compare mode input file: Two FOSSLight reports (supports excel, yaml)
26
26
  (ex, -p {before_name}.xlsx {after_name}.xlsx)
27
27
  -w <link>\t\t Link to be analyzed can be downloaded by wget or git clone
28
- -f <format>\t\t FOSSLight Report file format (excel, yaml)
28
+ -f <formats> [<format> ...]\t FOSSLight Report file format (excel, csv, opossum, yaml, spdx-tag, spdx-yaml, spdx-json, spdx-xml)
29
29
  * Compare mode result file: supports excel, json, yaml, html
30
+ * Multiple formats can be specified separated by space.
30
31
  -e <path>\t\t Path to exclude from analysis (ex, -e {dir} {file})
31
32
  -o <output>\t\t Output directory or file
32
33
  -c <number>\t\t Number of processes to analyze source
@@ -203,7 +203,7 @@ def write_compared_result(output_file, compared_result, file_ext, before_f='', a
203
203
  def get_comparison_result_filename(output_path, output_file, output_extension, _start_time):
204
204
  result_file = ""
205
205
  compare_prefix = f"fosslight_compare_{_start_time}"
206
- if output_file != "":
206
+ if output_file != '':
207
207
  result_file = f"{output_file}{output_extension}"
208
208
  else:
209
209
  if output_extension == XLSX_EXT or output_extension == "":
@@ -232,7 +232,7 @@ def count_compared_result(compared_result):
232
232
  logger.info(f"Comparison result: {count_str}")
233
233
 
234
234
 
235
- def run_compare(before_f, after_f, output_path, output_file, file_ext, _start_time, _output_dir):
235
+ def run_compare(before_f, after_f, output_path, output_files, file_ext, _start_time, _output_dir):
236
236
  ret = False
237
237
  before_yaml = ''
238
238
  after_yaml = ''
@@ -254,8 +254,6 @@ def run_compare(before_f, after_f, output_path, output_file, file_ext, _start_ti
254
254
  tmp_a_yaml = f'{os.path.basename(after_f).rstrip(XLSX_EXT)}{YAML_EXT}'
255
255
  after_yaml = after_f if after_ext == YAML_EXT else os.path.join(_output_dir, tmp_a_yaml)
256
256
 
257
- result_file = get_comparison_result_filename(output_path, output_file, file_ext, _start_time)
258
-
259
257
  before_basepath = os.path.dirname(before_f)
260
258
  after_basepath = os.path.dirname(after_f)
261
259
  if XLSX_EXT == before_ext:
@@ -267,13 +265,17 @@ def run_compare(before_f, after_f, output_path, output_file, file_ext, _start_ti
267
265
  elif YAML_EXT == after_ext:
268
266
  after_fileitems, _, _ = parsing_yml(after_yaml, after_basepath)
269
267
 
268
+ if output_files:
269
+ output_file = output_files[0]
270
270
  compared_result = compare_yaml(before_fileitems, after_fileitems)
271
271
  if compared_result != '':
272
272
  count_compared_result(compared_result)
273
- ret, result_file = write_compared_result(result_file, compared_result, file_ext, before_yaml, after_yaml)
274
- if ret:
275
- logger.info(f"Success to write compared result: {result_file}")
276
- else:
277
- logger.error("Fail to write compared result file.")
273
+ for f_ext in file_ext:
274
+ result_file = get_comparison_result_filename(output_path, output_file, f_ext, _start_time)
275
+ ret, result_file = write_compared_result(result_file, compared_result, f_ext, before_yaml, after_yaml)
276
+ if ret:
277
+ logger.info(f"Output file: {result_file}")
278
+ else:
279
+ logger.error("Fail to write compared result file.")
278
280
 
279
281
  return ret
fosslight_scanner/cli.py CHANGED
@@ -74,9 +74,9 @@ def main():
74
74
  dest='path', nargs='+', default="")
75
75
  parser.add_argument('--wget', '-w', help='Link to be analyzed',
76
76
  type=str, dest='link', default="")
77
- parser.add_argument('--format', '-f',
77
+ parser.add_argument('--formats', '-f',
78
78
  help='Scanner output file format (excel,yaml), Compare mode (excel,html,yaml,json)',
79
- type=str, dest='format', default="")
79
+ type=str, dest='format',nargs='*', default=[])
80
80
  parser.add_argument('--output', '-o', help='Output directory or file',
81
81
  type=str, dest='output', default="")
82
82
  parser.add_argument('--dependency', '-d', help='Dependency arguments',
@@ -12,6 +12,7 @@ import yaml
12
12
  import shutil
13
13
  import shlex
14
14
  import subprocess
15
+ import platform
15
16
  from pathlib import Path
16
17
  from datetime import datetime
17
18
 
@@ -23,7 +24,7 @@ from ._get_input import get_input_mode
23
24
  from fosslight_util.set_log import init_log
24
25
  from fosslight_util.timer_thread import TimerThread
25
26
  import fosslight_util.constant as constant
26
- from fosslight_util.output_format import check_output_format
27
+ from fosslight_util.output_format import check_output_formats_v2
27
28
  from fosslight_prechecker._precheck import run_lint as prechecker_lint
28
29
  from fosslight_util.cover import CoverItem
29
30
  from fosslight_util.oss_item import ScannerItem
@@ -56,7 +57,7 @@ SCANNER_MODE = [
56
57
  ]
57
58
 
58
59
 
59
- def run_dependency(path_to_analyze, output_file_with_path, params="", path_to_exclude=[]):
60
+ def run_dependency(path_to_analyze, output_file_with_path, params="", path_to_exclude=[], formats=[]):
60
61
  result = []
61
62
 
62
63
  package_manager = ""
@@ -99,7 +100,7 @@ def run_dependency(path_to_analyze, output_file_with_path, params="", path_to_ex
99
100
  output_file_with_path,
100
101
  pip_activate_cmd, pip_deactivate_cmd,
101
102
  output_custom_dir, app_name,
102
- github_token, path_to_exclude=path_to_exclude
103
+ github_token, formats, True, path_to_exclude=path_to_exclude
103
104
  )
104
105
  if success:
105
106
  result = scan_item
@@ -114,33 +115,62 @@ def source_analysis_wrapper(*args, **kwargs):
114
115
  source_write_json_file = kwargs.pop('source_write_json_file', False)
115
116
  source_print_matched_text = kwargs.pop('source_print_matched_text', False)
116
117
  source_time_out = kwargs.pop('source_time_out', 120)
118
+ formats = kwargs.pop('formats', [])
117
119
  args = list(args)
118
120
  args.insert(2, source_write_json_file)
119
121
  args.insert(5, source_print_matched_text)
122
+ args.insert(6, formats)
120
123
 
121
124
  return source_analysis(*args, selected_scanner=selected_scanner, time_out=source_time_out, **kwargs)
122
125
 
123
126
 
124
127
  def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
125
128
  run_src=True, run_bin=True, run_dep=True, run_prechecker=False,
126
- remove_src_data=True, result_log={}, output_file="",
127
- output_extension="", num_cores=-1, db_url="",
129
+ remove_src_data=True, result_log={}, output_files=[],
130
+ output_extensions=[], num_cores=-1, db_url="",
128
131
  default_oss_name="", default_oss_version="", url="",
129
132
  correct_mode=True, correct_fpath="", ui_mode=False, path_to_exclude=[],
130
133
  selected_source_scanner="all", source_write_json_file=False, source_print_matched_text=False,
131
- source_time_out=120, binary_simple=False):
134
+ source_time_out=120, binary_simple=False, formats=[]):
132
135
  final_excel_dir = output_path
133
136
  success = True
134
137
  all_cover_items = []
135
138
  all_scan_item = ScannerItem(PKG_NAME, _start_time)
139
+ _json_ext = '.json'
136
140
  if not remove_src_data:
137
141
  success, final_excel_dir, result_log = init(output_path)
138
142
 
139
- if output_file == "":
140
- output_file = OUTPUT_REPORT_PREFIX + _start_time
141
-
142
- if output_extension == "":
143
- output_extension = ".xlsx"
143
+ if not output_files:
144
+ # If -o does not contains file name, set default name
145
+ while len(output_files) < len(output_extensions):
146
+ output_files.append(None)
147
+ to_remove = [] # elements of spdx format on windows that should be removed
148
+ for i, output_extension in enumerate(output_extensions):
149
+ if output_files[i] is None or output_files[i] == "":
150
+ if formats:
151
+ if formats[i].startswith('spdx'):
152
+ if platform.system() != 'Windows':
153
+ output_files[i] = f"fosslight_spdx_all_{_start_time}"
154
+ else:
155
+ logger.warning('spdx format is not supported on Windows. Please remove spdx from format.')
156
+ to_remove.append(i)
157
+ else:
158
+ if output_extension == _json_ext:
159
+ output_files[i] = f"fosslight_opossum_all_{_start_time}"
160
+ else:
161
+ output_files[i] = f"fosslight_report_all_{_start_time}"
162
+ else:
163
+ if output_extension == _json_ext:
164
+ output_files[i] = f"fosslight_opossum_all_{_start_time}"
165
+ else:
166
+ output_files[i] = f"fosslight_report_all_{_start_time}"
167
+ for index in sorted(to_remove, reverse=True):
168
+ # remove elements of spdx format on windows
169
+ del output_files[index]
170
+ del output_extensions[index]
171
+ del formats[index]
172
+ if len(output_extensions) < 1:
173
+ sys.exit(0)
144
174
 
145
175
  if not correct_fpath:
146
176
  correct_fpath = src_path
@@ -150,21 +180,16 @@ def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
150
180
  abs_path = os.path.abspath(src_path)
151
181
 
152
182
  if success:
153
- output_files = {"SRC": f"fosslight_src_{_start_time}{output_extension}",
154
- "BIN": f"fosslight_bin_{_start_time}{output_extension}",
155
- "DEP": f"fosslight_dep_{_start_time}{output_extension}",
156
- "PRECHECKER": f"fosslight_lint_{_start_time}.yaml"}
157
183
  if run_prechecker:
158
- output_prechecker = os.path.join(_output_dir, output_files["PRECHECKER"])
159
184
  success, result = call_analysis_api(src_path, "Prechecker Lint",
160
185
  -1, prechecker_lint,
161
- abs_path, False, output_prechecker,
186
+ abs_path, False, _output_dir,
162
187
  exclude_path=path_to_exclude)
163
188
 
164
189
  if run_src:
165
190
  try:
166
191
  if fosslight_source_installed:
167
- src_output = os.path.join(_output_dir, output_files["SRC"])
192
+ src_output = _output_dir
168
193
  success, result = call_analysis_api(
169
194
  src_path,
170
195
  "Source Analysis",
@@ -177,17 +202,17 @@ def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
177
202
  selected_scanner=selected_source_scanner,
178
203
  source_write_json_file=source_write_json_file,
179
204
  source_print_matched_text=source_print_matched_text,
180
- source_time_out=source_time_out
205
+ source_time_out=source_time_out,
206
+ formats=formats
181
207
  )
182
208
  if success:
183
209
  all_scan_item.file_items.update(result[2].file_items)
184
210
  all_cover_items.append(result[2].cover)
185
211
 
186
212
  else: # Run fosslight_source by using docker image
187
- src_output = os.path.join("output", output_files["SRC"])
188
213
  output_rel_path = os.path.relpath(abs_path, os.getcwd())
189
214
  command = shlex.quote(f"docker run -it -v {_output_dir}:/app/output "
190
- f"fosslight -p {output_rel_path} -o {src_output}")
215
+ f"fosslight -p {output_rel_path} -o output")
191
216
  if path_to_exclude:
192
217
  command += f" -e {' '.join(path_to_exclude)}"
193
218
  command_result = subprocess.run(command, stdout=subprocess.PIPE, text=True)
@@ -200,8 +225,8 @@ def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
200
225
  success, result = call_analysis_api(src_path, "Binary Analysis",
201
226
  1, binary_analysis.find_binaries,
202
227
  abs_path,
203
- os.path.join(_output_dir, output_files["BIN"]),
204
- "", db_url, binary_simple,
228
+ _output_dir,
229
+ formats, db_url, binary_simple,
205
230
  correct_mode, correct_fpath,
206
231
  path_to_exclude=path_to_exclude)
207
232
  if success:
@@ -209,11 +234,10 @@ def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
209
234
  all_cover_items.append(result.cover)
210
235
 
211
236
  if run_dep:
212
- dep_scanitem = run_dependency(src_path, os.path.join(_output_dir, output_files["DEP"]),
213
- dep_arguments, path_to_exclude)
237
+ dep_scanitem = run_dependency(src_path, _output_dir,
238
+ dep_arguments, path_to_exclude, formats)
214
239
  all_scan_item.file_items.update(dep_scanitem.file_items)
215
240
  all_cover_items.append(dep_scanitem.cover)
216
-
217
241
  else:
218
242
  return
219
243
 
@@ -221,8 +245,6 @@ def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
221
245
  logger.error(f"Scanning: {ex}")
222
246
 
223
247
  try:
224
- output_file_without_ext = os.path.join(final_excel_dir, output_file)
225
- final_report = f"{output_file_without_ext}{output_extension}"
226
248
  cover = CoverItem(tool_name=PKG_NAME,
227
249
  start_time=_start_time,
228
250
  input_path=abs_path,
@@ -239,17 +261,32 @@ def run_scanner(src_path, dep_arguments, output_path, keep_raw_data=False,
239
261
 
240
262
  if remove_src_data:
241
263
  all_scan_item = update_oss_item(all_scan_item, default_oss_name, default_oss_version, url)
242
- success, err_msg, final_report = write_output_file(output_file_without_ext, output_extension, all_scan_item)
264
+
265
+ combined_paths_and_files = [os.path.join(final_excel_dir, file) for file in output_files]
266
+ results = []
267
+ final_reports = []
268
+ for combined_path_and_file, output_extension, output_format in zip(combined_paths_and_files, output_extensions, formats):
269
+ results.append(write_output_file(combined_path_and_file, output_extension, all_scan_item, {}, {}, output_format))
270
+ for success, msg, result_file in results:
271
+ if success:
272
+ final_reports.append(result_file)
273
+ logger.info(f"Output file: {result_file}")
274
+ else:
275
+ logger.error(f"Fail to generate result file {result_file}. msg:({msg})")
276
+
243
277
  if success:
244
- if os.path.isfile(final_report):
245
- logger.info(f'Generated the result file: {final_report}')
246
- result_log["Output File"] = final_report
278
+ if final_reports:
279
+ logger.info(f'Generated the result file: {", ".join(final_reports)}')
280
+ result_log["Output File"] = ', '.join(final_reports)
247
281
  else:
248
282
  result_log["Output File"] = 'Nothing is detected from the scanner so output file is not generated.'
249
- else:
250
- logger.error(f"Fail to generate a result file({final_report}): {err_msg}")
251
283
 
252
284
  if ui_mode:
285
+ if output_files:
286
+ output_file = output_files[0]
287
+ else:
288
+ output_file = OUTPUT_REPORT_PREFIX + _start_time
289
+ output_file_without_ext = os.path.join(final_excel_dir, output_file)
253
290
  ui_mode_report = f"{output_file_without_ext}.json"
254
291
  success, err_msg = create_scancodejson(all_scan_item, ui_mode_report, src_path)
255
292
  if success and os.path.isfile(ui_mode_report):
@@ -328,7 +365,7 @@ def run_main(mode_list, path_arg, dep_arguments, output_file_or_dir, file_format
328
365
  source_time_out=120, binary_simple=False):
329
366
  global _executed_path, _start_time
330
367
 
331
- output_file = ""
368
+ output_files = []
332
369
  default_oss_name = ""
333
370
  default_oss_version = ""
334
371
  src_path = ""
@@ -352,7 +389,7 @@ def run_main(mode_list, path_arg, dep_arguments, output_file_or_dir, file_format
352
389
  logger.error("Enter two FOSSLight report file with 'p' option.")
353
390
  return False
354
391
  else:
355
- CUSTOMIZED_FORMAT = {'excel': '.xlsx', 'yaml': '.yaml'}
392
+ CUSTOMIZED_FORMAT = {}
356
393
  if isinstance(path_arg, list):
357
394
  if len(path_arg) == 1:
358
395
  src_path = path_arg[0]
@@ -370,10 +407,12 @@ def run_main(mode_list, path_arg, dep_arguments, output_file_or_dir, file_format
370
407
  else:
371
408
  logger.warning(f"Cannot analyze with multiple path: {path_arg}")
372
409
 
373
- success, msg, output_path, output_file, output_extension = check_output_format(output_file_or_dir, file_format,
374
- CUSTOMIZED_FORMAT)
410
+ success, msg, output_path, output_files, output_extensions, formats = check_output_formats_v2(output_file_or_dir, file_format,
411
+ CUSTOMIZED_FORMAT)
375
412
  if output_path == "":
376
413
  output_path = _executed_path
414
+ else:
415
+ output_path = os.path.abspath(output_path)
377
416
 
378
417
  if not success:
379
418
  logger.error(msg)
@@ -392,7 +431,7 @@ def run_main(mode_list, path_arg, dep_arguments, output_file_or_dir, file_format
392
431
  ret, final_excel_dir, result_log = init(output_path)
393
432
 
394
433
  run_compare(os.path.join(_executed_path, before_comp_f), os.path.join(_executed_path, after_comp_f),
395
- final_excel_dir, output_file, output_extension, _start_time, _output_dir)
434
+ final_excel_dir, output_files, output_extensions, _start_time, _output_dir)
396
435
  else:
397
436
  run_src = False
398
437
  run_bin = False
@@ -430,22 +469,15 @@ def run_main(mode_list, path_arg, dep_arguments, output_file_or_dir, file_format
430
469
  remove_downloaded_source = True
431
470
  success, src_path, default_oss_name, default_oss_version = download_source(url_to_analyze, output_path)
432
471
 
433
- if output_extension == ".yaml":
434
- correct_mode = False
435
- correct_fpath = ""
436
- else:
437
- if not correct_fpath:
438
- correct_fpath = src_path
439
-
440
472
  if src_path != "":
441
473
  run_scanner(src_path, dep_arguments, output_path, keep_raw_data,
442
474
  run_src, run_bin, run_dep, run_prechecker,
443
- remove_downloaded_source, {}, output_file,
444
- output_extension, num_cores, db_url,
475
+ remove_downloaded_source, {}, output_files,
476
+ output_extensions, num_cores, db_url,
445
477
  default_oss_name, default_oss_version, url_to_analyze,
446
478
  correct_mode, correct_fpath, ui_mode, path_to_exclude,
447
479
  selected_source_scanner, source_write_json_file, source_print_matched_text, source_time_out,
448
- binary_simple)
480
+ binary_simple, formats)
449
481
 
450
482
  if extract_folder:
451
483
  shutil.rmtree(extract_folder)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fosslight-scanner
3
- Version: 2.0.1
3
+ Version: 2.1.0
4
4
  Summary: FOSSLight Scanner
5
5
  Home-page: https://github.com/fosslight/fosslight_scanner
6
6
  Author: LG Electronics
@@ -21,11 +21,11 @@ Requires-Dist: openpyxl
21
21
  Requires-Dist: progress
22
22
  Requires-Dist: pyyaml
23
23
  Requires-Dist: beautifulsoup4
24
- Requires-Dist: fosslight-util>=2.0.0
25
- Requires-Dist: fosslight-source>=2.0.0
26
- Requires-Dist: fosslight-dependency>=4.0.0
27
- Requires-Dist: fosslight-binary>=5.0.0
28
- Requires-Dist: fosslight-prechecker>=4.0.0
24
+ Requires-Dist: fosslight-util<3.0.0,>=2.1.0
25
+ Requires-Dist: fosslight-source<3.0.0,>=2.1.0
26
+ Requires-Dist: fosslight-dependency<5.0.0,>=4.1.0
27
+ Requires-Dist: fosslight-binary<6.0.0,>=5.1.0
28
+ Requires-Dist: fosslight-prechecker<5.0.0,>=4.0.0
29
29
 
30
30
  <!--
31
31
  Copyright (c) 2021 LG Electronics
@@ -0,0 +1,15 @@
1
+ fosslight_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ fosslight_scanner/_get_input.py,sha256=f78M57QU7Lhw1VfZJKvYXbGsUiYMViPz1---UDIbV9I,1396
3
+ fosslight_scanner/_help.py,sha256=-Dqgn1inH26614GjrIe8I5cdEziuAxTtwrUdtTkrpjQ,3084
4
+ fosslight_scanner/_parse_setting.py,sha256=SoIEoPGlFXAp6__eEFEMIPYPoKLvmqxXF5X_C_uFiVI,2468
5
+ fosslight_scanner/_run_compare.py,sha256=zmzX-FIvWCSkwPvEA3iHfVpyg6QDGUCpw3tJuGLdPWM,10657
6
+ fosslight_scanner/cli.py,sha256=C4YNPVJJ-Ezj_6xe8k9QbIrf5V44GXbHWCGzR2FMcV8,6547
7
+ fosslight_scanner/common.py,sha256=NOfIxdKrH7MS_ptOIwY56OZJHVR9S_hfs-L2a1H9N0g,8179
8
+ fosslight_scanner/fosslight_scanner.py,sha256=raa6IKCWrTSO1kbPazHrZmY5CXjDzI_2jEstG6g-OhQ,21142
9
+ fosslight_scanner/resources/bom_compare.html,sha256=VocJ9bDmQQOwfGyvXatPZ4W-QddO-IlsAvKdO0nZ7pA,2240
10
+ fosslight_scanner-2.1.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
11
+ fosslight_scanner-2.1.0.dist-info/METADATA,sha256=F4YFBxqXCaKE9lZKVdkBTfGnyP2rxvNwOjjRdUMF3j0,7872
12
+ fosslight_scanner-2.1.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
13
+ fosslight_scanner-2.1.0.dist-info/entry_points.txt,sha256=0tBUtN9pKtAkuohQuhbzuohdHbeoI0-w95aWAR7J_RU,105
14
+ fosslight_scanner-2.1.0.dist-info/top_level.txt,sha256=43_xLb5KYpy8wOU1H2Wd2fEsWBY7Dg6ZEJJXkfT64Ak,18
15
+ fosslight_scanner-2.1.0.dist-info/RECORD,,
@@ -1,15 +0,0 @@
1
- fosslight_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- fosslight_scanner/_get_input.py,sha256=f78M57QU7Lhw1VfZJKvYXbGsUiYMViPz1---UDIbV9I,1396
3
- fosslight_scanner/_help.py,sha256=-77CZm1es2Ib-HuISCSd4mTPxYzuLJ9NjryDI0g4otM,2921
4
- fosslight_scanner/_parse_setting.py,sha256=SoIEoPGlFXAp6__eEFEMIPYPoKLvmqxXF5X_C_uFiVI,2468
5
- fosslight_scanner/_run_compare.py,sha256=ufx3zldtM7sUOyQOYSgs66TY5-Gt26yE2Irz5kdkmio,10566
6
- fosslight_scanner/cli.py,sha256=K088vCNTBLaiOfxW2EDkrWRhrRs7IILmDfP1HSdSI2U,6536
7
- fosslight_scanner/common.py,sha256=NOfIxdKrH7MS_ptOIwY56OZJHVR9S_hfs-L2a1H9N0g,8179
8
- fosslight_scanner/fosslight_scanner.py,sha256=Sp-qYnlcLw1h9wLpJoySCpTcfvMaERy11SARx_itOxY,19640
9
- fosslight_scanner/resources/bom_compare.html,sha256=VocJ9bDmQQOwfGyvXatPZ4W-QddO-IlsAvKdO0nZ7pA,2240
10
- fosslight_scanner-2.0.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
11
- fosslight_scanner-2.0.1.dist-info/METADATA,sha256=rYCbU4NlBximKgYG1p-L3fVaCzd_oDCPDd2Gk-CO9Ho,7837
12
- fosslight_scanner-2.0.1.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
13
- fosslight_scanner-2.0.1.dist-info/entry_points.txt,sha256=0tBUtN9pKtAkuohQuhbzuohdHbeoI0-w95aWAR7J_RU,105
14
- fosslight_scanner-2.0.1.dist-info/top_level.txt,sha256=43_xLb5KYpy8wOU1H2Wd2fEsWBY7Dg6ZEJJXkfT64Ak,18
15
- fosslight_scanner-2.0.1.dist-info/RECORD,,