ezKit 1.7.0__py3-none-any.whl → 1.7.1__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.
ezKit/utils.py CHANGED
@@ -14,7 +14,7 @@ from multiprocessing.pool import ThreadPool
14
14
  from pathlib import Path
15
15
  from shutil import rmtree
16
16
  from threading import Thread
17
- from typing import Callable
17
+ from typing import Any, Callable, List, Optional, Union
18
18
  from urllib.parse import ParseResult, urlparse
19
19
  from uuid import uuid4
20
20
 
@@ -32,46 +32,55 @@ NoneType = type(None)
32
32
 
33
33
 
34
34
  def v_true(
35
- v_instance: any,
36
- v_type: any = None,
35
+ v_instance: Any,
36
+ v_type: Any = None,
37
37
  true_list: list | tuple | set | str | None = None,
38
38
  false_list: list | tuple | set | str | None = None,
39
39
  debug: bool = False
40
40
  ) -> bool:
41
41
  """
42
- 检查变量类型以及变量是否为True
42
+ 检查变量类型以及变量是否为 True
43
+
44
+ 常见类型:
45
+
46
+ Boolean bool False
47
+ Numbers int/float 0/0.0
48
+ String str ""
49
+ List list/tuple/set []/()/{}
50
+ Dictionary dict {}
51
+
52
+ 函数使用 callable(func) 判断
43
53
  """
44
- # 常见类型:
45
- # Boolean bool False
46
- # Numbers int/float 0/0.0
47
- # String str ""
48
- # List list/tuple/set []/()/{}
49
- # Dictionary dict {}
50
- # 函数使用 callable(func) 判断
51
54
 
52
55
  try:
53
56
 
54
57
  if isinstance(v_instance, v_type):
55
58
 
56
59
  if all(
57
- true_list is not None,
58
- false_list is None,
59
- isinstance(true_list, (list, tuple, set, str))
60
+ [
61
+ true_list is not None,
62
+ false_list is None,
63
+ isinstance(true_list, (list, tuple, set, str))
64
+ ]
60
65
  ):
61
66
  return v_instance in true_list
62
67
 
63
68
  if all(
64
- true_list is None,
65
- false_list is not None,
66
- isinstance(false_list, (list, tuple, set, str))
69
+ [
70
+ true_list is None,
71
+ false_list is not None,
72
+ isinstance(false_list, (list, tuple, set, str))
73
+ ]
67
74
  ):
68
75
  return v_instance not in false_list
69
76
 
70
77
  if all(
71
- true_list is not None,
72
- false_list is not None,
73
- isinstance(true_list, (list, tuple, set, str)),
74
- isinstance(false_list, (list, tuple, set, str))
78
+ [
79
+ true_list is not None,
80
+ false_list is not None,
81
+ isinstance(true_list, (list, tuple, set, str)),
82
+ isinstance(false_list, (list, tuple, set, str))
83
+ ]
75
84
  ):
76
85
  return (v_instance in true_list) and (v_instance not in false_list)
77
86
 
@@ -85,25 +94,43 @@ def v_true(
85
94
  return False
86
95
 
87
96
 
97
+ # --------------------------------------------------------------------------------------------------
98
+
99
+
88
100
  def os_environ(
89
101
  name: str,
90
- value: any = None,
102
+ value: Any = None,
91
103
  debug: bool = False
92
- ) -> any:
93
- """伪全局变量"""
94
- # Python 没有全局变量, 多个文件无法调用同一个变量
95
- # 为了解决这个问题, 将变量设置为系统变量, 从而实现多个文件调用同一个变量
104
+ ) -> Any:
105
+ """
106
+ 系统变量
107
+
108
+ 伪全局变量
109
+ Python 没有全局变量, 多个文件无法调用同一个变量.
110
+ 为了解决这个问题, 将变量设置为系统变量, 从而实现多个文件调用同一个变量.
111
+ """
96
112
  try:
97
113
 
98
114
  # 变量名添加一个前缀, 防止和系统中其它变量名冲突
99
- variable_name = f'PYTHON_VARIABLE_{name}'
115
+ _variable_name = f'PYTHON_VARIABLE_{name}'
100
116
 
101
117
  if value is None:
102
- data = os.environ.get(variable_name)
103
- return json.loads(data)
104
118
 
105
- data = json.dumps(value)
106
- os.environ[variable_name] = data
119
+ _data = os.environ.get(_variable_name)
120
+
121
+ # 判断是否有数据
122
+ if _data:
123
+ try:
124
+ # 如果环境变量有值, 使用 json.loads() 解析
125
+ parsed_data = json.loads(_data)
126
+ return parsed_data
127
+ except json.JSONDecodeError:
128
+ return None
129
+ else:
130
+ return None
131
+
132
+ _data = json.dumps(value)
133
+ os.environ[_variable_name] = _data
107
134
 
108
135
  return value
109
136
 
@@ -121,10 +148,14 @@ def mam_of_numbers(
121
148
  dest_type: str | None = None,
122
149
  debug: bool = False
123
150
  ) -> tuple[int | float, int | float, int | float] | tuple[None, None, None]:
124
- """(maximum, average, minimum)"""
125
- # 返回一组数字中的 最大值(maximum), 平均值(average), 最小值(minimum)
126
- # numbers 数字列表 (仅支持 list 和 tuple, 不支 set)
127
- # dest_type 目标类型 (将数字列表中的数字转换成统一的类型)
151
+ """
152
+ (maximum, average, minimum)
153
+
154
+ 返回一组数字中的 最大值(maximum), 平均值(average), 最小值(minimum)
155
+ numbers 数字列表 (仅支持 list 和 tuple, 不支 set)
156
+ dest_type 目标类型 (将数字列表中的数字转换成统一的类型)
157
+ """
158
+
128
159
  try:
129
160
  _numbers = deepcopy(numbers)
130
161
  match True:
@@ -142,24 +173,31 @@ def mam_of_numbers(
142
173
  return None, None, None
143
174
 
144
175
 
176
+ # --------------------------------------------------------------------------------------------------
177
+
178
+
145
179
  def step_number_for_split_equally(
146
180
  integer: int,
147
181
  split_equally_number: int,
148
182
  debug: bool = False
149
183
  ) -> int | None:
150
- """step number for split equally"""
151
- # 平分数字的步长
152
- # integer 数字
153
- # split_equally_number 平分 integer 的数字
154
- #
155
- # 示例:
156
- #
157
- # [1, 2, 3, 4, 5, 6, 7, 8, 9]
158
- #
159
- # 分成 2 份 -> [[1, 2, 3, 4, 5], [6, 7, 8, 9]] -> 返回 5
160
- # 分成 3 份 -> [[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 返回 3
161
- # 分成 4 份 -> [[1, 2, 3], [4, 5], [6, 7], [8, 9]] -> 返回 3
162
- # 分成 5 份 -> [[1, 2], [3, 4], [5, 6], [7, 8], [9]] -> 返回 2
184
+ """
185
+ step number for split equally
186
+
187
+ 平分数字的步长
188
+
189
+ integer 数字
190
+ split_equally_number 平分 integer 的数字
191
+
192
+ 示例:
193
+
194
+ [1, 2, 3, 4, 5, 6, 7, 8, 9]
195
+
196
+ 分成 2 份 -> [[1, 2, 3, 4, 5], [6, 7, 8, 9]] -> 返回 5
197
+ 分成 3 份 -> [[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 返回 3
198
+ 分成 4 份 -> [[1, 2, 3], [4, 5], [6, 7], [8, 9]] -> 返回 3
199
+ 分成 5 份 -> [[1, 2], [3, 4], [5, 6], [7, 8], [9]] -> 返回 2
200
+ """
163
201
  try:
164
202
  if integer % split_equally_number == 0:
165
203
  return int(integer / split_equally_number)
@@ -170,6 +208,9 @@ def step_number_for_split_equally(
170
208
  return None
171
209
 
172
210
 
211
+ # --------------------------------------------------------------------------------------------------
212
+
213
+
173
214
  def division(
174
215
  dividend: int | float,
175
216
  divisor: int | float,
@@ -245,38 +286,47 @@ def check_file_type(
245
286
  file_object: str,
246
287
  file_type: str,
247
288
  debug: bool = False
248
- ) -> bool | None:
249
- """check file type"""
250
- # 检查文件类型
251
- # file_object 文件对象
252
- # file_type 文件类型
289
+ ) -> bool:
290
+ """
291
+ check file type
292
+
293
+ 检查文件类型
294
+
295
+ file_object 文件对象
296
+ file_type 文件类型
297
+ """
253
298
  try:
299
+
254
300
  _file_path = Path(file_object)
301
+
255
302
  match True:
256
303
  case True if _file_path.exists() is False:
257
- return False
304
+ result = False
258
305
  case True if file_type == 'absolute' and _file_path.is_absolute() is True:
259
- return True
306
+ result = True
260
307
  case True if file_type == 'block_device' and _file_path.is_block_device() is True:
261
- return True
308
+ result = True
262
309
  case True if file_type == 'dir' and _file_path.is_dir() is True:
263
- return True
310
+ result = True
264
311
  case True if file_type == 'fifo' and _file_path.is_fifo() is True:
265
- return True
312
+ result = True
266
313
  case True if file_type == 'file' and _file_path.is_file() is True:
267
- return True
314
+ result = True
268
315
  case True if file_type == 'mount' and _file_path.is_mount() is True:
269
- return True
316
+ result = True
270
317
  case True if file_type == 'relative_to' and _file_path.is_relative_to() is True:
271
- return True
318
+ result = True
272
319
  case True if file_type == 'reserved' and _file_path.is_reserved() is True:
273
- return True
320
+ result = True
274
321
  case True if file_type == 'socket' and _file_path.is_socket() is True:
275
- return True
322
+ result = True
276
323
  case True if file_type == 'symlink' and _file_path.is_symlink() is True:
277
- return True
324
+ result = True
278
325
  case _:
279
- return False
326
+ result = False
327
+
328
+ return result
329
+
280
330
  except Exception as e:
281
331
  if v_true(debug, bool):
282
332
  logger.exception(e)
@@ -370,11 +420,15 @@ def list_split(
370
420
 
371
421
  # 数据拷贝
372
422
  _data_object = deepcopy(data)
423
+
373
424
  # 数据长度
374
425
  _data_length = len(_data_object)
426
+
375
427
  # 数据平分后的结果
376
428
  _data_result = []
377
429
 
430
+ _step_number: Optional[int] = None
431
+
378
432
  if v_true(debug, bool):
379
433
  logger.info(f"data object: {_data_object}")
380
434
  logger.info(f"data length: {_data_length}")
@@ -392,7 +446,6 @@ def list_split(
392
446
 
393
447
  if equally is True:
394
448
 
395
- # 数据平分时, 每份数据的最大长度
396
449
  _step_number = step_number_for_split_equally(_data_length, number, debug=debug)
397
450
 
398
451
  if v_true(debug, bool):
@@ -415,15 +468,16 @@ def list_split(
415
468
  else:
416
469
 
417
470
  # 前一部分
418
- previous_end_number = (_data_length % number) * _step_number
419
- previous_index_number_list = list(range(0, previous_end_number, _step_number))
420
- for index_number in previous_index_number_list:
421
- _data_result.append(deepcopy(_data_object[index_number:index_number + _step_number]))
471
+ if _step_number is not None:
472
+ previous_end_number = (_data_length % number) * _step_number
473
+ previous_index_number_list = list(range(0, previous_end_number, _step_number))
474
+ for index_number in previous_index_number_list:
475
+ _data_result.append(deepcopy(_data_object[index_number:index_number + _step_number]))
422
476
 
423
- # 后一部分
424
- next_number_list = list(range(previous_end_number, _data_length, _step_number - 1))
425
- for index_number in next_number_list:
426
- _data_result.append(deepcopy(_data_object[index_number:index_number + (_step_number - 1)]))
477
+ # 后一部分
478
+ next_number_list = list(range(previous_end_number, _data_length, _step_number - 1))
479
+ for index_number in next_number_list:
480
+ _data_result.append(deepcopy(_data_object[index_number:index_number + (_step_number - 1)]))
427
481
 
428
482
  else:
429
483
 
@@ -444,13 +498,23 @@ def list_print_by_step(
444
498
  separator: str | None = None,
445
499
  debug: bool = False
446
500
  ) -> bool:
447
- """list print by step"""
448
- # 列表按照 步长 和 分隔符 有规律的输出
501
+ """
502
+ list print by step
503
+
504
+ 列表按照 步长 和 分隔符 有规律的输出
505
+ """
449
506
  try:
507
+
450
508
  _data_list = list_split(data, number, debug=debug)
509
+
510
+ if _data_list is None:
511
+ return False
512
+
451
513
  for _item in _data_list:
452
514
  print(*_item, sep=separator)
515
+
453
516
  return True
517
+
454
518
  except Exception as e:
455
519
  if v_true(debug, bool):
456
520
  logger.exception(e)
@@ -521,7 +585,7 @@ def list_to_csvfile(
521
585
  # CRLF replaced by LF
522
586
  # https://stackoverflow.com/a/29976091
523
587
  outcsv = csv.writer(_file, lineterminator=os.linesep, **kwargs)
524
- if v_true(fields, list):
588
+ if v_true(fields, list) and fields is not None:
525
589
  outcsv.writerow(fields)
526
590
  outcsv.writerows(data)
527
591
  return True
@@ -591,32 +655,35 @@ def dict_to_file(
591
655
  def dict_nested_update(
592
656
  data: dict,
593
657
  key: str,
594
- value: any,
658
+ value: Any,
595
659
  debug: bool = False
596
660
  ) -> bool:
597
661
  """dict nested update"""
598
662
  # dictionary nested update
599
663
  # https://stackoverflow.com/a/58885744
600
664
  try:
601
- if v_true(data, dict, debug=debug):
602
- for _k, _v in data.items():
603
- # callable() 判断是非为 function
604
- if (key is not None and key == _k) or (callable(key) is True and key() == _k):
605
- if callable(value) is True:
606
- data[_k] = value()
607
- else:
608
- data[_k] = value
609
- elif isinstance(_v, dict) is True:
610
- dict_nested_update(_v, key, value)
611
- elif isinstance(_v, list) is True:
612
- for _o in _v:
613
- if isinstance(_o, dict):
614
- dict_nested_update(_o, key, value)
615
- else:
616
- pass
617
- else:
665
+
666
+ if not v_true(data, dict, debug=debug):
618
667
  return False
668
+
669
+ for _k, _v in data.items():
670
+ # callable() 判断是非为 function
671
+ if (key is not None and key == _k) or (callable(key) is True and key == _k):
672
+ if callable(value) is True:
673
+ data[_k] = value()
674
+ else:
675
+ data[_k] = value
676
+ elif isinstance(_v, dict) is True:
677
+ dict_nested_update(_v, key, value)
678
+ elif isinstance(_v, list) is True:
679
+ for _o in _v:
680
+ if isinstance(_o, dict):
681
+ dict_nested_update(_o, key, value)
682
+ else:
683
+ pass
684
+
619
685
  return True
686
+
620
687
  except Exception as e:
621
688
  if v_true(debug, bool):
622
689
  logger.exception(e)
@@ -691,10 +758,10 @@ def filehash(
691
758
  file_hash = hashlib.sha3_384()
692
759
  case True if sha == 'sha3_512':
693
760
  file_hash = hashlib.sha3_512()
694
- case True if sha == 'shake_128':
695
- file_hash = hashlib.shake_128()
696
- case True if sha == 'shake_256':
697
- file_hash = hashlib.shake_256()
761
+ # case True if sha == 'shake_128':
762
+ # file_hash = hashlib.shake_128()
763
+ # case True if sha == 'shake_256':
764
+ # file_hash = hashlib.shake_256()
698
765
  case _:
699
766
  file_hash = hashlib.md5()
700
767
  # 建议设置为和 block size 相同的值, 多数系统默认为 4096, 可使用 stat 命令查看
@@ -966,7 +1033,7 @@ def datetime_local_to_timezone(
966
1033
 
967
1034
  def datetime_utc_to_timezone(
968
1035
  datetime_instance: datetime.datetime,
969
- tz: datetime.timezone = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo,
1036
+ tz: Any = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo,
970
1037
  debug: bool = False
971
1038
  ) -> datetime.datetime | None:
972
1039
  """
@@ -1140,7 +1207,7 @@ def json_sort(
1140
1207
  string: str,
1141
1208
  debug: bool = False,
1142
1209
  **kwargs
1143
- ) -> dict | None:
1210
+ ) -> str | None:
1144
1211
  """JSON Sort"""
1145
1212
  try:
1146
1213
  return json.dumps(json.loads(string), indent=4, sort_keys=True, **kwargs) if v_true(string, str, debug=debug) else None
@@ -1154,13 +1221,13 @@ def json_sort(
1154
1221
 
1155
1222
 
1156
1223
  def delete_files(
1157
- files: str | list,
1224
+ files: Union[str, List],
1158
1225
  debug: bool = False
1159
1226
  ) -> bool:
1160
1227
  """删除文件"""
1161
1228
  try:
1162
1229
 
1163
- if v_true(files, str, debug=debug) and check_file_type(files, 'file', debug=debug):
1230
+ if isinstance(files, str) and check_file_type(files, 'file', debug=debug):
1164
1231
 
1165
1232
  os.remove(files)
1166
1233
  if v_true(debug, bool):
@@ -1194,7 +1261,7 @@ def delete_files(
1194
1261
 
1195
1262
 
1196
1263
  def delete_directory(
1197
- directory: str | list,
1264
+ directory: Union[str, List],
1198
1265
  debug: bool = False
1199
1266
  ) -> bool:
1200
1267
  """
@@ -1222,7 +1289,7 @@ def delete_directory(
1222
1289
  """
1223
1290
  try:
1224
1291
 
1225
- if v_true(directory, str, debug=debug) and check_file_type(directory, 'dir', debug=debug):
1292
+ if isinstance(directory, str) and check_file_type(directory, 'dir', debug=debug):
1226
1293
 
1227
1294
  rmtree(directory)
1228
1295
 
@@ -1265,7 +1332,7 @@ def delete_directory(
1265
1332
 
1266
1333
  def process_pool(
1267
1334
  process_func: Callable,
1268
- process_data: any = None,
1335
+ process_data: Any = None,
1269
1336
  process_num: int = 2,
1270
1337
  thread: bool = False,
1271
1338
  debug: bool = False,
@@ -1289,6 +1356,9 @@ def process_pool(
1289
1356
  else:
1290
1357
  _data = list_split(process_data, process_num, equally=True, debug=debug)
1291
1358
 
1359
+ if _data is None:
1360
+ return False
1361
+
1292
1362
  if v_true(debug, bool):
1293
1363
  logger.info(f"data: {_data}")
1294
1364
 
@@ -1314,7 +1384,7 @@ def process_pool(
1314
1384
 
1315
1385
  def new_process(
1316
1386
  process_func: Callable,
1317
- process_data: any = None,
1387
+ process_data: Any = None,
1318
1388
  thread: bool = False,
1319
1389
  daemon: bool = True,
1320
1390
  debug: bool = False,
@@ -1409,17 +1479,24 @@ def change_directory(
1409
1479
  ) -> bool:
1410
1480
  """改变目录"""
1411
1481
  try:
1412
- directory = str(directory) if v_true(directory, str, debug=debug) else next
1482
+
1483
+ if not v_true(directory, str, debug=debug):
1484
+ return False
1485
+
1413
1486
  if v_true(debug, bool):
1414
1487
  logger.info(f"directory: {directory}")
1488
+
1415
1489
  if check_file_type(directory, 'dir', debug=debug):
1416
1490
  if v_true(debug, bool):
1417
1491
  logger.info(f"change directory to {directory}")
1418
1492
  os.chdir(directory)
1419
1493
  return True
1494
+
1420
1495
  if v_true(debug, bool):
1421
1496
  logger.error(f"no such directory: {directory}")
1497
+
1422
1498
  return False
1499
+
1423
1500
  except Exception as e:
1424
1501
  if v_true(debug, bool):
1425
1502
  logger.exception(e)
@@ -1430,12 +1507,12 @@ def change_directory(
1430
1507
 
1431
1508
 
1432
1509
  def load_toml_file(
1433
- file: str = None,
1510
+ file: str,
1434
1511
  debug: bool = False
1435
1512
  ) -> dict | None:
1436
1513
  """Load TOML file"""
1514
+ info = '解析配置文件'
1437
1515
  try:
1438
- info = '解析配置文件'
1439
1516
  if v_true(debug, bool):
1440
1517
  logger.info(f'{info}[执行]')
1441
1518
  with open(file, "rb") as _file:
@@ -1488,15 +1565,23 @@ def git_clone(
1488
1565
  stdout=subprocess.PIPE,
1489
1566
  stderr=subprocess.STDOUT
1490
1567
  )
1491
- result_code = result.returncode
1568
+
1569
+ if result is None:
1570
+ return False
1571
+
1572
+ result_code: int = result.returncode
1492
1573
  result_info = result.stdout.splitlines()
1574
+
1493
1575
  if v_true(debug, bool):
1494
1576
  logger.error(f'{log_prefix}unsuccessful')
1495
1577
  for i in result_info:
1496
1578
  logger.error(f'{log_prefix}{i}')
1579
+
1497
1580
  if result_code == 0:
1498
1581
  return True
1582
+
1499
1583
  return False
1584
+
1500
1585
  except Exception as e:
1501
1586
  if v_true(debug, bool):
1502
1587
  logger.error(f'{log_prefix}unsuccessful')
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.7.0
3
+ Version: 1.7.1
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
7
- Requires-Python: >=3.10
7
+ Requires-Python: >=3.11
8
8
  License-File: LICENSE
9
9
 
@@ -1,5 +1,5 @@
1
1
  ezKit/__init__.py,sha256=v6kh1vyXewSi_0PE0CMXrGz0aME4tISx_7BPXIKtZ9E,70
2
- ezKit/bottle.py,sha256=iJVdWAfpOi2ksPZlyZtALczPj9aqqcNXrSXSClUCJwc,151993
2
+ ezKit/bottle.py,sha256=0lLLrzgAWhPj47KOdyITIsPRNUFGuwovA3vRW47SpUs,180117
3
3
  ezKit/bottle_extensions.py,sha256=OQUwHNg4cbZ0UZXwT6FJjwl4uAg00_Q-Zpogt_xHElk,1088
4
4
  ezKit/cipher.py,sha256=SIQ1xDHMHudXSg_5vJ06_wDc6kFldLryezO8t_eaFqg,2845
5
5
  ezKit/database.py,sha256=imOeBSU6kCIrVHei485HEROnmsr5UZtCcqwHk0vDzwY,6741
@@ -12,11 +12,11 @@ ezKit/redis.py,sha256=pY4SPlcgQ7S8IeY2xoDpxy-xCZxzZQrQJNAoWRsC1dI,1773
12
12
  ezKit/reports.py,sha256=dBBggggCCLuk5YD6SjdUPuxTr3wiJojP3lA7dQfg6Pk,8898
13
13
  ezKit/sendemail.py,sha256=PItznLBcZ6Om8NU7rep69m3QNZ9YkmOovup7pPGyY58,4840
14
14
  ezKit/token.py,sha256=4L6A26KsxvB4WfF8R7SYiBmihJK0PiN5Oh7dgDVJtxU,1382
15
- ezKit/utils.py,sha256=5FB6s2SVcmWm3S_u4ADF7U6pjCr1ql4p7XA7xi3pUcg,46748
15
+ ezKit/utils.py,sha256=VkZzKy_jupr25Axa5I0juMsm1XiaimyiPoSITA91jcg,47826
16
16
  ezKit/xftp.py,sha256=qbCqFcGe22TDBSisj0Zoz78tnydDWoOfvywWpXdfaGw,6982
17
17
  ezKit/zabbix.py,sha256=soM5UEeYMfm7NczbPOVLirmHm3G20dECQ0aCBttZfhQ,28350
18
- ezKit-1.7.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
- ezKit-1.7.0.dist-info/METADATA,sha256=TSUVcXe-J1GkYU9A5J29eL4RsXJ-tQiBJkxFYTclpeQ,164
20
- ezKit-1.7.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
21
- ezKit-1.7.0.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
22
- ezKit-1.7.0.dist-info/RECORD,,
18
+ ezKit-1.7.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
+ ezKit-1.7.1.dist-info/METADATA,sha256=KibjySW6aXShA6YkITs9NwhdMG4LCijMTKcAu7-uT50,164
20
+ ezKit-1.7.1.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
21
+ ezKit-1.7.1.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
22
+ ezKit-1.7.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (75.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes