ezKit 1.7.0__py3-none-any.whl → 1.7.2__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/bottle.py +1949 -1083
- ezKit/sendemail.py +186 -64
- ezKit/utils.py +196 -111
- {ezKit-1.7.0.dist-info → ezKit-1.7.2.dist-info}/METADATA +2 -3
- {ezKit-1.7.0.dist-info → ezKit-1.7.2.dist-info}/RECORD +8 -8
- {ezKit-1.7.0.dist-info → ezKit-1.7.2.dist-info}/WHEEL +1 -1
- {ezKit-1.7.0.dist-info → ezKit-1.7.2.dist-info}/LICENSE +0 -0
- {ezKit-1.7.0.dist-info → ezKit-1.7.2.dist-info}/top_level.txt +0 -0
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:
|
36
|
-
v_type:
|
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
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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:
|
102
|
+
value: Any = None,
|
91
103
|
debug: bool = False
|
92
|
-
) ->
|
93
|
-
"""
|
94
|
-
|
95
|
-
|
104
|
+
) -> Any:
|
105
|
+
"""
|
106
|
+
系统变量
|
107
|
+
|
108
|
+
伪全局变量
|
109
|
+
Python 没有全局变量, 多个文件无法调用同一个变量.
|
110
|
+
为了解决这个问题, 将变量设置为系统变量, 从而实现多个文件调用同一个变量.
|
111
|
+
"""
|
96
112
|
try:
|
97
113
|
|
98
114
|
# 变量名添加一个前缀, 防止和系统中其它变量名冲突
|
99
|
-
|
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
|
-
|
106
|
-
|
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
|
-
"""
|
125
|
-
|
126
|
-
|
127
|
-
|
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
|
-
"""
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
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
|
249
|
-
"""
|
250
|
-
|
251
|
-
|
252
|
-
|
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
|
-
|
304
|
+
result = False
|
258
305
|
case True if file_type == 'absolute' and _file_path.is_absolute() is True:
|
259
|
-
|
306
|
+
result = True
|
260
307
|
case True if file_type == 'block_device' and _file_path.is_block_device() is True:
|
261
|
-
|
308
|
+
result = True
|
262
309
|
case True if file_type == 'dir' and _file_path.is_dir() is True:
|
263
|
-
|
310
|
+
result = True
|
264
311
|
case True if file_type == 'fifo' and _file_path.is_fifo() is True:
|
265
|
-
|
312
|
+
result = True
|
266
313
|
case True if file_type == 'file' and _file_path.is_file() is True:
|
267
|
-
|
314
|
+
result = True
|
268
315
|
case True if file_type == 'mount' and _file_path.is_mount() is True:
|
269
|
-
|
316
|
+
result = True
|
270
317
|
case True if file_type == 'relative_to' and _file_path.is_relative_to() is True:
|
271
|
-
|
318
|
+
result = True
|
272
319
|
case True if file_type == 'reserved' and _file_path.is_reserved() is True:
|
273
|
-
|
320
|
+
result = True
|
274
321
|
case True if file_type == 'socket' and _file_path.is_socket() is True:
|
275
|
-
|
322
|
+
result = True
|
276
323
|
case True if file_type == 'symlink' and _file_path.is_symlink() is True:
|
277
|
-
|
324
|
+
result = True
|
278
325
|
case _:
|
279
|
-
|
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
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
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
|
-
|
425
|
-
|
426
|
-
|
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
|
-
"""
|
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:
|
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
|
-
|
602
|
-
|
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
|
-
|
696
|
-
case True if sha == 'shake_256':
|
697
|
-
|
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:
|
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
|
-
) ->
|
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
|
1224
|
+
files: Union[str, List],
|
1158
1225
|
debug: bool = False
|
1159
1226
|
) -> bool:
|
1160
1227
|
"""删除文件"""
|
1161
1228
|
try:
|
1162
1229
|
|
1163
|
-
if
|
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
|
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
|
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:
|
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:
|
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
|
-
|
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
|
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
|
-
|
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,5 +1,5 @@
|
|
1
1
|
ezKit/__init__.py,sha256=v6kh1vyXewSi_0PE0CMXrGz0aME4tISx_7BPXIKtZ9E,70
|
2
|
-
ezKit/bottle.py,sha256=
|
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
|
@@ -10,13 +10,13 @@ ezKit/plots.py,sha256=QUtoVfZ49ZSNcY8gcQ2TYVkMjDDzoW-myMtqTi5WN2U,5322
|
|
10
10
|
ezKit/qywx.py,sha256=7eWrlTLrUj6U6cViEGbT6_LQxFGVqkhGAefBSS6T_-0,6531
|
11
11
|
ezKit/redis.py,sha256=pY4SPlcgQ7S8IeY2xoDpxy-xCZxzZQrQJNAoWRsC1dI,1773
|
12
12
|
ezKit/reports.py,sha256=dBBggggCCLuk5YD6SjdUPuxTr3wiJojP3lA7dQfg6Pk,8898
|
13
|
-
ezKit/sendemail.py,sha256=
|
13
|
+
ezKit/sendemail.py,sha256=AAdxBvEYN_AJVvBkSAvXzhXC5jkbRsD_8P51h2SdTRw,8413
|
14
14
|
ezKit/token.py,sha256=4L6A26KsxvB4WfF8R7SYiBmihJK0PiN5Oh7dgDVJtxU,1382
|
15
|
-
ezKit/utils.py,sha256=
|
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.
|
19
|
-
ezKit-1.7.
|
20
|
-
ezKit-1.7.
|
21
|
-
ezKit-1.7.
|
22
|
-
ezKit-1.7.
|
18
|
+
ezKit-1.7.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
19
|
+
ezKit-1.7.2.dist-info/METADATA,sha256=9UQXveHgueN-AAoB54mCK8fgexmupSvLrO7UoCWbOMo,163
|
20
|
+
ezKit-1.7.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
21
|
+
ezKit-1.7.2.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
|
22
|
+
ezKit-1.7.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|