ErisPulse 2.1.3__py3-none-any.whl → 2.1.5__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.
- ErisPulse/Core/__init__.py +2 -0
- ErisPulse/Core/env.py +2 -15
- ErisPulse/Core/logger.py +1 -3
- ErisPulse/Core/raiserr.py +55 -31
- ErisPulse/Core/util.py +1 -4
- ErisPulse/__init__.py +2 -14
- ErisPulse/__main__.py +4 -2
- {erispulse-2.1.3.dist-info → erispulse-2.1.5.dist-info}/METADATA +1 -1
- erispulse-2.1.5.dist-info/RECORD +16 -0
- erispulse-2.1.3.dist-info/RECORD +0 -16
- {erispulse-2.1.3.dist-info → erispulse-2.1.5.dist-info}/WHEEL +0 -0
- {erispulse-2.1.3.dist-info → erispulse-2.1.5.dist-info}/entry_points.txt +0 -0
- {erispulse-2.1.3.dist-info → erispulse-2.1.5.dist-info}/licenses/LICENSE +0 -0
ErisPulse/Core/__init__.py
CHANGED
ErisPulse/Core/env.py
CHANGED
|
@@ -21,7 +21,6 @@ from pathlib import Path
|
|
|
21
21
|
from datetime import datetime
|
|
22
22
|
from functools import lru_cache
|
|
23
23
|
from typing import List, Dict, Optional, Any, Set, Tuple, Union, Type, FrozenSet
|
|
24
|
-
from .raiserr import raiserr
|
|
25
24
|
|
|
26
25
|
class EnvManager:
|
|
27
26
|
"""
|
|
@@ -370,22 +369,10 @@ class EnvManager:
|
|
|
370
369
|
try:
|
|
371
370
|
time_diff = current_time - self._last_snapshot_time
|
|
372
371
|
if not isinstance(time_diff, (int, float)):
|
|
373
|
-
|
|
374
|
-
"ErisPulseEnvTimeDiffTypeError",
|
|
375
|
-
doc = "时间差应为数值类型",
|
|
376
|
-
)
|
|
377
|
-
raiserr.ErisPulseEnvTimeDiffTypeError(
|
|
378
|
-
f"时间差应为数值类型,实际为: {type(time_diff)}"
|
|
379
|
-
)
|
|
372
|
+
raise ValueError("时间差应为数值类型")
|
|
380
373
|
|
|
381
374
|
if not isinstance(self._snapshot_interval, (int, float)):
|
|
382
|
-
|
|
383
|
-
"ErisPulseEnvSnapshotIntervalTypeError",
|
|
384
|
-
doc = "快照间隔应为数值类型",
|
|
385
|
-
)
|
|
386
|
-
raiserr.ErisPulseEnvSnapshotIntervalTypeError(
|
|
387
|
-
f"快照间隔应为数值类型,实际为: {type(self._snapshot_interval)}"
|
|
388
|
-
)
|
|
375
|
+
raise ValueError("快照间隔应为数值类型")
|
|
389
376
|
|
|
390
377
|
if time_diff > self._snapshot_interval:
|
|
391
378
|
self._last_snapshot_time = current_time
|
ErisPulse/Core/logger.py
CHANGED
|
@@ -189,8 +189,6 @@ class Logger:
|
|
|
189
189
|
if self._get_effective_level(caller_module) <= logging.CRITICAL:
|
|
190
190
|
self._save_in_memory(caller_module, msg)
|
|
191
191
|
self._logger.critical(f"[{caller_module}] {msg}", *args, **kwargs)
|
|
192
|
-
|
|
193
|
-
raiserr.register("CriticalError", doc="发生致命错误")
|
|
194
|
-
raiserr.CriticalError(f"程序发生致命错误:{msg}", exit=True)
|
|
192
|
+
raise Exception(msg)
|
|
195
193
|
|
|
196
194
|
logger = Logger()
|
ErisPulse/Core/raiserr.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"""
|
|
2
2
|
ErisPulse 错误管理系统
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
提供全局异常捕获功能。不再推荐使用自定义错误注册功能。
|
|
5
5
|
|
|
6
6
|
{!--< tips >!--}
|
|
7
|
-
1.
|
|
8
|
-
2.
|
|
9
|
-
3.
|
|
7
|
+
1. 请使用Python原生异常抛出方法
|
|
8
|
+
2. 系统会自动捕获并格式化所有未处理异常
|
|
9
|
+
3. 注册功能已标记为弃用,将在未来版本移除
|
|
10
10
|
{!--< /tips >!--}
|
|
11
11
|
"""
|
|
12
12
|
|
|
@@ -19,12 +19,11 @@ class Error:
|
|
|
19
19
|
"""
|
|
20
20
|
错误管理器
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
{!--< deprecated >!--} 请使用Python原生异常抛出方法 | 2025-07-18
|
|
23
23
|
|
|
24
24
|
{!--< tips >!--}
|
|
25
|
-
1.
|
|
26
|
-
2.
|
|
27
|
-
3. 通过info方法获取错误信息
|
|
25
|
+
1. 注册功能将在未来版本移除
|
|
26
|
+
2. 请直接使用raise Exception("message")方式抛出异常
|
|
28
27
|
{!--< /tips >!--}
|
|
29
28
|
"""
|
|
30
29
|
|
|
@@ -35,16 +34,12 @@ class Error:
|
|
|
35
34
|
"""
|
|
36
35
|
注册新的错误类型
|
|
37
36
|
|
|
37
|
+
{!--< deprecated >!--} 请使用Python原生异常抛出方法 | 2025-07-18
|
|
38
|
+
|
|
38
39
|
:param name: 错误类型名称
|
|
39
40
|
:param doc: 错误描述文档
|
|
40
41
|
:param base: 基础异常类
|
|
41
42
|
:return: 注册的错误类
|
|
42
|
-
|
|
43
|
-
:example:
|
|
44
|
-
>>> # 注册简单错误
|
|
45
|
-
>>> raiserr.register("SimpleError", "简单的错误类型")
|
|
46
|
-
>>> # 注册自定义基类的错误
|
|
47
|
-
>>> raiserr.register("AdvancedError", "高级错误", CustomBaseError)
|
|
48
43
|
"""
|
|
49
44
|
if name not in self._types:
|
|
50
45
|
err_cls = type(name, (base,), {"__doc__": doc})
|
|
@@ -55,6 +50,8 @@ class Error:
|
|
|
55
50
|
"""
|
|
56
51
|
动态获取错误抛出函数
|
|
57
52
|
|
|
53
|
+
{!--< deprecated >!--} 请使用Python原生异常抛出方法 | 2025-07-18
|
|
54
|
+
|
|
58
55
|
:param name: 错误类型名称
|
|
59
56
|
:return: 错误抛出函数
|
|
60
57
|
|
|
@@ -85,14 +82,10 @@ class Error:
|
|
|
85
82
|
"""
|
|
86
83
|
获取错误信息
|
|
87
84
|
|
|
85
|
+
{!--< deprecated >!--} 此功能将在未来版本移除 | 2025-07-18
|
|
86
|
+
|
|
88
87
|
:param name: 错误类型名称(可选)
|
|
89
88
|
:return: 错误信息字典
|
|
90
|
-
|
|
91
|
-
:example:
|
|
92
|
-
>>> # 获取特定错误信息
|
|
93
|
-
>>> error_info = raiserr.info("SimpleError")
|
|
94
|
-
>>> # 获取所有错误信息
|
|
95
|
-
>>> all_errors = raiserr.info()
|
|
96
89
|
"""
|
|
97
90
|
result = {}
|
|
98
91
|
for err_name, err_cls in self._types.items():
|
|
@@ -119,34 +112,65 @@ class Error:
|
|
|
119
112
|
|
|
120
113
|
raiserr = Error()
|
|
121
114
|
|
|
122
|
-
# 全局异常处理器
|
|
123
115
|
def global_exception_handler(exc_type: Type[Exception], exc_value: Exception, exc_traceback: Any) -> None:
|
|
124
116
|
"""
|
|
125
|
-
{!--< internal-use >!--}
|
|
126
117
|
全局异常处理器
|
|
127
118
|
|
|
128
119
|
:param exc_type: 异常类型
|
|
129
120
|
:param exc_value: 异常值
|
|
130
121
|
:param exc_traceback: 追踪信息
|
|
131
122
|
"""
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
123
|
+
RED = '\033[91m'
|
|
124
|
+
YELLOW = '\033[93m'
|
|
125
|
+
BLUE = '\033[94m'
|
|
126
|
+
RESET = '\033[0m'
|
|
127
|
+
|
|
128
|
+
error_title = f"{RED}{exc_type.__name__}{RESET}: {YELLOW}{exc_value}{RESET}"
|
|
129
|
+
traceback_lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
|
|
136
130
|
|
|
131
|
+
colored_traceback = []
|
|
132
|
+
for line in traceback_lines:
|
|
133
|
+
if "File " in line and ", line " in line:
|
|
134
|
+
parts = line.split(', line ')
|
|
135
|
+
colored_line = f"{BLUE}{parts[0]}{RESET}, line {parts[1]}"
|
|
136
|
+
colored_traceback.append(colored_line)
|
|
137
|
+
else:
|
|
138
|
+
colored_traceback.append(f"{RED}{line}{RESET}")
|
|
139
|
+
|
|
140
|
+
full_error = f"{error_title}\n{RED}Traceback:{RESET}\n{''.join(colored_traceback)}"
|
|
141
|
+
|
|
142
|
+
sys.stderr.write(full_error)
|
|
143
|
+
|
|
137
144
|
def async_exception_handler(loop: asyncio.AbstractEventLoop, context: Dict[str, Any]) -> None:
|
|
138
145
|
"""
|
|
139
|
-
{!--< internal-use >!--}
|
|
140
146
|
异步异常处理器
|
|
141
147
|
|
|
142
148
|
:param loop: 事件循环
|
|
143
149
|
:param context: 上下文字典
|
|
144
150
|
"""
|
|
151
|
+
RED = '\033[91m'
|
|
152
|
+
YELLOW = '\033[93m'
|
|
153
|
+
BLUE = '\033[94m'
|
|
154
|
+
RESET = '\033[0m'
|
|
155
|
+
|
|
145
156
|
exception = context.get('exception')
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
157
|
+
if exception:
|
|
158
|
+
tb = ''.join(traceback.format_exception(type(exception), exception, exception.__traceback__))
|
|
159
|
+
|
|
160
|
+
colored_tb = []
|
|
161
|
+
for line in tb.split('\n'):
|
|
162
|
+
if "File " in line and ", line " in line:
|
|
163
|
+
parts = line.split(', line ')
|
|
164
|
+
colored_line = f"{BLUE}{parts[0]}{RESET}, line {parts[1]}"
|
|
165
|
+
colored_tb.append(colored_line)
|
|
166
|
+
else:
|
|
167
|
+
colored_tb.append(f"{RED}{line}{RESET}")
|
|
168
|
+
|
|
169
|
+
error_msg = f"{RED}{type(exception).__name__}{RESET}: {YELLOW}{exception}{RESET}\n{RED}Traceback:{RESET}\n{'\n'.join(colored_tb)}"
|
|
170
|
+
sys.stderr.write(error_msg)
|
|
171
|
+
else:
|
|
172
|
+
msg = context.get('message', 'Unknown async error')
|
|
173
|
+
sys.stderr.write(f"{RED}Async Error{RESET}: {YELLOW}{msg}{RESET}")
|
|
150
174
|
|
|
151
175
|
sys.excepthook = global_exception_handler
|
|
152
176
|
asyncio.get_event_loop().set_exception_handler(async_exception_handler)
|
ErisPulse/Core/util.py
CHANGED
|
@@ -87,11 +87,8 @@ class Util:
|
|
|
87
87
|
try:
|
|
88
88
|
return await loop.run_in_executor(None, lambda: func(*args, **kwargs))
|
|
89
89
|
except Exception as e:
|
|
90
|
-
from . import logger
|
|
90
|
+
from . import logger
|
|
91
91
|
logger.error(f"线程内发生未处理异常:\n{''.join(traceback.format_exc())}")
|
|
92
|
-
raiserr.CaughtExternalError(
|
|
93
|
-
f"检测到线程内异常,请优先使用 sdk.raiserr 抛出错误。\n原始异常: {type(e).__name__}: {e}"
|
|
94
|
-
)
|
|
95
92
|
return wrapper
|
|
96
93
|
|
|
97
94
|
def retry(self, max_attempts: int = 3, delay: int = 1) -> Callable:
|
ErisPulse/__init__.py
CHANGED
|
@@ -44,21 +44,9 @@ BaseModules = {
|
|
|
44
44
|
"BaseAdapter": AdapterFather
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
BaseErrors = {
|
|
48
|
-
"ExternalError": "外部捕获异常",
|
|
49
|
-
"CaughtExternalError": "捕获的非SDK抛出的异常",
|
|
50
|
-
"InitError": "SDK初始化错误",
|
|
51
|
-
"ModuleLoadError": "模块加载错误",
|
|
52
|
-
"LazyLoadError": "懒加载错误"
|
|
53
|
-
}
|
|
54
|
-
|
|
55
47
|
for module, moduleObj in BaseModules.items():
|
|
56
48
|
setattr(sdk, module, moduleObj)
|
|
57
49
|
|
|
58
|
-
for error, doc in BaseErrors.items():
|
|
59
|
-
raiserr.register(error, doc=doc)
|
|
60
|
-
|
|
61
|
-
|
|
62
50
|
class LazyModule:
|
|
63
51
|
"""
|
|
64
52
|
懒加载模块包装器
|
|
@@ -109,7 +97,7 @@ class LazyModule:
|
|
|
109
97
|
logger.debug(f"模块 {self._module_name} 初始化完成")
|
|
110
98
|
except Exception as e:
|
|
111
99
|
logger.error(f"模块 {self._module_name} 初始化失败: {e}")
|
|
112
|
-
raise
|
|
100
|
+
raise
|
|
113
101
|
|
|
114
102
|
def __getattr__(self, name: str) -> Any:
|
|
115
103
|
"""
|
|
@@ -511,7 +499,6 @@ class ModuleInitializer:
|
|
|
511
499
|
|
|
512
500
|
except Exception as e:
|
|
513
501
|
logger.critical(f"SDK初始化严重错误: {e}")
|
|
514
|
-
raiserr.InitError(f"sdk初始化失败: {e}", exit=True)
|
|
515
502
|
return False
|
|
516
503
|
|
|
517
504
|
@staticmethod
|
|
@@ -733,6 +720,7 @@ def init() -> bool:
|
|
|
733
720
|
|
|
734
721
|
:raises InitError: 当初始化失败时抛出
|
|
735
722
|
"""
|
|
723
|
+
|
|
736
724
|
if not _prepare_environment():
|
|
737
725
|
return False
|
|
738
726
|
|
ErisPulse/__main__.py
CHANGED
|
@@ -84,7 +84,8 @@ class PyPIManager:
|
|
|
84
84
|
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
85
85
|
async with session.get(PyPIManager.REMOTE_SOURCES[0]) as response:
|
|
86
86
|
if response.status == 200:
|
|
87
|
-
data = await response.
|
|
87
|
+
data = await response.text()
|
|
88
|
+
data = json.loads(data)
|
|
88
89
|
return {
|
|
89
90
|
"modules": data.get("modules", {}),
|
|
90
91
|
"adapters": data.get("adapters", {})
|
|
@@ -97,7 +98,8 @@ class PyPIManager:
|
|
|
97
98
|
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
98
99
|
async with session.get(PyPIManager.REMOTE_SOURCES[1]) as response:
|
|
99
100
|
if response.status == 200:
|
|
100
|
-
data = await response.
|
|
101
|
+
data = await response.text()
|
|
102
|
+
data = json.loads(data)
|
|
101
103
|
return {
|
|
102
104
|
"modules": data.get("modules", {}),
|
|
103
105
|
"adapters": data.get("adapters", {})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ErisPulse/__init__.py,sha256=hsgvpT1GTBvjHpUlGSljVzuTwGgtlraQ4WnLMUFm5EM,27013
|
|
2
|
+
ErisPulse/__main__.py,sha256=qqx1F8bPRKhjalKVapI3RtLupHuLlYPRk503oduYADY,19947
|
|
3
|
+
ErisPulse/Core/__init__.py,sha256=XnQFMn4HMKzxa6KHJEvOpwt0v8jp21vAbw6aG0O8sPs,722
|
|
4
|
+
ErisPulse/Core/adapter.py,sha256=lw5T336EsNtjUgSPdevcOZReZNkA8oYvvTRCHk_fo_o,18149
|
|
5
|
+
ErisPulse/Core/env.py,sha256=D2BwtSbKggbeAsOzwwVv-kd5UkVmYlDUHtgLzFZqKUI,19841
|
|
6
|
+
ErisPulse/Core/logger.py,sha256=VYhWKPXn88ib7S_OKCr_MibdnMH8k5sHkwLtNDZP3QM,7034
|
|
7
|
+
ErisPulse/Core/mods.py,sha256=5SPutuzbMrA-VZwiXeNxYWfrdbpLRdYfQ0RvEkFuQgg,7308
|
|
8
|
+
ErisPulse/Core/raiserr.py,sha256=TQCKbYrfqu8tjX7dJiJemK0lZCQ4-5875nUGXgb8HUk,5606
|
|
9
|
+
ErisPulse/Core/server.py,sha256=FkDTeLuHD5IBnWVxvYU8pHb6yCt8GzyvC1bpOiJ7G7I,9217
|
|
10
|
+
ErisPulse/Core/shellprint.py,sha256=-BFoyFho_D3XEhxIoKt6x5gO4C62LKwmJWKDUGiPjNY,5908
|
|
11
|
+
ErisPulse/Core/util.py,sha256=7rdMmn6sBFqYd4znxBCcJjuv2eyTExdeKyZopgds868,3796
|
|
12
|
+
erispulse-2.1.5.dist-info/METADATA,sha256=9R7jlHvOoAtXb7irzBiubt-Yub3ynOVvQGzw2MtDy0U,6190
|
|
13
|
+
erispulse-2.1.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
14
|
+
erispulse-2.1.5.dist-info/entry_points.txt,sha256=Jss71M6nEha0TA-DyVZugPYdcL14s9QpiOeIlgWxzOc,182
|
|
15
|
+
erispulse-2.1.5.dist-info/licenses/LICENSE,sha256=4jyqikiB0G0n06CEEMMTzTXjE4IShghSlB74skMSPQs,1464
|
|
16
|
+
erispulse-2.1.5.dist-info/RECORD,,
|
erispulse-2.1.3.dist-info/RECORD
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
ErisPulse/__init__.py,sha256=kQr2n1oeThlJVy7NY_ZMXgDsgZuhsBC5V6ysl2I59PQ,27471
|
|
2
|
-
ErisPulse/__main__.py,sha256=yxlB-rCQKy7D5XMWqP5id1sOQbzLuPx048NNpLaCDf8,19851
|
|
3
|
-
ErisPulse/Core/__init__.py,sha256=Wnkb4rI5kZhg8cdJE1sBfNRch55Aqp56npQ0DGXyHMA,675
|
|
4
|
-
ErisPulse/Core/adapter.py,sha256=lw5T336EsNtjUgSPdevcOZReZNkA8oYvvTRCHk_fo_o,18149
|
|
5
|
-
ErisPulse/Core/env.py,sha256=9WYNadD9h2jP_2wxOVBJEhH1uDzbctW7eB4Ba9RSjA4,20409
|
|
6
|
-
ErisPulse/Core/logger.py,sha256=40vDe_D3L6ople-RZX8eGXntrZpFGHHzSl3pYxK-FLI,7196
|
|
7
|
-
ErisPulse/Core/mods.py,sha256=5SPutuzbMrA-VZwiXeNxYWfrdbpLRdYfQ0RvEkFuQgg,7308
|
|
8
|
-
ErisPulse/Core/raiserr.py,sha256=QLQ3r7p4iFP86XBLq9mtf1wv1xSlgny35i8t5-l4DXo,4620
|
|
9
|
-
ErisPulse/Core/server.py,sha256=FkDTeLuHD5IBnWVxvYU8pHb6yCt8GzyvC1bpOiJ7G7I,9217
|
|
10
|
-
ErisPulse/Core/shellprint.py,sha256=-BFoyFho_D3XEhxIoKt6x5gO4C62LKwmJWKDUGiPjNY,5908
|
|
11
|
-
ErisPulse/Core/util.py,sha256=kyydBAJHHG9I7rMRzKWtLAQMZoJyBqHiBAweqcraFkU,4001
|
|
12
|
-
erispulse-2.1.3.dist-info/METADATA,sha256=2BMh2bNQUugV9gVX8Ch39Jx4PqN183z0F4umn2k-rko,6190
|
|
13
|
-
erispulse-2.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
14
|
-
erispulse-2.1.3.dist-info/entry_points.txt,sha256=Jss71M6nEha0TA-DyVZugPYdcL14s9QpiOeIlgWxzOc,182
|
|
15
|
-
erispulse-2.1.3.dist-info/licenses/LICENSE,sha256=4jyqikiB0G0n06CEEMMTzTXjE4IShghSlB74skMSPQs,1464
|
|
16
|
-
erispulse-2.1.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|