ErisPulse 1.1.14.dev1__py3-none-any.whl → 1.1.16__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/logger.py CHANGED
@@ -1,53 +1,123 @@
1
1
  """
2
2
  # 日志系统
3
3
 
4
- 提供模块化、多级别的日志记录功能,支持内存存储和文件输出。
4
+ 提供模块化、多级别的日志记录功能,支持内存存储和文件输出。实现了模块级别的日志控制、彩色输出和灵活的存储选项。
5
5
 
6
6
  ## API 文档
7
- ### 基本操作:
8
- - debug(msg, *args, **kwargs): 调试信息
9
- - info(msg, *args, **kwargs): 运行信息
10
- - warning(msg, *args, **kwargs): 警告信息
11
- - error(msg, *args, **kwargs): 错误信息
12
- - critical(msg, *args, **kwargs): 致命错误并终止程序
13
7
 
14
- ### 日志控制:
15
- - set_level(level): 设置全局日志级别
16
- - set_module_level(module_name, level): 设置模块日志级别
8
+ ### 基本日志操作
17
9
 
18
- ### 日志存储:
19
- - save_logs(path): 保存内存中的日志到文件
20
- - set_output_file(path): 设置日志输出文件
10
+ 以debug为例:
11
+ > 此外,还有其他级别的日志记录函数,如info, warning, error, critical等,用法相同。
21
12
 
22
- ### 示例用法:
13
+ debug(msg: str, *args, **kwargs) -> None
23
14
 
24
- ```
25
- from ErisPulse import sdk
15
+ 记录调试级别的日志信息。
16
+ - 参数:
17
+ - msg: 日志消息
18
+ - *args: 传递给底层logger的位置参数
19
+ - **kwargs: 传递给底层logger的关键字参数
20
+ - 返回:
21
+ - None
22
+ - 示例:
26
23
 
27
- # 基本日志记录
28
- sdk.logger.debug("调试信息")
29
- sdk.logger.info("运行状态")
24
+ ```python
25
+ sdk.logger.debug("这是一条日志")
26
+ ```
30
27
 
31
- # 模块级日志控制
32
- sdk.logger.set_module_level("MyModule", "DEBUG")
28
+ ### 日志级别控制
29
+ #### set_level(level: str) -> None
30
+ 设置全局日志级别。
31
+ - 参数:
32
+ - level: 日志级别,可选值为 "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
33
+ - 返回:
34
+ - None
35
+ - 示例:
36
+ ```python
37
+ # 设置为调试级别
38
+ sdk.logger.set_level("DEBUG")
39
+
40
+ # 设置为生产环境级别
41
+ sdk.logger.set_level("INFO")
42
+
43
+ # 根据环境设置日志级别
44
+ if is_production():
45
+ sdk.logger.set_level("WARNING")
46
+ else:
47
+ sdk.logger.set_level("DEBUG")
48
+ ```
33
49
 
34
- # 异常捕获
35
- @sdk.logger.catch
36
- def risky_function():
37
- raise Exception("出错了")
50
+ #### set_module_level(module_name: str, level: str) -> bool
51
+ 设置特定模块的日志级别。
52
+ - 参数:
53
+ - module_name: 模块名称
54
+ - level: 日志级别,可选值为 "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
55
+ - 返回:
56
+ - bool: 设置是否成功
57
+ - 示例:
58
+ ```python
59
+ # 为特定模块设置详细日志
60
+ sdk.logger.set_module_level("NetworkModule", "DEBUG")
61
+
62
+ # 为敏感模块设置更高级别
63
+ sdk.logger.set_module_level("AuthModule", "WARNING")
64
+
65
+ # 根据配置设置模块日志级别
66
+ for module, level in config.get("logging", {}).items():
67
+ success = sdk.logger.set_module_level(module, level)
68
+ if not success:
69
+ print(f"无法为模块 {module} 设置日志级别 {level}")
38
70
  ```
39
71
 
40
- ## 准备弃用
72
+ ### 日志存储和输出
73
+ #### set_output_file(path: str | list) -> None
74
+ 设置日志输出文件。
75
+ - 参数:
76
+ - path: 日志文件路径,可以是单个字符串或路径列表
77
+ - 返回:
78
+ - None
79
+ - 异常:
80
+ - 如果无法设置日志文件,会抛出异常
81
+ - 示例:
82
+ ```python
83
+ # 设置单个日志文件
84
+ sdk.logger.set_output_file("app.log")
85
+
86
+ # 设置多个日志文件
87
+ sdk.logger.set_output_file(["app.log", "debug.log"])
88
+
89
+ # 使用日期命名日志文件
90
+ from datetime import datetime
91
+ log_file = f"logs/app_{datetime.now().strftime('%Y%m%d')}.log"
92
+ sdk.logger.set_output_file(log_file)
93
+ ```
41
94
 
42
- catch(func_or_level=None, level="error"): 异常捕获装饰器
43
- - 原因: 异常捕获功能已集成到 raiserr 模块中,建议使用 raiserr 进行异常处理。
95
+ #### save_logs(path: str | list) -> None
96
+ 保存内存中的日志到文件。
97
+ - 参数:
98
+ - path: 保存路径,可以是单个字符串或路径列表
99
+ - 返回:
100
+ - None
101
+ - 异常:
102
+ - 如果无法保存日志,会抛出异常
103
+ - 示例:
104
+ ```python
105
+ # 保存到单个文件
106
+ sdk.logger.save_logs("saved_logs.txt")
107
+
108
+ # 保存到多个文件
109
+ sdk.logger.save_logs(["main_log.txt", "backup_log.txt"])
110
+
111
+ # 在应用退出前保存日志
112
+ import atexit
113
+ atexit.register(lambda: sdk.logger.save_logs("final_logs.txt"))
114
+ ```
44
115
 
45
116
  """
46
117
 
47
118
  import logging
48
119
  import inspect
49
120
  import datetime
50
- import functools
51
121
 
52
122
  class Logger:
53
123
  def __init__(self):
@@ -117,34 +187,6 @@ class Logger:
117
187
  self._logger.error(f"无法保存日志到 {p}: {e}。")
118
188
  raise e
119
189
 
120
- def catch(self, func_or_level=None, level="error"):
121
- if isinstance(func_or_level, str):
122
- return lambda func: self.catch(func, level=func_or_level)
123
- if func_or_level is None:
124
- return lambda func: self.catch(func, level=level)
125
- func = func_or_level
126
-
127
- @functools.wraps(func)
128
- def wrapper(*args, **kwargs):
129
- try:
130
- return func(*args, **kwargs)
131
- except Exception as e:
132
- import traceback
133
- error_info = traceback.format_exc()
134
-
135
- module_name = func.__module__
136
- if module_name == "__main__":
137
- module_name = "Main"
138
- func_name = func.__name__
139
-
140
- error_msg = f"Exception in {func_name}: {str(e)}\n{error_info}"
141
-
142
- log_method = getattr(self, level, self.error)
143
- log_method(error_msg)
144
-
145
- return None
146
- return wrapper
147
-
148
190
  def _save_in_memory(self, ModuleName, msg):
149
191
  if ModuleName not in self._logs:
150
192
  self._logs[ModuleName] = []
@@ -163,6 +205,8 @@ class Logger:
163
205
  module_name = "Main"
164
206
  if module_name.endswith(".Core"):
165
207
  module_name = module_name[:-5]
208
+ if module_name.startswith("ErisPulse"):
209
+ module_name = "ErisPulse"
166
210
  return module_name
167
211
 
168
212
  def debug(self, msg, *args, **kwargs):
ErisPulse/mods.py CHANGED
@@ -1,37 +1,253 @@
1
1
  """
2
2
  # 模块管理系统
3
3
 
4
- 提供模块的注册、状态管理和依赖解析功能。
4
+ 提供模块的注册、状态管理和依赖解析功能。支持模块信息存储、状态切换和批量操作。
5
5
 
6
6
  ## API 文档
7
- ### 模块状态:
8
- - set_module_status(module_name, status): 设置模块启用状态
9
- - get_module_status(module_name): 获取模块状态
10
7
 
11
- ### 模块信息:
12
- - set_module(module_name, module_info): 设置模块信息
13
- - get_module(module_name): 获取模块信息
14
- - get_all_modules(): 获取所有模块信息
15
- - remove_module(module_name): 删除模块
8
+ ### 模块状态管理
9
+ #### set_module_status(module_name: str, status: bool) -> None
10
+ 设置模块的启用状态。
11
+ - 参数:
12
+ - module_name: 模块名称
13
+ - status: 模块状态,True为启用,False为禁用
14
+ - 返回:
15
+ - None
16
+ - 示例:
17
+ ```python
18
+ # 启用模块
19
+ sdk.mods.set_module_status("MyModule", True)
16
20
 
17
- ### 前缀管理:
18
- - update_prefixes(module_prefix, status_prefix): 更新存储前缀
19
- - module_prefix: 模块存储前缀属性
20
- - status_prefix: 状态存储前缀属性
21
+ # 禁用模块
22
+ sdk.mods.set_module_status("MyModule", False)
21
23
 
22
- ### 示例用法:
24
+ # 条件性启用模块
25
+ if check_dependencies():
26
+ sdk.mods.set_module_status("MyModule", True)
27
+ else:
28
+ sdk.logger.warning("依赖检查失败,模块未启用")
29
+ ```
23
30
 
31
+ #### get_module_status(module_name: str) -> bool
32
+ 获取模块的启用状态。
33
+ - 参数:
34
+ - module_name: 模块名称
35
+ - 返回:
36
+ - bool: 模块状态,True为启用,False为禁用
37
+ - 示例:
38
+ ```python
39
+ # 检查模块是否启用
40
+ if sdk.mods.get_module_status("MyModule"):
41
+ print("模块已启用")
42
+ else:
43
+ print("模块已禁用")
44
+
45
+ # 在条件中使用
46
+ if sdk.mods.get_module_status("DatabaseModule") and sdk.mods.get_module_status("NetworkModule"):
47
+ start_application()
24
48
  ```
25
- from ErisPulse import sdk
26
49
 
27
- # 设置模块状态
28
- sdk.mods.set_module_status("MyModule", True)
50
+ ### 模块信息管理
51
+ #### set_module(module_name: str, module_info: dict) -> None
52
+ 设置模块信息。
53
+ - 参数:
54
+ - module_name: 模块名称
55
+ - module_info: 模块信息字典,包含模块的元数据和配置
56
+ - 返回:
57
+ - None
58
+ - 示例:
59
+ ```python
60
+ # 设置基本模块信息
61
+ sdk.mods.set_module("MyModule", {
62
+ "status": True,
63
+ "info": {
64
+ "meta": {
65
+ "name": "MyModule",
66
+ "version": "1.0.0",
67
+ "description": "示例模块",
68
+ "author": "开发者"
69
+ },
70
+ "dependencies": {
71
+ "requires": ["CoreModule"],
72
+ "optional": ["OptionalModule"],
73
+ "pip": ["requests", "numpy"]
74
+ }
75
+ }
76
+ })
77
+
78
+ # 更新现有模块信息
79
+ module_info = sdk.mods.get_module("MyModule")
80
+ module_info["info"]["meta"]["version"] = "1.1.0"
81
+ sdk.mods.set_module("MyModule", module_info)
82
+ ```
29
83
 
84
+ #### get_module(module_name: str) -> dict | None
85
+ 获取模块信息。
86
+ - 参数:
87
+ - module_name: 模块名称
88
+ - 返回:
89
+ - dict: 模块信息字典
90
+ - None: 如果模块不存在
91
+ - 示例:
92
+ ```python
30
93
  # 获取模块信息
31
94
  module_info = sdk.mods.get_module("MyModule")
95
+ if module_info:
96
+ print(f"模块版本: {module_info['info']['meta']['version']}")
97
+ print(f"模块描述: {module_info['info']['meta']['description']}")
98
+ print(f"模块状态: {'启用' if module_info['status'] else '禁用'}")
99
+ else:
100
+ print("模块不存在")
101
+ ```
102
+
103
+ #### get_all_modules() -> dict
104
+ 获取所有模块信息。
105
+ - 参数: 无
106
+ - 返回:
107
+ - dict: 包含所有模块信息的字典,键为模块名,值为模块信息
108
+ - 示例:
109
+ ```python
110
+ # 获取所有模块
111
+ all_modules = sdk.mods.get_all_modules()
112
+
113
+ # 统计启用和禁用的模块
114
+ enabled_count = 0
115
+ disabled_count = 0
116
+ for name, info in all_modules.items():
117
+ if info.get("status", False):
118
+ enabled_count += 1
119
+ else:
120
+ disabled_count += 1
121
+
122
+ print(f"已启用模块: {enabled_count}")
123
+ print(f"已禁用模块: {disabled_count}")
124
+
125
+ # 查找特定类型的模块
126
+ adapters = [name for name, info in all_modules.items()
127
+ if "adapter" in info.get("info", {}).get("meta", {}).get("tags", [])]
128
+ print(f"适配器模块: {adapters}")
129
+ ```
130
+
131
+ #### update_module(module_name: str, module_info: dict) -> None
132
+ 更新模块信息。
133
+ - 参数:
134
+ - module_name: 模块名称
135
+ - module_info: 更新后的模块信息字典
136
+ - 返回:
137
+ - None
138
+ - 示例:
139
+ ```python
140
+ # 更新模块版本
141
+ module_info = sdk.mods.get_module("MyModule")
142
+ module_info["info"]["meta"]["version"] = "1.2.0"
143
+ sdk.mods.update_module("MyModule", module_info)
144
+
145
+ # 添加新的配置项
146
+ module_info = sdk.mods.get_module("MyModule")
147
+ if "config" not in module_info:
148
+ module_info["config"] = {}
149
+ module_info["config"]["debug_mode"] = True
150
+ sdk.mods.update_module("MyModule", module_info)
151
+ ```
152
+
153
+ #### remove_module(module_name: str) -> bool
154
+ 删除模块。
155
+ - 参数:
156
+ - module_name: 模块名称
157
+ - 返回:
158
+ - bool: 是否成功删除
159
+ - 示例:
160
+ ```python
161
+ # 删除模块
162
+ if sdk.mods.remove_module("OldModule"):
163
+ print("模块已成功删除")
164
+ else:
165
+ print("模块不存在或删除失败")
166
+
167
+ # 条件删除
168
+ if sdk.mods.get_module_status("TestModule") and is_test_environment():
169
+ sdk.mods.remove_module("TestModule")
170
+ print("测试模块已在生产环境中移除")
171
+ ```
172
+
173
+ #### set_all_modules(modules_info: Dict[str, dict]) -> None
174
+ 批量设置多个模块信息。
175
+ - 参数:
176
+ - modules_info: 模块信息字典的字典,键为模块名,值为模块信息
177
+ - 返回:
178
+ - None
179
+ - 示例:
180
+ ```python
181
+ # 批量设置模块
182
+ sdk.mods.set_all_modules({
183
+ "Module1": {
184
+ "status": True,
185
+ "info": {"meta": {"name": "Module1", "version": "1.0.0"}}
186
+ },
187
+ "Module2": {
188
+ "status": True,
189
+ "info": {"meta": {"name": "Module2", "version": "1.0.0"}}
190
+ }
191
+ })
192
+
193
+ # 从配置文件加载模块信息
194
+ import json
195
+ with open("modules_config.json", "r") as f:
196
+ modules_config = json.load(f)
197
+ sdk.mods.set_all_modules(modules_config)
198
+ ```
199
+
200
+ ### 前缀管理
201
+ #### update_prefixes(module_prefix: str = None, status_prefix: str = None) -> None
202
+ 更新存储前缀。
203
+ - 参数:
204
+ - module_prefix: 模块存储前缀
205
+ - status_prefix: 状态存储前缀
206
+ - 返回:
207
+ - None
208
+ - 示例:
209
+ ```python
210
+ # 更新模块前缀
211
+ sdk.mods.update_prefixes(module_prefix="custom.module.")
212
+
213
+ # 更新状态前缀
214
+ sdk.mods.update_prefixes(status_prefix="custom.status.")
215
+
216
+ # 同时更新两个前缀
217
+ sdk.mods.update_prefixes(
218
+ module_prefix="app.modules.",
219
+ status_prefix="app.status."
220
+ )
221
+ ```
222
+
223
+ #### module_prefix 属性
224
+ 获取当前模块存储前缀。
225
+ - 返回:
226
+ - str: 当前模块存储前缀
227
+ - 示例:
228
+ ```python
229
+ # 获取当前模块前缀
230
+ prefix = sdk.mods.module_prefix
231
+ print(f"当前模块前缀: {prefix}")
232
+
233
+ # 在自定义存储操作中使用
234
+ custom_key = f"{sdk.mods.module_prefix}custom.{module_name}"
235
+ sdk.env.set(custom_key, custom_data)
236
+ ```
237
+
238
+ #### status_prefix 属性
239
+ 获取当前状态存储前缀。
240
+ - 返回:
241
+ - str: 当前状态存储前缀
242
+ - 示例:
243
+ ```python
244
+ # 获取当前状态前缀
245
+ prefix = sdk.mods.status_prefix
246
+ print(f"当前状态前缀: {prefix}")
32
247
 
33
- # 批量操作
34
- sdk.mods.set_all_modules({"Module1": {...}, "Module2": {...}})
248
+ # 在自定义状态操作中使用
249
+ custom_status_key = f"{sdk.mods.status_prefix}custom.{module_name}"
250
+ sdk.env.set(custom_status_key, is_active)
35
251
  ```
36
252
 
37
253
  """
ErisPulse/raiserr.py CHANGED
@@ -1,34 +1,69 @@
1
1
  """
2
2
  # 错误管理系统
3
3
 
4
- 提供错误类型注册、抛出和管理功能,集成全局异常处理。
4
+ 提供错误类型注册、抛出和管理功能,集成全局异常处理。支持自定义错误类型、错误链追踪和全局异常捕获。
5
5
 
6
6
  ## API 文档
7
- ### 错误注册:
8
- - register(name, doc="", base=Exception): 注册新的错误类型
9
- - info(name: str = None): 获取错误类型信息
10
-
11
- ### 错误抛出:
12
- - __getattr__(name): 动态获取错误抛出函数
13
- - ErrorType(msg, exit=False): 抛出注册的错误类型
14
-
15
- ### 全局处理:
16
- - global_exception_handler: 全局同步异常处理器
17
- - async_exception_handler: 全局异步异常处理器
18
-
19
- ### 示例用法:
20
7
 
8
+ ### 错误注册
9
+ #### register(name: str, doc: str = "", base: type = Exception) -> type
10
+ 注册新的错误类型。
11
+ - 参数:
12
+ - name: 错误类型名称
13
+ - doc: 错误描述文档
14
+ - base: 基础异常类,默认为Exception
15
+ - 返回:
16
+ - type: 注册的错误类型类
17
+ - 示例:
18
+ ```python
19
+ # 注册一个简单错误
20
+ sdk.raiserr.register("SimpleError", "简单的错误类型")
21
+
22
+ # 注册带有自定义基类的错误
23
+ class CustomBase(Exception):
24
+ pass
25
+ sdk.raiserr.register("AdvancedError", "高级错误", CustomBase)
21
26
  ```
22
- from ErisPulse import sdk
23
27
 
24
- # 注册自定义错误
25
- sdk.raiserr.register("MyError", doc="自定义错误描述")
26
-
27
- # 抛出错误
28
- sdk.raiserr.MyError("发生了错误", exit=False)
28
+ #### info(name: str = None) -> dict | None
29
+ 获取错误类型信息。
30
+ - 参数:
31
+ - name: 错误类型名称,如果为None则返回所有错误类型信息
32
+ - 返回:
33
+ - dict: 包含错误类型信息的字典,包括类型名、文档和类引用
34
+ - None: 如果指定的错误类型不存在
35
+ - 示例:
36
+ ```python
37
+ # 获取特定错误信息
38
+ error_info = sdk.raiserr.info("SimpleError")
39
+ print(f"错误类型: {error_info['type']}")
40
+ print(f"错误描述: {error_info['doc']}")
41
+
42
+ # 获取所有注册的错误信息
43
+ all_errors = sdk.raiserr.info()
44
+ for name, info in all_errors.items():
45
+ print(f"{name}: {info['doc']}")
46
+ ```
29
47
 
30
- # 获取错误信息
31
- error_info = sdk.raiserr.info("MyError")
48
+ ### 错误抛出
49
+ #### ErrorType(msg: str, exit: bool = False)
50
+ 动态生成的错误抛出函数。
51
+ - 参数:
52
+ - msg: 错误消息
53
+ - exit: 是否在抛出错误后退出程序
54
+ - 示例:
55
+ ```python
56
+ # 抛出不退出的错误
57
+ sdk.raiserr.SimpleError("操作失败")
58
+
59
+ # 抛出导致程序退出的错误
60
+ sdk.raiserr.CriticalError("致命错误", exit=True)
61
+
62
+ # 带有异常捕获的使用方式
63
+ try:
64
+ sdk.raiserr.ValidationError("数据验证失败")
65
+ except Exception as e:
66
+ print(f"捕获到错误: {e}")
32
67
  ```
33
68
 
34
69
  """
@@ -86,24 +121,16 @@ raiserr = Error()
86
121
 
87
122
  # 全局异常处理器
88
123
  def global_exception_handler(exc_type, exc_value, exc_traceback):
89
- from .logger import logger
90
124
  error_message = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
91
- logger.error(f"未处理的异常被捕获:\n{error_message}")
92
- raiserr.CaughtExternalError(
93
- f"检测到外部异常,请优先使用 sdk.raiserr 抛出错误。\n原始异常: {exc_type.__name__}: {exc_value}\nTraceback:\n{error_message}"
125
+ raiserr.ExternalError(
126
+ f"{exc_type.__name__}: {exc_value}\nTraceback:\n{error_message}"
94
127
  )
95
- sys.excepthook = global_exception_handler
96
-
97
128
  def async_exception_handler(loop, context):
98
- from .logger import logger
99
129
  exception = context.get('exception')
100
- message = context.get('message', 'Async error')
101
- if exception:
102
- tb = ''.join(traceback.format_exception(type(exception), exception, exception.__traceback__))
103
- logger.error(f"异步任务异常: {message}\n{tb}")
104
- raiserr.CaughtExternalError(
105
- f"检测到异步任务异常,请优先使用 sdk.raiserr 抛出错误。\n原始异常: {type(exception).__name__}: {exception}\nTraceback:\n{tb}"
106
- )
107
- else:
108
- logger.warning(f"异步任务警告: {message}")
130
+ tb = ''.join(traceback.format_exception(type(exception), exception, exception.__traceback__))
131
+ raiserr.ExternalError(
132
+ f"{type(exception).__name__}: {exception}\nTraceback:\n{tb}"
133
+ )
134
+
135
+ sys.excepthook = global_exception_handler
109
136
  asyncio.get_event_loop().set_exception_handler(async_exception_handler)