xtn-tools-pro 1.0.0.7.2__py3-none-any.whl → 1.0.0.7.4__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.
- xtn_tools_pro/task_pro/go_fun_v3.py +15 -11
- xtn_tools_pro/utils/file_utils.py +22 -0
- xtn_tools_pro/utils/log.py +3 -2
- xtn_tools_pro/utils/set_data.py +221 -0
- {xtn_tools_pro-1.0.0.7.2.dist-info → xtn_tools_pro-1.0.0.7.4.dist-info}/METADATA +2 -1
- {xtn_tools_pro-1.0.0.7.2.dist-info → xtn_tools_pro-1.0.0.7.4.dist-info}/RECORD +9 -8
- {xtn_tools_pro-1.0.0.7.2.dist-info → xtn_tools_pro-1.0.0.7.4.dist-info}/LICENSE +0 -0
- {xtn_tools_pro-1.0.0.7.2.dist-info → xtn_tools_pro-1.0.0.7.4.dist-info}/WHEEL +0 -0
- {xtn_tools_pro-1.0.0.7.2.dist-info → xtn_tools_pro-1.0.0.7.4.dist-info}/top_level.txt +0 -0
@@ -34,9 +34,11 @@ class GoFunTaskV3:
|
|
34
34
|
restart_time = ini_dict.get('restart_time', 0) # 间隔x秒强制重启
|
35
35
|
restart_time = 30 * 60 if restart_time <= 0 else restart_time # 间隔x秒强制重启时间不传默认60分钟
|
36
36
|
update_proxies_time = ini_dict.get('update_proxies_time', 0) # 间隔x秒更新代理
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
upload_task_time = ini_dict.get('upload_task_time', 0) # 回写间隔
|
38
|
+
download_not_task_time = ini_dict.get('download_not_task_time', 0) # 当遇到下载任务接口返回空任务时,间隔x秒再继续请求,默认2秒
|
39
|
+
download_not_task_time = 2 if download_not_task_time <= 0 else download_not_task_time # 当遇到下载任务接口返回空任务时,间隔x秒再继续请求,默认2秒
|
40
|
+
|
41
|
+
# 默认进程数和线程数
|
40
42
|
processes_num = 1 if processes_num <= 0 else processes_num
|
41
43
|
thread_num = 1 if thread_num <= 0 else thread_num
|
42
44
|
|
@@ -62,18 +64,18 @@ class GoFunTaskV3:
|
|
62
64
|
"thread_num": int(thread_num),
|
63
65
|
"restart_time": int(restart_time),
|
64
66
|
"update_proxies_time": int(update_proxies_time),
|
65
|
-
"
|
67
|
+
"upload_task_time": int(upload_task_time),
|
66
68
|
"download_url": download_url, # 获取任务地址
|
67
69
|
"upload_url": upload_url, # 回写任务地址
|
68
70
|
"update_proxy_url": update_proxy_url, # 更新代理地址
|
69
71
|
"external_ip": external_ip,
|
70
|
-
"
|
72
|
+
"download_not_task_time": download_not_task_time,
|
71
73
|
}
|
72
74
|
|
73
75
|
logger.debug(
|
74
76
|
f"\n无敌框架来咯~~~当前设置配置如下:"
|
75
77
|
f"\n\t功能函数重启间隔:{restart_time};进程数:{processes_num};线程数:{thread_num}"
|
76
|
-
f"\n\t代理更新间隔:{update_proxies_time};回写间隔{
|
78
|
+
f"\n\t代理更新间隔:{update_proxies_time};回写间隔{upload_task_time};\n"
|
77
79
|
)
|
78
80
|
|
79
81
|
# 共享任务队列
|
@@ -173,6 +175,7 @@ class GoFunTaskV3:
|
|
173
175
|
download_url = ini_info["download_url"]
|
174
176
|
auto = ini_info["auto"]
|
175
177
|
task = ini_info["task"]
|
178
|
+
download_not_task_time = ini_info["download_not_task_time"]
|
176
179
|
headers = {"Authorization": auto}
|
177
180
|
params = {"taskType": task}
|
178
181
|
|
@@ -182,7 +185,7 @@ class GoFunTaskV3:
|
|
182
185
|
qsize = download_queue.qsize()
|
183
186
|
logger.info(f"当前队列剩余任务数:{qsize}")
|
184
187
|
if qsize >= 10:
|
185
|
-
time.sleep(
|
188
|
+
time.sleep(download_not_task_time)
|
186
189
|
continue
|
187
190
|
resp = requests.get(download_url, headers=headers, params=params, timeout=5)
|
188
191
|
json_data = resp.json()
|
@@ -218,7 +221,7 @@ class GoFunTaskV3:
|
|
218
221
|
external_ip = ini_info["external_ip"]
|
219
222
|
auto = ini_info["auto"]
|
220
223
|
task = ini_info["task"]
|
221
|
-
|
224
|
+
upload_task_time = ini_info["upload_task_time"]
|
222
225
|
headers = {"Authorization": auto}
|
223
226
|
params = {"taskType": task}
|
224
227
|
while True:
|
@@ -245,7 +248,8 @@ class GoFunTaskV3:
|
|
245
248
|
}
|
246
249
|
result_list.append(task_item)
|
247
250
|
except Exception as e:
|
248
|
-
|
251
|
+
pass
|
252
|
+
# logger.critical(f"循环全部获取队列的任务{e}")
|
249
253
|
|
250
254
|
# 回写任务
|
251
255
|
data = {"result": result_list, "remoteAddr": external_ip}
|
@@ -260,10 +264,10 @@ class GoFunTaskV3:
|
|
260
264
|
logger.critical(f"回写异常,{len(result_list)},{e}")
|
261
265
|
time.sleep(2)
|
262
266
|
|
263
|
-
if not
|
267
|
+
if not upload_task_time:
|
264
268
|
# 一直执行 不退出
|
265
269
|
continue
|
266
|
-
time.sleep(
|
270
|
+
time.sleep(upload_task_time)
|
267
271
|
|
268
272
|
def __update_proxy(self, proxies_dict, manager_info, ini_info, logger):
|
269
273
|
"""
|
@@ -58,6 +58,28 @@ def check_file_exists(file_path):
|
|
58
58
|
return False
|
59
59
|
|
60
60
|
|
61
|
+
def is_dir(dir_path):
|
62
|
+
"""
|
63
|
+
传入文件夹判断是否为文件夹或文件夹是否存在
|
64
|
+
传入的如果是文件路径则返回False
|
65
|
+
传入的如果是一个不存在的文件夹则返回False
|
66
|
+
:param dir_path:
|
67
|
+
:return:
|
68
|
+
"""
|
69
|
+
if not os.path.isdir(dir_path):
|
70
|
+
return False
|
71
|
+
return True
|
72
|
+
|
73
|
+
|
74
|
+
def get_listdir(dir_path):
|
75
|
+
"""
|
76
|
+
获取指定文件夹下的所有文件
|
77
|
+
:param dir_path:
|
78
|
+
:return:
|
79
|
+
"""
|
80
|
+
return os.listdir(dir_path)
|
81
|
+
|
82
|
+
|
61
83
|
if __name__ == '__main__':
|
62
84
|
pass
|
63
85
|
print(get_file_extension('file/2024-04-19/BOSCH GEX 125-1A/125-1AE砂磨机操作说明书:[1]_jingyan.txt'))
|
xtn_tools_pro/utils/log.py
CHANGED
@@ -78,7 +78,7 @@ class Log:
|
|
78
78
|
is_write_to_file=False,
|
79
79
|
color=True,
|
80
80
|
mode='a',
|
81
|
-
max_bytes=1024000000,
|
81
|
+
max_bytes=1024000000, # 1 * 1024 * 1024 * 1024
|
82
82
|
backup_count=0,
|
83
83
|
encoding="utf-8",
|
84
84
|
save_time_log_path=None):
|
@@ -107,7 +107,8 @@ class Log:
|
|
107
107
|
# 记录日志文件的路径模板,用于之后创建新的日志文件
|
108
108
|
self.path_template = self.path_template = f"{save_time_log_path}/{{date}}/{name}.log"
|
109
109
|
path = self.path_template.format(date=self.current_date)
|
110
|
-
|
110
|
+
if is_write_to_file:
|
111
|
+
mkdirs_dir(self.path_template.format(date=self.current_date))
|
111
112
|
|
112
113
|
# 创建日志格式化器
|
113
114
|
# formatter = logging.Formatter('[%(now_datestr)s] [%(levelname)s] [%(func_name)s] - %(message)s') # 原
|
@@ -0,0 +1,221 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
# 说明
|
5
|
+
# 大文件去重
|
6
|
+
# History:
|
7
|
+
# Date Author Version Modification
|
8
|
+
# --------------------------------------------------------------------------------------------------
|
9
|
+
# 2025/3/11 xiatn V00.01.000 新建
|
10
|
+
# --------------------------------------------------------------------------------------------------
|
11
|
+
import os
|
12
|
+
import fnmatch
|
13
|
+
import hashlib
|
14
|
+
from tqdm import tqdm
|
15
|
+
from xtn_tools_pro.utils.log import Log
|
16
|
+
from xtn_tools_pro.utils.helpers import get_orderId_random
|
17
|
+
from xtn_tools_pro.utils.file_utils import mkdirs_dir, get_file_extension, is_dir, get_listdir
|
18
|
+
|
19
|
+
|
20
|
+
class PSetDataObj:
|
21
|
+
def __init__(self):
|
22
|
+
# 随机生成一个临时文件夹
|
23
|
+
self.__order_id = get_orderId_random()
|
24
|
+
temp_dir_name = f"temp_{self.__order_id}\\"
|
25
|
+
now_current_working_dir = os.getcwd()
|
26
|
+
self.__now_current_working_dir = os.path.join(now_current_working_dir, temp_dir_name)
|
27
|
+
mkdirs_dir(self.__now_current_working_dir)
|
28
|
+
|
29
|
+
self.__logger = Log('set_data', './xxx.log', log_level='DEBUG', is_write_to_console=True,
|
30
|
+
is_write_to_file=False,
|
31
|
+
color=True, mode='a', save_time_log_path='./logs')
|
32
|
+
|
33
|
+
def set_file_data_air(self, set_file_path, num_shards=1000):
|
34
|
+
"""
|
35
|
+
对单个文件去重,air版本,不对文件做任何修改,去重任何数据
|
36
|
+
:param set_file_path:单文件路径
|
37
|
+
:param num_shards:临时文件切片,推荐:数据越大值越大 1000
|
38
|
+
:return:
|
39
|
+
"""
|
40
|
+
if get_file_extension(set_file_path) != ".txt":
|
41
|
+
self.__logger.critical("文件不合法,只接受.txt文件")
|
42
|
+
return
|
43
|
+
self.__logger.info("正在读取文件总行数...")
|
44
|
+
|
45
|
+
with open(set_file_path, "r", encoding="utf-8") as fp_r:
|
46
|
+
line_count = sum(1 for _ in fp_r)
|
47
|
+
self.__logger.info(f"读取文件完成,总行数为:{line_count}")
|
48
|
+
|
49
|
+
num_shards = 3000 if num_shards >= 3000 else num_shards
|
50
|
+
num_shards = 3000 if line_count >= 30000000 else num_shards
|
51
|
+
num_shards = 1000 if num_shards <= 1 else num_shards
|
52
|
+
|
53
|
+
shard_file_obj_list = []
|
54
|
+
shard_path_list = []
|
55
|
+
for _ in range(num_shards):
|
56
|
+
shard_path = f"{os.path.join(self.__now_current_working_dir, f'{self.__order_id}_shard_{_}.tmp')}"
|
57
|
+
shard_path_list.append(shard_path)
|
58
|
+
shard_file_obj_list.append(open(shard_path, "w", encoding="utf-8"))
|
59
|
+
|
60
|
+
with open(set_file_path, "r", encoding="utf-8") as f_r:
|
61
|
+
tqdm_f = tqdm(f_r, total=line_count, desc="正在去重(1/2)",
|
62
|
+
bar_format="{l_bar}{bar}|{n}/{total} [预计完成时间:{remaining}]")
|
63
|
+
for line_i in tqdm_f:
|
64
|
+
line = line_i.strip().encode()
|
65
|
+
line_hash = hashlib.md5(line).hexdigest()
|
66
|
+
shard_id = int(line_hash, 16) % num_shards
|
67
|
+
shard_file_obj_list[shard_id].write(line_i)
|
68
|
+
|
69
|
+
for shard_file_obj in shard_file_obj_list:
|
70
|
+
shard_file_obj.close()
|
71
|
+
|
72
|
+
result_w_path = os.path.join(self.__now_current_working_dir, "000_去重结果.txt")
|
73
|
+
tqdm_f = tqdm(shard_path_list, total=len(shard_path_list), desc="正在去重(2/2)",
|
74
|
+
bar_format="{l_bar}{bar}|{n}/{total} [预计完成时间:{remaining}]")
|
75
|
+
with open(result_w_path, "w", encoding="utf-8") as f_w:
|
76
|
+
for shard_path in tqdm_f:
|
77
|
+
with open(shard_path, "r", encoding="utf-8") as f_r:
|
78
|
+
seen_list = []
|
79
|
+
for line_i in f_r.readlines():
|
80
|
+
line = line_i.strip()
|
81
|
+
seen_list.append(line)
|
82
|
+
seen_list = list(set(seen_list))
|
83
|
+
w_txt = "\n".join(seen_list)
|
84
|
+
f_w.write(w_txt + "\n")
|
85
|
+
os.remove(shard_path) # 删除临时文件
|
86
|
+
|
87
|
+
with open(result_w_path, "r", encoding="utf-8") as fp_r:
|
88
|
+
line_count = sum(1 for _ in fp_r)
|
89
|
+
self.__logger.info(f"文件处理完毕,去重后总行数为:{line_count},结果路径:{result_w_path}")
|
90
|
+
|
91
|
+
def set_file_data_pro(self, set_file_dir_path, num_shards=3000):
|
92
|
+
"""
|
93
|
+
对文件夹下的所有txt文件去重,pro版本,不对文件做任何修改,去重任何数据
|
94
|
+
:param set_file_dir_path:文件夹路径
|
95
|
+
:param num_shards:临时文件切片,推荐:数据越大值越大 1000
|
96
|
+
:return:
|
97
|
+
"""
|
98
|
+
if not is_dir(set_file_dir_path):
|
99
|
+
self.__logger.critical("文件夹不存在或不合法")
|
100
|
+
return
|
101
|
+
|
102
|
+
self.__logger.info("正在统计文件可去重数量...")
|
103
|
+
set_file_path_list = []
|
104
|
+
for set_file_name in get_listdir(set_file_dir_path):
|
105
|
+
if fnmatch.fnmatch(set_file_name, '*.txt'):
|
106
|
+
set_file_path_list.append(os.path.join(set_file_dir_path, set_file_name))
|
107
|
+
self.__logger.info(f"当前文件夹下可去重文件数量为:{len(set_file_path_list)}")
|
108
|
+
|
109
|
+
num_shards = 3000 if num_shards >= 3000 else num_shards
|
110
|
+
num_shards = 1000 if num_shards <= 1000 else num_shards
|
111
|
+
|
112
|
+
shard_file_obj_list = []
|
113
|
+
shard_path_list = []
|
114
|
+
for _ in range(num_shards):
|
115
|
+
shard_path = f"{os.path.join(self.__now_current_working_dir, f'{self.__order_id}_shard_{_}.tmp')}"
|
116
|
+
shard_path_list.append(shard_path)
|
117
|
+
shard_file_obj_list.append(open(shard_path, "w", encoding="utf-8"))
|
118
|
+
|
119
|
+
for _ in range(len(set_file_path_list)):
|
120
|
+
set_file_path = set_file_path_list[_]
|
121
|
+
with open(set_file_path, "r", encoding="utf-8") as fp_r:
|
122
|
+
line_count = sum(1 for _ in fp_r)
|
123
|
+
# self.__logger.info(f"{set_file_path}读取完成,总行数为:{line_count}")
|
124
|
+
|
125
|
+
with open(set_file_path, "r", encoding="utf-8") as f_r:
|
126
|
+
tqdm_f = tqdm(f_r, total=line_count, desc=f"正在去重({_ + 1}/{len(set_file_path_list) + 1})",
|
127
|
+
bar_format="{l_bar}{bar}|{n}/{total} [预计完成时间:{remaining}]")
|
128
|
+
for line_i in tqdm_f:
|
129
|
+
line = line_i.strip().encode()
|
130
|
+
line_hash = hashlib.md5(line).hexdigest()
|
131
|
+
shard_id = int(line_hash, 16) % num_shards
|
132
|
+
shard_file_obj_list[shard_id].write(line_i)
|
133
|
+
|
134
|
+
for shard_file_obj in shard_file_obj_list:
|
135
|
+
shard_file_obj.close()
|
136
|
+
|
137
|
+
result_w_path = os.path.join(self.__now_current_working_dir, "000_去重结果.txt")
|
138
|
+
tqdm_f = tqdm(shard_path_list, total=len(shard_path_list),
|
139
|
+
desc=f"正在去重({len(set_file_path_list) + 1}/{len(set_file_path_list) + 1})",
|
140
|
+
bar_format="{l_bar}{bar}|{n}/{total} [预计完成时间:{remaining}]")
|
141
|
+
with open(result_w_path, "w", encoding="utf-8") as f_w:
|
142
|
+
for shard_path in tqdm_f:
|
143
|
+
with open(shard_path, "r", encoding="utf-8") as f_r:
|
144
|
+
seen_list = []
|
145
|
+
for line_i in f_r.readlines():
|
146
|
+
line = line_i.strip()
|
147
|
+
seen_list.append(line)
|
148
|
+
seen_list = list(set(seen_list))
|
149
|
+
w_txt = "\n".join(seen_list)
|
150
|
+
f_w.write(w_txt + "\n")
|
151
|
+
os.remove(shard_path) # 删除临时文件
|
152
|
+
|
153
|
+
with open(result_w_path, "r", encoding="utf-8") as fp_r:
|
154
|
+
line_count = sum(1 for _ in fp_r)
|
155
|
+
self.__logger.info(f"文件处理完毕,去重后总行数为:{line_count},结果路径:{result_w_path}")
|
156
|
+
|
157
|
+
def merging_data(self, file_dir_path, merging_new_file_name="合并"):
|
158
|
+
"""
|
159
|
+
传入一个文件夹,合并这个文件夹下所有.txt的数据
|
160
|
+
:param file_dir_path: 文件夹
|
161
|
+
:param merging_new_file_name: 新的输出位置
|
162
|
+
:return:
|
163
|
+
"""
|
164
|
+
if not is_dir(file_dir_path):
|
165
|
+
self.__logger.critical("文件夹不存在或不合法")
|
166
|
+
return
|
167
|
+
|
168
|
+
self.__logger.info("正在统计文件可合并数量...")
|
169
|
+
file_path_list = []
|
170
|
+
for set_file_name in get_listdir(file_dir_path):
|
171
|
+
if fnmatch.fnmatch(set_file_name, '*.txt'):
|
172
|
+
if set_file_name == f"{merging_new_file_name}.txt": continue
|
173
|
+
file_path_list.append(os.path.join(file_dir_path, set_file_name))
|
174
|
+
self.__logger.info(f"当前文件夹下可合并文件数量为:{len(file_path_list)}")
|
175
|
+
|
176
|
+
result_w_path = os.path.join(file_dir_path, f"{merging_new_file_name}.txt")
|
177
|
+
|
178
|
+
with open(result_w_path, "w", encoding="utf-8") as f_w:
|
179
|
+
for _ in range(len(file_path_list)):
|
180
|
+
file_path = file_path_list[_]
|
181
|
+
with open(file_path, "r", encoding="utf-8") as fp_r:
|
182
|
+
line_count = sum(1 for _ in fp_r)
|
183
|
+
|
184
|
+
with open(file_path, "r", encoding="utf-8") as f_r:
|
185
|
+
tqdm_f = tqdm(f_r, total=line_count,
|
186
|
+
desc=f"正在合并({_ + 1}/{len(file_path_list)})",
|
187
|
+
bar_format="{l_bar}{bar}|{n}/{total} [预计完成时间:{remaining}]")
|
188
|
+
for line_i in tqdm_f:
|
189
|
+
line = line_i.strip()
|
190
|
+
f_w.write(line + "\n")
|
191
|
+
|
192
|
+
def split_data(self, file_path, split_new_file_name="分割", file_index=1, file_max_line=1000000):
|
193
|
+
if get_file_extension(file_path) != ".txt":
|
194
|
+
self.__logger.critical("文件不合法,只接受.txt文件")
|
195
|
+
return
|
196
|
+
self.__logger.info("正在读取文件总行数...")
|
197
|
+
|
198
|
+
with open(file_path, "r", encoding="utf-8") as fp_r:
|
199
|
+
line_count = sum(1 for _ in fp_r)
|
200
|
+
self.__logger.info(f"读取文件完成,总行数为:{line_count}")
|
201
|
+
|
202
|
+
with open(file_path, "r", encoding="utf-8") as f_r:
|
203
|
+
tqdm_f = tqdm(f_r, total=line_count, desc="正在分割(1/1)",
|
204
|
+
bar_format="{l_bar}{bar}|{n}/{total} [预计完成时间:{remaining}]")
|
205
|
+
temp_line_list = []
|
206
|
+
parent_path = os.path.dirname(file_path)
|
207
|
+
for line_i in tqdm_f:
|
208
|
+
line = line_i.strip()
|
209
|
+
temp_line_list.append(line)
|
210
|
+
if len(temp_line_list) == file_max_line:
|
211
|
+
result_w_path = os.path.join(parent_path, f"{split_new_file_name}_{file_index}.txt")
|
212
|
+
self.__list_to_write_file(result_w_path, temp_line_list)
|
213
|
+
temp_line_list = []
|
214
|
+
file_index += 1
|
215
|
+
if temp_line_list:
|
216
|
+
result_w_path = os.path.join(parent_path, f"{split_new_file_name}_{file_index}.txt")
|
217
|
+
self.__list_to_write_file(result_w_path, temp_line_list)
|
218
|
+
|
219
|
+
def __list_to_write_file(self, file_w_path, data_list):
|
220
|
+
with open(file_w_path, "w", encoding="utf-8") as result_w_f:
|
221
|
+
result_w_f.write("\n".join(data_list))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: xtn-tools-pro
|
3
|
-
Version: 1.0.0.7.
|
3
|
+
Version: 1.0.0.7.4
|
4
4
|
Summary: xtn 开发工具
|
5
5
|
Author: xtn
|
6
6
|
Author-email: czw011122@gmail.com
|
@@ -16,5 +16,6 @@ Requires-Dist: colorlog
|
|
16
16
|
Requires-Dist: requests
|
17
17
|
Requires-Dist: Faker
|
18
18
|
Requires-Dist: PyJWT
|
19
|
+
Requires-Dist: tqdm
|
19
20
|
|
20
21
|
xtnkk-tools
|
@@ -12,17 +12,18 @@ xtn_tools_pro/proxy/proxy.py,sha256=No6E1pFY5yx2F4976pXPrLtq-QEVp79KupzcufjSN58,
|
|
12
12
|
xtn_tools_pro/task_pro/__init__.py,sha256=nK3U47hWwE1H875ieEToH9r-jzXHS-PXk8cDstOvRE8,418
|
13
13
|
xtn_tools_pro/task_pro/go_fun.py,sha256=hWEt2uJ9FCvJH7PhVZttS-11A7J6zbRKwX7c5YLYQag,19144
|
14
14
|
xtn_tools_pro/task_pro/go_fun_v2.py,sha256=SgcXgtEBGSVL1V2LyqO0z8Md2H8JZxucYrLLIwqtiLM,18489
|
15
|
-
xtn_tools_pro/task_pro/go_fun_v3.py,sha256=
|
15
|
+
xtn_tools_pro/task_pro/go_fun_v3.py,sha256=J8jJLRckbbk4AaHsxUSQ_NKTCIcf71hcPFTDKtJzYD4,16168
|
16
16
|
xtn_tools_pro/utils/__init__.py,sha256=I1_n_NP23F2lBqlF4EOlnOdLYxM8M4pbn63UhJN1hRE,418
|
17
17
|
xtn_tools_pro/utils/crypto.py,sha256=oyzFqWum_oimUtzhfVCELQhdMjxDbLu-nOWfcNmazcc,4087
|
18
|
-
xtn_tools_pro/utils/file_utils.py,sha256=
|
18
|
+
xtn_tools_pro/utils/file_utils.py,sha256=obaBP7CaBCsXxzqGeWzV2l0yw7vicgKOaXzmpMV8ips,2567
|
19
19
|
xtn_tools_pro/utils/helpers.py,sha256=H-a3gnahIah3kJqyKzzKlPWtVQYcFlJncz2rAfBqIiw,4444
|
20
|
-
xtn_tools_pro/utils/log.py,sha256=
|
20
|
+
xtn_tools_pro/utils/log.py,sha256=mf5huJDA8xVxxFWPG_tl_vOsAA2_ywGDFycYSGHIDCo,10202
|
21
21
|
xtn_tools_pro/utils/retry.py,sha256=0wjHsR5DBBKpv4naMfxiky8kprrZes4WURIfFQ4H708,1657
|
22
|
+
xtn_tools_pro/utils/set_data.py,sha256=IthfAclck7AbaxOIKOgJZ2wdcfEmlvC-C63Tywcr4bA,11180
|
22
23
|
xtn_tools_pro/utils/sql.py,sha256=EAKzbkZP7Q09j15Gm6o0_uq0qgQmcCQT6EAawbpp4v0,6263
|
23
24
|
xtn_tools_pro/utils/time_utils.py,sha256=TUtzG61PeVYXhaQd6pBrXAdlz7tBispNIRQRcGhE2No,4859
|
24
|
-
xtn_tools_pro-1.0.0.7.
|
25
|
-
xtn_tools_pro-1.0.0.7.
|
26
|
-
xtn_tools_pro-1.0.0.7.
|
27
|
-
xtn_tools_pro-1.0.0.7.
|
28
|
-
xtn_tools_pro-1.0.0.7.
|
25
|
+
xtn_tools_pro-1.0.0.7.4.dist-info/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
+
xtn_tools_pro-1.0.0.7.4.dist-info/METADATA,sha256=gwssgHhEwWGdiJBfIaTSKm6fDbZYU1AqPYJjTFm8EtE,498
|
27
|
+
xtn_tools_pro-1.0.0.7.4.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
28
|
+
xtn_tools_pro-1.0.0.7.4.dist-info/top_level.txt,sha256=jyB3FLDEr8zE1U7wHczTgIbvUpALhR-ULF7RVEO7O2U,14
|
29
|
+
xtn_tools_pro-1.0.0.7.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|