fosslight-util 1.4.34__py3-none-any.whl → 1.4.36__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,32 +4,119 @@
4
4
  # SPDX-License-Identifier: Apache-2.0
5
5
  import logging
6
6
  import re
7
+ import requests
8
+ from npm.bindings import npm_run
9
+ from lastversion import latest
7
10
  from bs4 import BeautifulSoup
8
11
  from urllib.request import urlopen
9
12
  import fosslight_util.constant as constant
10
- from npm.bindings import npm_run
11
13
 
12
14
  logger = logging.getLogger(constant.LOGGER_NAME)
13
15
 
14
16
 
17
+ def extract_name_version_from_link(link):
18
+ # Github : https://github.com/(owner)/(repo)
19
+ # npm : https://www.npmjs.com/package/(package)/v/(version)
20
+ # npm2 : https://www.npmjs.com/package/@(group)/(package)/v/(version)
21
+ # pypi : https://pypi.org/project/(oss_name)/(version)
22
+ # pypi2 : https://files.pythonhosted.org/packages/source/(alphabet)/(oss_name)/(oss_name)-(version).tar.gz
23
+ # Maven: https://mvnrepository.com/artifact/(group)/(artifact)/(version)
24
+ # pub: https://pub.dev/packages/(package)/versions/(version)
25
+ # Cocoapods: https://cocoapods.org/(package)
26
+ pkg_pattern = {
27
+ "pypi": r'https?:\/\/pypi\.org\/project\/([^\/]+)[\/]?([^\/]*)',
28
+ "pypi2": r'https?:\/\/files\.pythonhosted\.org\/packages\/source\/[\w]\/([^\/]+)\/[\S]+-([^\-]+)\.tar\.gz',
29
+ "maven": r'https?:\/\/mvnrepository\.com\/artifact\/([^\/]+)\/([^\/]+)\/?([^\/]*)',
30
+ "npm": r'https?:\/\/www\.npmjs\.com\/package\/([^\/\@]+)(?:\/v\/)?([^\/]*)',
31
+ "npm2": r'https?:\/\/www\.npmjs\.com\/package\/(\@[^\/]+\/[^\/]+)(?:\/v\/)?([^\/]*)',
32
+ "pub": r'https?:\/\/pub\.dev\/packages\/([^\/]+)(?:\/versions\/)?([^\/]*)',
33
+ "pods": r'https?:\/\/cocoapods\.org\/pods\/([^\/]+)'
34
+ }
35
+ oss_name = ""
36
+ oss_version = ""
37
+ if link.startswith("www."):
38
+ link = link.replace("www.", "https://www.", 1)
39
+ for key, value in pkg_pattern.items():
40
+ p = re.compile(value)
41
+ match = p.match(link)
42
+ if match:
43
+ try:
44
+ origin_name = match.group(1)
45
+ if (key == "pypi") or (key == "pypi2"):
46
+ oss_name = f"pypi:{origin_name}"
47
+ oss_name = re.sub(r"[-_.]+", "-", oss_name).lower()
48
+ oss_version = match.group(2)
49
+ elif key == "maven":
50
+ artifact = match.group(2)
51
+ oss_name = f"{origin_name}:{artifact}"
52
+ origin_name = oss_name
53
+ oss_version = match.group(3)
54
+ elif key == "npm" or key == "npm2":
55
+ oss_name = f"npm:{origin_name}"
56
+ oss_version = match.group(2)
57
+ elif key == "pub":
58
+ oss_name = f"pub:{origin_name}"
59
+ oss_version = match.group(2)
60
+ elif key == "pods":
61
+ oss_name = f"cocoapods:{origin_name}"
62
+ except Exception as ex:
63
+ logger.info(f"extract_name_version_from_link {key}:{ex}")
64
+ if oss_name and (not oss_version):
65
+ if key in ["pypi", "maven", "npm", "npm2", "pub"]:
66
+ oss_version, link = get_latest_package_version(link, key, origin_name)
67
+ logger.debug(f'Try to download with the latest version:{link}')
68
+ break
69
+ return oss_name, oss_version, link, key
70
+
71
+
72
+ def get_latest_package_version(link, pkg_type, oss_name):
73
+ find_version = ''
74
+ link_with_version = link
75
+
76
+ try:
77
+ if pkg_type in ['npm', 'npm2']:
78
+ stderr, stdout = npm_run('view', oss_name, 'version')
79
+ if stdout:
80
+ find_version = stdout.strip()
81
+ link_with_version = f'https://www.npmjs.com/package/{oss_name}/v/{find_version}'
82
+ elif pkg_type == 'pypi':
83
+ find_version = str(latest(oss_name, at='pip', output_format='version', pre_ok=True))
84
+ link_with_version = f'https://pypi.org/project/{oss_name}/{find_version}'
85
+ elif pkg_type == 'maven':
86
+ maven_response = requests.get(f'https://api.deps.dev/v3alpha/systems/maven/packages/{oss_name}')
87
+ if maven_response.status_code == 200:
88
+ find_version = maven_response.json().get('versions')[-1].get('versionKey').get('version')
89
+ oss_name = oss_name.replace(':', '/')
90
+ link_with_version = f'https://mvnrepository.com/artifact/{oss_name}/{find_version}'
91
+ elif pkg_type == 'pub':
92
+ pub_response = requests.get(f'https://pub.dev/api/packages/{oss_name}')
93
+ if pub_response.status_code == 200:
94
+ find_version = pub_response.json().get('latest').get('version')
95
+ link_with_version = f'https://pub.dev/packages/{oss_name}/versions/{find_version}'
96
+ except Exception as e:
97
+ logger.debug(f'Fail to get latest package version({link}:{e})')
98
+ return find_version, link_with_version
99
+
100
+
15
101
  def get_downloadable_url(link):
16
102
 
17
103
  ret = False
18
- new_link = ''
104
+ result_link = link
19
105
 
20
- link = link.replace('http://', '')
21
- link = link.replace('https://', '')
106
+ oss_name, oss_version, new_link, pkg_type = extract_name_version_from_link(link)
107
+ new_link = new_link.replace('http://', '')
108
+ new_link = new_link.replace('https://', '')
22
109
 
23
- if link.startswith('pypi.org/'):
24
- ret, new_link = get_download_location_for_pypi(link)
25
- elif link.startswith('mvnrepository.com/artifact/') or link.startswith('repo1.maven.org/'):
26
- ret, new_link = get_download_location_for_maven(link)
27
- elif link.startswith('www.npmjs.com/') or link.startswith('registry.npmjs.org/'):
28
- ret, new_link = get_download_location_for_npm(link)
29
- elif link.startswith('pub.dev/'):
30
- ret, new_link = get_download_location_for_pub(link)
110
+ if pkg_type == "pypi":
111
+ ret, result_link = get_download_location_for_pypi(new_link)
112
+ elif pkg_type == "maven" or new_link.startswith('repo1.maven.org/'):
113
+ ret, result_link = get_download_location_for_maven(new_link)
114
+ elif (pkg_type in ["npm", "npm2"]) or new_link.startswith('registry.npmjs.org/'):
115
+ ret, result_link = get_download_location_for_npm(new_link)
116
+ elif pkg_type == "pub":
117
+ ret, result_link = get_download_location_for_pub(new_link)
31
118
 
32
- return ret, new_link
119
+ return ret, result_link, oss_name, oss_version
33
120
 
34
121
 
35
122
  def get_download_location_for_pypi(link):
@@ -118,6 +205,7 @@ def get_download_location_for_npm(link):
118
205
  oss_name_npm = ""
119
206
  tar_name = ""
120
207
 
208
+ link = link.replace('%40', '@')
121
209
  if link.startswith('www.npmjs.com/') or link.startswith('registry.npmjs.org/'):
122
210
  try:
123
211
  dn_loc_split = link.split('/')
@@ -133,16 +221,9 @@ def get_download_location_for_npm(link):
133
221
  oss_name_npm = dn_loc_split[idx]
134
222
  tar_name = oss_name_npm
135
223
  oss_version = dn_loc_split[idx+2]
136
- except Exception:
137
- pass
138
224
 
139
- try:
140
- if not oss_version:
141
- stderr, stdout = npm_run('view', oss_name_npm, 'version')
142
- if stdout:
143
- oss_version = stdout.strip()
144
- tar_name = f"{tar_name}-{oss_version}"
145
- new_link = 'https://registry.npmjs.org/' + oss_name_npm + '/-/' + tar_name + '.tgz'
225
+ tar_name = f'{tar_name}-{oss_version}'
226
+ new_link = f'https://registry.npmjs.org/{oss_name_npm}/-/{tar_name}.tgz'
146
227
  ret = True
147
228
  except Exception as error:
148
229
  ret = False
@@ -158,7 +239,7 @@ def get_download_location_for_pub(link):
158
239
  # download url format : https://pub.dev/packages/(oss_name)/versions/(oss_version).tar.gz
159
240
  try:
160
241
  if link.startswith('pub.dev/packages'):
161
- new_link = 'https://{link}.tar.gz'
242
+ new_link = f'https://{link}.tar.gz'
162
243
  ret = True
163
244
 
164
245
  except Exception as error:
@@ -24,6 +24,7 @@ import time
24
24
  import threading
25
25
  import platform
26
26
  import subprocess
27
+ import re
27
28
 
28
29
  logger = logging.getLogger(constant.LOGGER_NAME)
29
30
  compression_extension = {".tar.bz2", ".tar.gz", ".tar.xz", ".tgz", ".tar", ".zip", ".jar", ".bz2"}
@@ -115,6 +116,8 @@ def cli_download_and_extract(link, target_dir, log_dir, checkout_to="", compress
115
116
 
116
117
  success = True
117
118
  msg = ""
119
+ oss_name = ""
120
+ oss_version = ""
118
121
  log_file_name = "fosslight_download_" + \
119
122
  datetime.now().strftime('%Y%m%d_%H-%M-%S')+".txt"
120
123
  logger, log_item = init_log(os.path.join(log_dir, log_file_name))
@@ -135,22 +138,29 @@ def cli_download_and_extract(link, target_dir, log_dir, checkout_to="", compress
135
138
  is_rubygems = src_info.get("rubygems", False)
136
139
 
137
140
  # General download (git clone, wget)
138
- if (not is_rubygems) and (not download_git_clone(link, target_dir, checkout_to, tag, branch)):
141
+ success_git, msg, oss_name = download_git_clone(link, target_dir, checkout_to, tag, branch)
142
+ if (not is_rubygems) and (not success_git):
139
143
  if os.path.isfile(target_dir):
140
144
  shutil.rmtree(target_dir)
141
145
 
142
- success, downloaded_file = download_wget(link, target_dir, compressed_only)
146
+ success, downloaded_file, msg_wget, oss_name, oss_version = download_wget(link, target_dir, compressed_only)
143
147
  if success:
144
148
  success = extract_compressed_file(downloaded_file, target_dir, True)
145
149
  # Download from rubygems.org
146
150
  elif is_rubygems and shutil.which("gem"):
147
151
  success = gem_download(link, target_dir, checkout_to)
152
+ if msg:
153
+ msg = f'git fail: {msg}'
154
+ if msg_wget:
155
+ msg = f'{msg}, wget fail: {msg_wget}'
156
+ else:
157
+ msg = f'{msg}, wget success'
148
158
  except Exception as error:
149
159
  success = False
150
160
  msg = str(error)
151
161
 
152
- logger.info(f"\n* FOSSLight Downloader - Result: {success}\n {msg}")
153
- return success, msg
162
+ logger.info(f"\n* FOSSLight Downloader - Result: {success} ({msg})")
163
+ return success, msg, oss_name, oss_version
154
164
 
155
165
 
156
166
  def get_ref_to_checkout(checkout_to, ref_list):
@@ -184,8 +194,19 @@ def decide_checkout(checkout_to="", tag="", branch=""):
184
194
  return ref_to_checkout
185
195
 
186
196
 
197
+ def get_github_ossname(link):
198
+ oss_name = ""
199
+ p = re.compile(r'https?:\/\/github.com\/([^\/]+)\/([^\/\.]+)(\.git)?')
200
+ match = p.match(link)
201
+ if match:
202
+ oss_name = f"{match.group(1)}-{match.group(2)}"
203
+ return oss_name
204
+
205
+
187
206
  def download_git_clone(git_url, target_dir, checkout_to="", tag="", branch=""):
188
207
  ref_to_checkout = decide_checkout(checkout_to, tag, branch)
208
+ msg = ""
209
+ oss_name = get_github_ossname(git_url)
189
210
 
190
211
  if platform.system() != "Windows":
191
212
  signal.signal(signal.SIGALRM, alarm_handler)
@@ -204,7 +225,8 @@ def download_git_clone(git_url, target_dir, checkout_to="", tag="", branch=""):
204
225
  del alarm
205
226
  except Exception as error:
206
227
  logger.warning(f"git clone - failed: {error}")
207
- return False
228
+ msg = str(error)
229
+ return False, msg, oss_name
208
230
  try:
209
231
  if ref_to_checkout != "":
210
232
  ref_list = [x for x in repo.references]
@@ -213,11 +235,14 @@ def download_git_clone(git_url, target_dir, checkout_to="", tag="", branch=""):
213
235
  repo.checkout(ref_to_checkout)
214
236
  except Exception as error:
215
237
  logger.warning(f"git checkout to {ref_to_checkout} - failed: {error}")
216
- return True
238
+ return True, msg, oss_name
217
239
 
218
240
 
219
241
  def download_wget(link, target_dir, compressed_only):
220
242
  success = False
243
+ msg = ""
244
+ oss_name = ""
245
+ oss_version = ""
221
246
  downloaded_file = ""
222
247
  if platform.system() != "Windows":
223
248
  signal.signal(signal.SIGALRM, alarm_handler)
@@ -228,7 +253,7 @@ def download_wget(link, target_dir, compressed_only):
228
253
  try:
229
254
  Path(target_dir).mkdir(parents=True, exist_ok=True)
230
255
 
231
- ret, new_link = get_downloadable_url(link)
256
+ ret, new_link, oss_name, oss_version = get_downloadable_url(link)
232
257
  if ret and new_link:
233
258
  link = new_link
234
259
 
@@ -255,9 +280,10 @@ def download_wget(link, target_dir, compressed_only):
255
280
  logger.debug(f"wget - downloaded: {downloaded_file}")
256
281
  except Exception as error:
257
282
  success = False
283
+ msg = str(error)
258
284
  logger.warning(f"wget - failed: {error}")
259
285
 
260
- return success, downloaded_file
286
+ return success, downloaded_file, msg, oss_name, oss_version
261
287
 
262
288
 
263
289
  def extract_compressed_dir(src_dir, target_dir, remove_after_extract=True):
@@ -3,6 +3,7 @@
3
3
  # Copyright (c) 2021 LG Electronics Inc.
4
4
  # SPDX-License-Identifier: Apache-2.0
5
5
  import logging
6
+ from typing import List, Dict, Any
6
7
  import xlrd
7
8
  import json
8
9
  from fosslight_util.constant import LOGGER_NAME
@@ -12,17 +13,18 @@ from fosslight_util.parsing_yaml import set_value_switch
12
13
  logger = logging.getLogger(LOGGER_NAME)
13
14
  IDX_CANNOT_FOUND = -1
14
15
  PREFIX_BIN = "bin"
16
+ SHEET_PREFIX_TO_READ = ["bin", "bom", "src"]
15
17
  xlrd.xlsx.ensure_elementtree_imported(False, None)
16
18
  xlrd.xlsx.Element_has_iter = True
17
19
 
18
20
 
19
- def read_oss_report(excel_file, sheet_names=""):
20
- _oss_report_items = []
21
- xl_sheets = {}
22
- all_sheet_to_read = []
23
- not_matched_sheet = []
21
+ def read_oss_report(excel_file: str, sheet_names: str = "") -> List[OssItem]:
22
+ oss_report_items: List[OssItem] = []
23
+ xl_sheets: Dict[str, Any] = {}
24
+ all_sheet_to_read: List[str] = []
25
+ not_matched_sheet: List[str] = []
24
26
  any_sheet_matched = False
25
- SHEET_PREFIX_TO_READ = ["bin", "bom", "src"]
27
+
26
28
  if sheet_names:
27
29
  sheet_name_prefix_match = False
28
30
  sheet_name_to_read = sheet_names.split(",")
@@ -113,8 +115,8 @@ def read_oss_report(excel_file, sheet_names=""):
113
115
  else:
114
116
  valid_row = False if cell_value == "-" else True
115
117
  if valid_row and load_data_cnt > 0:
116
- _oss_report_items.append(item)
118
+ oss_report_items.append(item)
117
119
 
118
120
  except Exception as error:
119
121
  logger.error(f"Parsing a OSS Report: {error}")
120
- return _oss_report_items
122
+ return oss_report_items
@@ -129,6 +129,10 @@ def write_result_to_csv(output_file, sheet_list_origin, separate_sheet=False, ex
129
129
  row_num = 1
130
130
  header_row, sheet_content_without_header = get_header_row(sheet_name, sheet_contents[:], extended_header)
131
131
 
132
+ if 'Copyright Text' in header_row:
133
+ idx = header_row.index('Copyright Text')-1
134
+ for item in sheet_content_without_header:
135
+ item[idx] = item[idx].replace('\n', ', ')
132
136
  if not separate_sheet:
133
137
  merge_sheet.extend(sheet_content_without_header)
134
138
  if sheet_name == list(sheet_list.keys())[-1]:
@@ -7,12 +7,14 @@ import logging
7
7
  import os
8
8
  import json
9
9
  import fosslight_util.constant as constant
10
+ from fosslight_util.oss_item import OssItem
11
+ from typing import List
10
12
 
11
13
  logger = logging.getLogger(constant.LOGGER_NAME)
12
14
  EMPTY_FILE_PATH = '-'
13
15
 
14
16
 
15
- def write_scancodejson(output_dir, output_filename, oss_list):
17
+ def write_scancodejson(output_dir: str, output_filename: str, oss_list: List[OssItem]):
16
18
  json_output = {}
17
19
  json_output['headers'] = []
18
20
  json_output['summary'] = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fosslight-util
3
- Version: 1.4.34
3
+ Version: 1.4.36
4
4
  Summary: FOSSLight Util
5
5
  Home-page: https://github.com/fosslight/fosslight_util
6
6
  Author: LG Electronics
@@ -28,8 +28,9 @@ Requires-Dist: python3-wget
28
28
  Requires-Dist: beautifulsoup4
29
29
  Requires-Dist: jsonmerge
30
30
  Requires-Dist: spdx-tools ==0.7.0rc0
31
- Requires-Dist: npm
32
31
  Requires-Dist: setuptools >=65.5.1
32
+ Requires-Dist: npm
33
+ Requires-Dist: requests
33
34
  Requires-Dist: numpy ; python_version < "3.8"
34
35
  Requires-Dist: numpy >=1.22.2 ; python_version >= "3.8"
35
36
  Requires-Dist: pygit2 ==1.6.1 ; python_version<'3.7'
@@ -1,30 +1,30 @@
1
1
  fosslight_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- fosslight_util/_get_downloadable_url.py,sha256=UggybHxs_MeqxKzOpdS9PuOeKvO3YayhpbwLZPIZDss,5844
2
+ fosslight_util/_get_downloadable_url.py,sha256=Fb_-7S7vTg4HIsdQ_W77WbO1IYTFqGaf0lRRSunbWFI,10167
3
3
  fosslight_util/compare_yaml.py,sha256=0bapoyS0yrzkiK70K57E8-3wZ_D6mZAJ-24Eq9TYBlk,2632
4
4
  fosslight_util/constant.py,sha256=mDrH3Ahldhs9xT63iC8BmeRLHjN6fewI1H-pxnGvcD8,595
5
5
  fosslight_util/convert_excel_to_yaml.py,sha256=7ZsAMMQJIEXrmcl_28nSHvFpGMi1ZiRZYpEfI5O8vP8,2298
6
6
  fosslight_util/correct.py,sha256=RQ70zaQ_xuo9Mo0zIcb6pRQwt96bsimQJWkYldE2vbg,5224
7
- fosslight_util/download.py,sha256=CMT_ZHK_lCQI6_-_6hI90n5fhw_AkxV3elAZl4uilzk,12561
7
+ fosslight_util/download.py,sha256=UVBQ5dtu9BCulUG20A0FBy98AlTmrjRau1Qmb4Ayd5U,13394
8
8
  fosslight_util/help.py,sha256=3ej8HhpszfFLRxR99Ob55MwHypjIHce1-YSp5_ENq-A,2113
9
9
  fosslight_util/oss_item.py,sha256=Gjw-aI4gZGYrCbAkCL35lXlgA2w2F2plgOUmenQ1Cig,5238
10
10
  fosslight_util/output_format.py,sha256=kmlruqjTjrkENsg0sF4B-wAfEUlld_Uc--cGGm5NPs0,3214
11
11
  fosslight_util/parsing_yaml.py,sha256=zmetMiZprni_YMxUfj_Nx-nXm0sT31Ck_V0nWFS6ZmE,4332
12
- fosslight_util/read_excel.py,sha256=XLN4-iCPB_6GoNQwjt4ScMi39_uBfNGdqR73f06j244,5043
12
+ fosslight_util/read_excel.py,sha256=eN2aNkJv3Y2071f6lHfQTHx5IFJe0imxH3TeRO_kodc,5154
13
13
  fosslight_util/set_log.py,sha256=8cFGpr4HMk4grHo3a5keR4V1xWBscbjowYPxyrh42ks,3140
14
14
  fosslight_util/spdx_licenses.py,sha256=r90hUY4_T-XrHIJHLx1Ox3gWZ3qzdZj9rJFo7AwmkPE,3641
15
15
  fosslight_util/timer_thread.py,sha256=5VbZENQPD-N0NUmzEktqGr6Am-e7vxD79K05mmr29g0,433
16
- fosslight_util/write_excel.py,sha256=DI-Re-__VlkaCC6s4pi9PbEZn5HWrq7NU7ahZkzH41A,9175
16
+ fosslight_util/write_excel.py,sha256=NEwGMs56NkGT5MKxYsearMTuzoD7Xio2tGC-PgTjOHI,9417
17
17
  fosslight_util/write_opossum.py,sha256=PGJV5DysNJvIFbzsyGXxh_kRcvZuHAOmLs-WlXP8qMI,11831
18
- fosslight_util/write_scancodejson.py,sha256=LKvy8C-8YvGRGhdmjIvtu3wD-IUfhS2rg64TJEZE9jI,2189
18
+ fosslight_util/write_scancodejson.py,sha256=CSKjuwbA04nK5ogXklNsCBgGDZXPr805T8KPLgvx71U,2282
19
19
  fosslight_util/write_spdx.py,sha256=B_aHv9vScgZI5gHo5Hd56ckNWOHdyAQebRV54bTx9ec,9542
20
20
  fosslight_util/write_txt.py,sha256=Ms8E2wbc0U84IYP0dxTAbIfX5PzpQG3xblu8lv1w8J0,574
21
21
  fosslight_util/write_yaml.py,sha256=ppBBErAXbXw8jtJ9j7BDeQHHzDlsTRt62XR0GgTcr70,3294
22
22
  fosslight_util/resources/frequentLicenselist.json,sha256=GUhzK6tu7ok10fekOnmVmUgIGRC-acGABZKTNKfDyYA,4776157
23
23
  fosslight_util/resources/frequent_license_nick_list.json,sha256=ryU2C_6ZxHbz90_sUN9OvI9GXkCMLu7oGcmd9W79YYo,5005
24
24
  fosslight_util/resources/licenses.json,sha256=mK55z-bhY7Mjpj2KsO1crKGGL-X3F6MBFQJ0zLlx010,240843
25
- fosslight_util-1.4.34.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
26
- fosslight_util-1.4.34.dist-info/METADATA,sha256=nnfmrSHHm-AxpehOHFY7hOZNvFoSTulea4qNbxQHiBY,6165
27
- fosslight_util-1.4.34.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
28
- fosslight_util-1.4.34.dist-info/entry_points.txt,sha256=bzXX5i7HZ13V8BLKvtu_9KO3ZjtRypH-XszOXT6I3bU,69
29
- fosslight_util-1.4.34.dist-info/top_level.txt,sha256=2qyYWGLakgBRy4BqoBNt-I5C29tBr_e93e5e1pbuTGA,15
30
- fosslight_util-1.4.34.dist-info/RECORD,,
25
+ fosslight_util-1.4.36.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
26
+ fosslight_util-1.4.36.dist-info/METADATA,sha256=POQH9BPStS1HuuZUnuj3AND4EitzjRIgGtJj7ONP7ls,6189
27
+ fosslight_util-1.4.36.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
28
+ fosslight_util-1.4.36.dist-info/entry_points.txt,sha256=bzXX5i7HZ13V8BLKvtu_9KO3ZjtRypH-XszOXT6I3bU,69
29
+ fosslight_util-1.4.36.dist-info/top_level.txt,sha256=2qyYWGLakgBRy4BqoBNt-I5C29tBr_e93e5e1pbuTGA,15
30
+ fosslight_util-1.4.36.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.3)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5