fosslight-util 1.4.47__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.
@@ -21,10 +21,10 @@ from spdx.writers import yaml
21
21
  from spdx.writers import xml
22
22
  from spdx.writers import tagvalue
23
23
  from fosslight_util.spdx_licenses import get_spdx_licenses_json, get_license_from_nick
24
- import fosslight_util.constant as constant
24
+ from fosslight_util.constant import LOGGER_NAME, FOSSLIGHT_DEPENDENCY
25
25
  import traceback
26
26
 
27
- logger = logging.getLogger(constant.LOGGER_NAME)
27
+ logger = logging.getLogger(LOGGER_NAME)
28
28
 
29
29
 
30
30
  def get_license_list_version():
@@ -37,11 +37,11 @@ def get_license_list_version():
37
37
  return version
38
38
 
39
39
 
40
- def write_spdx(output_file_without_ext, output_extension, sheet_list,
40
+ def write_spdx(output_file_without_ext, output_extension, scan_item,
41
41
  scanner_name, scanner_version, spdx_version=(2, 3)):
42
42
  success = True
43
43
  error_msg = ''
44
- if sheet_list:
44
+ if scan_item:
45
45
  doc = Document(version=Version(*spdx_version),
46
46
  data_license=License.from_identifier('CC0-1.0'),
47
47
  namespace=f'http://spdx.org/spdxdocs/{scanner_name.lower()}-{uuid.uuid4()}',
@@ -60,44 +60,39 @@ def write_spdx(output_file_without_ext, output_extension, sheet_list,
60
60
  try:
61
61
  package_id = 0
62
62
  root_package = False
63
- for sheet_name, sheet_contents in sheet_list.items():
64
- if sheet_name not in constant.supported_sheet_and_scanner.keys():
65
- continue
66
- scanner = constant.supported_sheet_and_scanner.get(sheet_name)
67
- for oss_item in sheet_contents:
68
- if len(oss_item) < 9:
69
- logger.warning(f"sheet list is too short ({len(oss_item)}): {oss_item}")
70
- continue
63
+ for scanner_name, _ in scan_item.file_items.items():
64
+ json_contents = scan_item.get_print_json(scanner_name)
65
+ for oss_item in json_contents:
71
66
  package_id += 1
72
67
  package = Package(spdx_id=f'SPDXRef-{package_id}')
73
68
 
74
- if oss_item[1] != '':
75
- package.name = oss_item[1] # required
69
+ if oss_item.get('name', '') != '':
70
+ package.name = oss_item.get('name', '') # required
76
71
  else:
77
72
  package.name = SPDXNone()
78
73
 
79
- if oss_item[2] != '':
80
- package.version = oss_item[2] # no required
74
+ if oss_item.get('version', '') != '':
75
+ package.version = oss_item.get('version', '') # no required
81
76
 
82
- if oss_item[4] != '':
83
- package.download_location = oss_item[4] # required
77
+ if oss_item.get('download location', '') != '':
78
+ package.download_location = oss_item.get('download location', '') # required
84
79
  else:
85
80
  package.download_location = SPDXNone()
86
81
 
87
- if scanner == constant.FL_DEPENDENCY:
82
+ if scanner_name == FOSSLIGHT_DEPENDENCY:
88
83
  package.files_analyzed = False # If omitted, the default value of true is assumed.
89
84
  else:
90
85
  package.files_analyzed = True
91
86
 
92
- if oss_item[5] != '':
93
- package.homepage = oss_item[5] # no required
87
+ if oss_item.get('homepage', '') != '':
88
+ package.homepage = oss_item.get('homepage', '') # no required
94
89
 
95
- if oss_item[6] != '':
96
- package.cr_text = oss_item[3] # required
90
+ if oss_item.get('copyright text', '') != '':
91
+ package.cr_text = oss_item.get('copyright text', '') # required
97
92
  else:
98
93
  package.cr_text = SPDXNone()
99
- if oss_item[3] != '':
100
- lic_list = [check_input_license_format(lic.strip()) for lic in oss_item[3].split(',')]
94
+ if oss_item.get('license', []) != '':
95
+ lic_list = [check_input_license_format(lic.strip()) for lic in oss_item.get('license', [])]
101
96
  first_lic = License.from_identifier(lic_list.pop(0))
102
97
  while lic_list:
103
98
  next_lic = License.from_identifier(lic_list.pop(0))
@@ -109,21 +104,21 @@ def write_spdx(output_file_without_ext, output_extension, sheet_list,
109
104
 
110
105
  doc.add_package(package)
111
106
 
112
- if scanner == constant.FL_DEPENDENCY:
113
- spdx_id_packages.append([package.name, package.spdx_id])
114
- comment = oss_item[8]
115
- relation_tree[package.name] = {}
116
- relation_tree[package.name]['id'] = package.spdx_id
117
- relation_tree[package.name]['dep'] = []
107
+ if scanner_name == FOSSLIGHT_DEPENDENCY:
108
+ purl = oss_item.get('package url', '')
109
+ spdx_id_packages.append([purl, package.spdx_id])
110
+ comment = oss_item.get('comment', '')
111
+ relation_tree[purl] = {}
112
+ relation_tree[purl]['id'] = package.spdx_id
113
+ relation_tree[purl]['dep'] = []
118
114
 
119
115
  if 'root package' in comment.split(','):
120
116
  root_package = True
121
117
  relationship = Relationship(f"{doc.spdx_id} DESCRIBES {package.spdx_id}")
122
118
  doc.add_relationship(relationship)
123
- if len(oss_item) > 9:
124
- deps = oss_item[9]
125
- relation_tree[package.name]['dep'].extend([di.strip().split('(')[0] for di in deps.split(',')])
126
- if scanner == constant.FL_DEPENDENCY and len(relation_tree) > 0:
119
+ deps = oss_item.get('depends on', '')
120
+ relation_tree[purl]['dep'].extend([di.strip().split('(')[0] for di in deps])
121
+ if scanner_name == FOSSLIGHT_DEPENDENCY and len(relation_tree) > 0:
127
122
  for pkg in relation_tree:
128
123
  if len(relation_tree[pkg]['dep']) > 0:
129
124
  pkg_spdx_id = relation_tree[pkg]['id']
@@ -4,9 +4,10 @@
4
4
  # SPDX-License-Identifier: Apache-2.0
5
5
  import os
6
6
  from pathlib import Path
7
+ from typing import Tuple
7
8
 
8
9
 
9
- def write_txt_file(file_to_create, str_to_write):
10
+ def write_txt_file(file_to_create: str, str_to_write: str) -> Tuple[bool, str]:
10
11
  success = True
11
12
  error_msg = ""
12
13
  try:
@@ -2,60 +2,49 @@
2
2
  # -*- coding: utf-8 -*-
3
3
  # Copyright (c) 2022 LG Electronics Inc.
4
4
  # SPDX-License-Identifier: Apache-2.0
5
-
6
5
  import yaml
7
6
  import logging
8
7
  import os
9
- import copy
8
+ import json
10
9
  from pathlib import Path
11
- import fosslight_util.constant as constant
12
- from fosslight_util.oss_item import OssItem
13
- from fosslight_util.write_excel import _EMPTY_ITEM_MSG
10
+ from fosslight_util.constant import LOGGER_NAME, SHEET_NAME_FOR_SCANNER
11
+ from typing import Tuple
14
12
 
15
- _logger = logging.getLogger(constant.LOGGER_NAME)
13
+ _logger = logging.getLogger(LOGGER_NAME)
16
14
 
17
15
 
18
- def write_yaml(output_file, sheet_list_origin, separate_yaml=False):
16
+ def write_yaml(output_file, scan_item, separate_yaml=False) -> Tuple[bool, str, str]:
19
17
  success = True
20
18
  error_msg = ""
21
19
  output = ""
22
20
 
23
21
  try:
24
- sheet_list = copy.deepcopy(sheet_list_origin)
25
- if sheet_list:
26
- output_files = []
27
- output_dir = os.path.dirname(output_file)
28
-
29
- Path(output_dir).mkdir(parents=True, exist_ok=True)
30
- if separate_yaml:
31
- filename = os.path.splitext(os.path.basename(output_file))[0]
32
- separate_output_file = os.path.join(output_dir, filename)
33
-
34
- merge_sheet = []
35
- for sheet_name, sheet_contents in sheet_list.items():
36
- if sheet_name not in constant.supported_sheet_and_scanner.keys():
37
- continue
38
- scanner_name = constant.supported_sheet_and_scanner[sheet_name]
39
- sheet_contents_with_scanner = []
40
- for i in sheet_contents:
41
- i.insert(0, scanner_name)
42
- sheet_contents_with_scanner.append(i)
43
- if not separate_yaml:
44
- merge_sheet.extend(sheet_contents_with_scanner)
45
- else:
46
- output_file = f'{separate_output_file}_{sheet_name}.yaml'
47
- convert_sheet_to_yaml(sheet_contents_with_scanner, output_file)
48
- output_files.append(output_file)
22
+ output_files = []
23
+ output_dir = os.path.dirname(output_file)
24
+
25
+ Path(output_dir).mkdir(parents=True, exist_ok=True)
26
+ if separate_yaml:
27
+ filename = os.path.splitext(os.path.basename(output_file))[0]
28
+ separate_output_file = os.path.join(output_dir, filename)
29
+
30
+ merge_sheet = []
31
+ for scanner_name, _ in scan_item.file_items.items():
32
+ sheet_name = SHEET_NAME_FOR_SCANNER[scanner_name.lower()]
33
+ json_contents = scan_item.get_print_json(scanner_name)
49
34
 
50
35
  if not separate_yaml:
51
- convert_sheet_to_yaml(merge_sheet, output_file)
36
+ merge_sheet.extend(json_contents)
37
+ else:
38
+ output_file = f'{separate_output_file}_{sheet_name}.yaml'
39
+ remove_duplicates_and_dump_yaml(json_contents, output_file)
52
40
  output_files.append(output_file)
53
41
 
54
- if output_files:
55
- output = ", ".join(output_files)
56
- else:
57
- success = False
58
- error_msg = _EMPTY_ITEM_MSG
42
+ if not separate_yaml:
43
+ remove_duplicates_and_dump_yaml(merge_sheet, output_file)
44
+ output_files.append(output_file)
45
+
46
+ if output_files:
47
+ output = ", ".join(output_files)
59
48
  except Exception as ex:
60
49
  error_msg = str(ex)
61
50
  success = False
@@ -66,37 +55,37 @@ def write_yaml(output_file, sheet_list_origin, separate_yaml=False):
66
55
  return success, error_msg, output
67
56
 
68
57
 
69
- def convert_sheet_to_yaml(sheet_contents_with_scanner, output_file):
70
- sheet_contents_with_scanner = [list(t) for t in set(tuple(e) for e in sorted(sheet_contents_with_scanner))]
58
+ def remove_duplicates_and_dump_yaml(json_contents, output_file):
59
+ unique_json_strings = {json.dumps(e, sort_keys=True) for e in json_contents}
60
+ unique_json_contents = [json.loads(e) for e in unique_json_strings]
71
61
 
72
62
  yaml_dict = {}
73
- for sheet_item in sheet_contents_with_scanner:
74
- item = OssItem('')
75
- item.set_sheet_item(sheet_item[1:], sheet_item[0])
76
- create_yaml_with_ossitem(item, yaml_dict)
63
+ for uitem in unique_json_contents:
64
+ create_yaml_with_ossitem(uitem, yaml_dict)
77
65
 
78
66
  with open(output_file, 'w') as f:
79
67
  yaml.dump(yaml_dict, f, default_flow_style=False, sort_keys=False)
80
68
 
81
69
 
82
70
  def create_yaml_with_ossitem(item, yaml_dict):
83
- item_json = item.get_print_json()
84
- item_name = item_json.pop("name")
71
+ item_name = item.pop("name")
85
72
 
86
73
  if item_name not in yaml_dict.keys():
87
74
  yaml_dict[item_name] = []
88
75
  merged = False
89
76
  for oss_info in yaml_dict[item_name]:
90
- if oss_info.get('version', '') == item.version and \
91
- oss_info.get('license', []) == item.license and \
92
- oss_info.get('copyright text', '') == item.copyright and \
93
- oss_info.get('homepage', '') == item.homepage and \
94
- oss_info.get('download location', '') == item.download_location and \
95
- oss_info.get('exclude', False) == item.exclude:
96
- oss_info.get('source path', []).extend(item.source_name_or_path)
77
+ if oss_info.get('version', '') == item.get('version', '') and \
78
+ oss_info.get('license', []) == item.get('license', []) and \
79
+ oss_info.get('copyright text', '') == item.get('copyright text', '') and \
80
+ oss_info.get('homepage', '') == item.get('homepage', '') and \
81
+ oss_info.get('download location', '') == item.get('download location', '') and \
82
+ oss_info.get('exclude', False) == item.get('exclude', False):
83
+ if isinstance(oss_info.get('source path', []), str):
84
+ oss_info['source path'] = [oss_info.get('source path', '')]
85
+ oss_info.get('source path', []).append(item.get('source path', ''))
97
86
  oss_info.pop('comment', None)
98
87
  merged = True
99
88
  break
100
89
 
101
90
  if not merged:
102
- yaml_dict[item_name].append(item_json)
91
+ yaml_dict[item_name].append(item)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fosslight-util
3
- Version: 1.4.47
3
+ Version: 2.0.0
4
4
  Summary: FOSSLight Util
5
5
  Home-page: https://github.com/fosslight/fosslight_util
6
6
  Author: LG Electronics
@@ -18,7 +18,6 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: XlsxWriter
20
20
  Requires-Dist: pandas
21
- Requires-Dist: xlrd ==1.2.0
22
21
  Requires-Dist: openpyxl
23
22
  Requires-Dist: progress
24
23
  Requires-Dist: PyYAML
@@ -27,14 +26,14 @@ Requires-Dist: coloredlogs
27
26
  Requires-Dist: python3-wget
28
27
  Requires-Dist: beautifulsoup4
29
28
  Requires-Dist: jsonmerge
30
- Requires-Dist: spdx-tools ==0.7.0rc0
31
- Requires-Dist: setuptools >=65.5.1
29
+ Requires-Dist: spdx-tools==0.7.0rc0
30
+ Requires-Dist: setuptools>=65.5.1
32
31
  Requires-Dist: npm
33
32
  Requires-Dist: requests
34
- Requires-Dist: numpy ; python_version < "3.8"
35
- Requires-Dist: numpy >=1.22.2 ; python_version >= "3.8"
36
- Requires-Dist: pygit2 ==1.6.1 ; python_version<'3.7'
37
- Requires-Dist: pygit2 >=1.10.1 ; python_version>='3.7'
33
+ Requires-Dist: numpy; python_version < "3.8"
34
+ Requires-Dist: numpy>=1.22.2; python_version >= "3.8"
35
+ Requires-Dist: pygit2==1.6.1; python_version < "3.7"
36
+ Requires-Dist: pygit2>=1.10.1; python_version >= "3.7"
38
37
 
39
38
  <!--
40
39
  Copyright (c) 2021 LG Electronics
@@ -0,0 +1,31 @@
1
+ fosslight_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ fosslight_util/_get_downloadable_url.py,sha256=63ZPI4KCpUFgL4oheKm8zvekuCRzpwNkVaLJcA-uA90,9010
3
+ fosslight_util/compare_yaml.py,sha256=znKz8sp6dk9wwBkJl-MQmkKTmL1IKNOrBWZklW7QVtU,2790
4
+ fosslight_util/constant.py,sha256=Ig3ACm9_QirE4389Wt-IfxOqRkVOUjqGnX1B05z2Byo,2151
5
+ fosslight_util/convert_excel_to_yaml.py,sha256=OJ11av4bsoxnVS15aa2aX-X3zGYUZW6M3118TPtHHTc,2323
6
+ fosslight_util/correct.py,sha256=3iUipan8ZX8sbyIIGAPtMkAGvZ4YucjeJwx1K1Bx_z4,3897
7
+ fosslight_util/cover.py,sha256=qqqKzxqFwKimal764FaugRUBcHWdeKt8af6xeK0mH8E,2040
8
+ fosslight_util/download.py,sha256=X-R2RTWwmhx_LSIBZhIxzPTJZ2GwasZnhIsZ5m3hUig,14997
9
+ fosslight_util/help.py,sha256=M3_XahUkP794US9Q0NS6ujmGvrFFnKBHsTU95Fg1KpA,2181
10
+ fosslight_util/oss_item.py,sha256=TlTxBS98_eTOrZ1GifyTgi3lrUHa7edqVbgR4_8rGKw,6324
11
+ fosslight_util/output_format.py,sha256=9O2IdhO3GRmrLvicvED-OXH1jPQpxXcLdwRm_lBo0rI,4983
12
+ fosslight_util/parsing_yaml.py,sha256=2zx_N5lMkXT1dRmfJMpzlrru-y_2F_CkVbGlba6vQpU,5380
13
+ fosslight_util/read_excel.py,sha256=-QvrdxaNqYOpIm1H7ZqIEh5NLvFPymZo6BAOZcQmQug,5263
14
+ fosslight_util/set_log.py,sha256=Xpa94AiOyGEK8ucaYkvkAllvlen1Pq_d6UG6kPYBYBc,3780
15
+ fosslight_util/spdx_licenses.py,sha256=GvMNe_D4v2meapTVwPu2BJXInnTo3_gIzg669eJhUu0,3691
16
+ fosslight_util/timer_thread.py,sha256=5VbZENQPD-N0NUmzEktqGr6Am-e7vxD79K05mmr29g0,433
17
+ fosslight_util/write_excel.py,sha256=G0fIslbWoOtWZCJxbBGLCpUKbhmwrrqhI5PHwRw8_44,9931
18
+ fosslight_util/write_opossum.py,sha256=ltmo6SkugKWdAYupeCqwE4-3lua0GwLpix1XqFC-tT8,11678
19
+ fosslight_util/write_scancodejson.py,sha256=81n7cWNYoyIKE_V4Kx5YtL2CgjMPIjoKdnSU3inkpJY,2163
20
+ fosslight_util/write_spdx.py,sha256=MwR_OO9ua1Uvnk77etJXMHFUqnku2sZuuALdeIp7g4k,9478
21
+ fosslight_util/write_txt.py,sha256=BEFjYBppqk1CITx-fUN4vfvKv0XCs1GXWtc2Iu-etU4,629
22
+ fosslight_util/write_yaml.py,sha256=QlEKoIPQsEaYERfbP53TeKgnllYzhLQWm5wYjnWtVjE,3238
23
+ fosslight_util/resources/frequentLicenselist.json,sha256=GUhzK6tu7ok10fekOnmVmUgIGRC-acGABZKTNKfDyYA,4776157
24
+ fosslight_util/resources/frequent_license_nick_list.json,sha256=ryU2C_6ZxHbz90_sUN9OvI9GXkCMLu7oGcmd9W79YYo,5005
25
+ fosslight_util/resources/licenses.json,sha256=mK55z-bhY7Mjpj2KsO1crKGGL-X3F6MBFQJ0zLlx010,240843
26
+ fosslight_util-2.0.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
27
+ fosslight_util-2.0.0.dist-info/METADATA,sha256=GhApxdXkZnaERDjLepsy2WKvV1sJdt9B4FydaZqlHAk,6384
28
+ fosslight_util-2.0.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
29
+ fosslight_util-2.0.0.dist-info/entry_points.txt,sha256=bzXX5i7HZ13V8BLKvtu_9KO3ZjtRypH-XszOXT6I3bU,69
30
+ fosslight_util-2.0.0.dist-info/top_level.txt,sha256=2qyYWGLakgBRy4BqoBNt-I5C29tBr_e93e5e1pbuTGA,15
31
+ fosslight_util-2.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: bdist_wheel (0.44.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,31 +0,0 @@
1
- fosslight_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- fosslight_util/_get_downloadable_url.py,sha256=63ZPI4KCpUFgL4oheKm8zvekuCRzpwNkVaLJcA-uA90,9010
3
- fosslight_util/compare_yaml.py,sha256=0bapoyS0yrzkiK70K57E8-3wZ_D6mZAJ-24Eq9TYBlk,2632
4
- fosslight_util/constant.py,sha256=j9uhncoC2Fn4j4ATNsjUoS91nVXhyGzU6xLyWFj941A,1834
5
- fosslight_util/convert_excel_to_yaml.py,sha256=7ZsAMMQJIEXrmcl_28nSHvFpGMi1ZiRZYpEfI5O8vP8,2298
6
- fosslight_util/correct.py,sha256=O8c4vIl5Hdc46Ijr63LfcTjIZE5fgqN2iKRadHqluUU,6253
7
- fosslight_util/cover.py,sha256=GZAeGoQGGCx7OEddErS_Mj6pbMCQrdr5jX-CixU4iAA,1607
8
- fosslight_util/download.py,sha256=X-R2RTWwmhx_LSIBZhIxzPTJZ2GwasZnhIsZ5m3hUig,14997
9
- fosslight_util/help.py,sha256=xhAf43fuRLOU3TE7jqaxVTizVn4aANDvHaHYQAdaqYc,2154
10
- fosslight_util/oss_item.py,sha256=Wc2ka8cZc3D9JiJXl4-Y69A_qcGuyMiyYq053Srq638,7267
11
- fosslight_util/output_format.py,sha256=r_OuYyQGCsCMkjJ3NYUyl4DJDYEDGZI7AWzz4fXPwSg,4883
12
- fosslight_util/parsing_yaml.py,sha256=m1kg6sYBJTmLmobsD-fjFxOz2NuIVjUvoEvXxmvBOpU,4561
13
- fosslight_util/read_excel.py,sha256=3zW2F6Azj4ufsrStBQGArBDCLG-BTJGG54HIqMxlx_A,5392
14
- fosslight_util/set_log.py,sha256=GsUtbtqmYKgBltHzeaxV3H9gaUWMYQYDJEhr_LdEGoo,3258
15
- fosslight_util/spdx_licenses.py,sha256=r90hUY4_T-XrHIJHLx1Ox3gWZ3qzdZj9rJFo7AwmkPE,3641
16
- fosslight_util/timer_thread.py,sha256=5VbZENQPD-N0NUmzEktqGr6Am-e7vxD79K05mmr29g0,433
17
- fosslight_util/write_excel.py,sha256=na3XB_rIr9ekCugGUMCE-AqrndCbvqhmzhoCO0pZRJk,12298
18
- fosslight_util/write_opossum.py,sha256=PGJV5DysNJvIFbzsyGXxh_kRcvZuHAOmLs-WlXP8qMI,11831
19
- fosslight_util/write_scancodejson.py,sha256=CSKjuwbA04nK5ogXklNsCBgGDZXPr805T8KPLgvx71U,2282
20
- fosslight_util/write_spdx.py,sha256=B_aHv9vScgZI5gHo5Hd56ckNWOHdyAQebRV54bTx9ec,9542
21
- fosslight_util/write_txt.py,sha256=Ms8E2wbc0U84IYP0dxTAbIfX5PzpQG3xblu8lv1w8J0,574
22
- fosslight_util/write_yaml.py,sha256=nzuIPdjOAOM4NS5VtU-KFrft41fKEF05-cl0OlEHj7Y,3657
23
- fosslight_util/resources/frequentLicenselist.json,sha256=GUhzK6tu7ok10fekOnmVmUgIGRC-acGABZKTNKfDyYA,4776157
24
- fosslight_util/resources/frequent_license_nick_list.json,sha256=ryU2C_6ZxHbz90_sUN9OvI9GXkCMLu7oGcmd9W79YYo,5005
25
- fosslight_util/resources/licenses.json,sha256=mK55z-bhY7Mjpj2KsO1crKGGL-X3F6MBFQJ0zLlx010,240843
26
- fosslight_util-1.4.47.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
27
- fosslight_util-1.4.47.dist-info/METADATA,sha256=za9smj8HiWDYAHLX5Oe3zcO1Fag9GxVGtteVGRhs5EY,6418
28
- fosslight_util-1.4.47.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
29
- fosslight_util-1.4.47.dist-info/entry_points.txt,sha256=bzXX5i7HZ13V8BLKvtu_9KO3ZjtRypH-XszOXT6I3bU,69
30
- fosslight_util-1.4.47.dist-info/top_level.txt,sha256=2qyYWGLakgBRy4BqoBNt-I5C29tBr_e93e5e1pbuTGA,15
31
- fosslight_util-1.4.47.dist-info/RECORD,,