ErisPulse 1.1.13__py3-none-any.whl → 1.1.14__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/__init__.py +201 -112
- ErisPulse/__main__.py +51 -2
- ErisPulse/adapter.py +351 -0
- ErisPulse/db.py +689 -8
- ErisPulse/logger.py +325 -1
- ErisPulse/mods.py +331 -0
- ErisPulse/raiserr.py +159 -1
- ErisPulse/util.py +421 -0
- erispulse-1.1.14.dist-info/METADATA +165 -0
- erispulse-1.1.14.dist-info/RECORD +13 -0
- {erispulse-1.1.13.dist-info → erispulse-1.1.14.dist-info}/WHEEL +1 -2
- erispulse-1.1.13.dist-info/METADATA +0 -79
- erispulse-1.1.13.dist-info/RECORD +0 -14
- erispulse-1.1.13.dist-info/top_level.txt +0 -1
- {erispulse-1.1.13.dist-info → erispulse-1.1.14.dist-info}/entry_points.txt +0 -0
- {erispulse-1.1.13.dist-info → erispulse-1.1.14.dist-info}/licenses/LICENSE +0 -0
ErisPulse/logger.py
CHANGED
|
@@ -1,3 +1,327 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# 日志系统
|
|
3
|
+
|
|
4
|
+
提供模块化、多级别的日志记录功能,支持内存存储和文件输出。实现了模块级别的日志控制、彩色输出和灵活的存储选项。
|
|
5
|
+
|
|
6
|
+
## 核心功能
|
|
7
|
+
1. 多级别日志记录
|
|
8
|
+
2. 模块级别日志控制
|
|
9
|
+
3. 内存日志存储
|
|
10
|
+
4. 文件输出支持
|
|
11
|
+
5. 自动调用者识别
|
|
12
|
+
6. 异常捕获装饰器
|
|
13
|
+
|
|
14
|
+
## API 文档
|
|
15
|
+
|
|
16
|
+
### 基本日志操作
|
|
17
|
+
#### debug(msg: str, *args, **kwargs) -> None
|
|
18
|
+
记录调试级别的日志信息。
|
|
19
|
+
- 参数:
|
|
20
|
+
- msg: 日志消息
|
|
21
|
+
- *args: 传递给底层logger的位置参数
|
|
22
|
+
- **kwargs: 传递给底层logger的关键字参数
|
|
23
|
+
- 返回:
|
|
24
|
+
- None
|
|
25
|
+
- 示例:
|
|
26
|
+
```python
|
|
27
|
+
# 基本调试信息
|
|
28
|
+
sdk.logger.debug("初始化配置")
|
|
29
|
+
|
|
30
|
+
# 带有变量的调试信息
|
|
31
|
+
config_value = get_config("timeout")
|
|
32
|
+
sdk.logger.debug(f"读取配置: timeout = {config_value}")
|
|
33
|
+
|
|
34
|
+
# 在条件下记录调试信息
|
|
35
|
+
if is_development_mode():
|
|
36
|
+
sdk.logger.debug("开发模式下的详细信息: %s", detailed_info)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
#### info(msg: str, *args, **kwargs) -> None
|
|
40
|
+
记录信息级别的日志信息。
|
|
41
|
+
- 参数:
|
|
42
|
+
- msg: 日志消息
|
|
43
|
+
- *args: 传递给底层logger的位置参数
|
|
44
|
+
- **kwargs: 传递给底层logger的关键字参数
|
|
45
|
+
- 返回:
|
|
46
|
+
- None
|
|
47
|
+
- 示例:
|
|
48
|
+
```python
|
|
49
|
+
# 基本信息记录
|
|
50
|
+
sdk.logger.info("应用已启动")
|
|
51
|
+
|
|
52
|
+
# 带有上下文的信息
|
|
53
|
+
user_count = get_active_users()
|
|
54
|
+
sdk.logger.info(f"当前活跃用户: {user_count}")
|
|
55
|
+
|
|
56
|
+
# 记录操作结果
|
|
57
|
+
sdk.logger.info("数据导入完成,共处理 %d 条记录", record_count)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### warning(msg: str, *args, **kwargs) -> None
|
|
61
|
+
记录警告级别的日志信息。
|
|
62
|
+
- 参数:
|
|
63
|
+
- msg: 日志消息
|
|
64
|
+
- *args: 传递给底层logger的位置参数
|
|
65
|
+
- **kwargs: 传递给底层logger的关键字参数
|
|
66
|
+
- 返回:
|
|
67
|
+
- None
|
|
68
|
+
- 示例:
|
|
69
|
+
```python
|
|
70
|
+
# 基本警告信息
|
|
71
|
+
sdk.logger.warning("配置文件未找到,使用默认配置")
|
|
72
|
+
|
|
73
|
+
# 性能警告
|
|
74
|
+
if response_time > threshold:
|
|
75
|
+
sdk.logger.warning(f"响应时间过长: {response_time}ms > {threshold}ms")
|
|
76
|
+
|
|
77
|
+
# 资源使用警告
|
|
78
|
+
memory_usage = get_memory_usage()
|
|
79
|
+
if memory_usage > 80:
|
|
80
|
+
sdk.logger.warning("内存使用率高: %d%%", memory_usage)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### error(msg: str, *args, **kwargs) -> None
|
|
84
|
+
记录错误级别的日志信息。
|
|
85
|
+
- 参数:
|
|
86
|
+
- msg: 日志消息
|
|
87
|
+
- *args: 传递给底层logger的位置参数
|
|
88
|
+
- **kwargs: 传递给底层logger的关键字参数
|
|
89
|
+
- 返回:
|
|
90
|
+
- None
|
|
91
|
+
- 示例:
|
|
92
|
+
```python
|
|
93
|
+
# 基本错误信息
|
|
94
|
+
sdk.logger.error("数据库连接失败")
|
|
95
|
+
|
|
96
|
+
# 带有异常信息的错误
|
|
97
|
+
try:
|
|
98
|
+
process_data()
|
|
99
|
+
except Exception as e:
|
|
100
|
+
sdk.logger.error(f"数据处理错误: {str(e)}")
|
|
101
|
+
|
|
102
|
+
# 带有错误代码的错误
|
|
103
|
+
sdk.logger.error("API请求失败,状态码: %d, 错误: %s", status_code, error_message)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### critical(msg: str, *args, **kwargs) -> None
|
|
107
|
+
记录致命错误级别的日志信息,并终止程序。
|
|
108
|
+
- 参数:
|
|
109
|
+
- msg: 日志消息
|
|
110
|
+
- *args: 传递给底层logger的位置参数
|
|
111
|
+
- **kwargs: 传递给底层logger的关键字参数
|
|
112
|
+
- 返回:
|
|
113
|
+
- None (程序会终止)
|
|
114
|
+
- 示例:
|
|
115
|
+
```python
|
|
116
|
+
# 致命错误记录
|
|
117
|
+
if not database_connection:
|
|
118
|
+
sdk.logger.critical("无法连接到主数据库,应用无法继续运行")
|
|
119
|
+
|
|
120
|
+
# 安全相关的致命错误
|
|
121
|
+
if security_breach_detected():
|
|
122
|
+
sdk.logger.critical("检测到安全漏洞,强制关闭系统")
|
|
123
|
+
|
|
124
|
+
# 资源耗尽的致命错误
|
|
125
|
+
if disk_space < min_required:
|
|
126
|
+
sdk.logger.critical("磁盘空间不足 (%dMB),无法继续运行", disk_space)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 日志级别控制
|
|
130
|
+
#### set_level(level: str) -> None
|
|
131
|
+
设置全局日志级别。
|
|
132
|
+
- 参数:
|
|
133
|
+
- level: 日志级别,可选值为 "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
|
|
134
|
+
- 返回:
|
|
135
|
+
- None
|
|
136
|
+
- 示例:
|
|
137
|
+
```python
|
|
138
|
+
# 设置为调试级别
|
|
139
|
+
sdk.logger.set_level("DEBUG")
|
|
140
|
+
|
|
141
|
+
# 设置为生产环境级别
|
|
142
|
+
sdk.logger.set_level("INFO")
|
|
143
|
+
|
|
144
|
+
# 根据环境设置日志级别
|
|
145
|
+
if is_production():
|
|
146
|
+
sdk.logger.set_level("WARNING")
|
|
147
|
+
else:
|
|
148
|
+
sdk.logger.set_level("DEBUG")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### set_module_level(module_name: str, level: str) -> bool
|
|
152
|
+
设置特定模块的日志级别。
|
|
153
|
+
- 参数:
|
|
154
|
+
- module_name: 模块名称
|
|
155
|
+
- level: 日志级别,可选值为 "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
|
|
156
|
+
- 返回:
|
|
157
|
+
- bool: 设置是否成功
|
|
158
|
+
- 示例:
|
|
159
|
+
```python
|
|
160
|
+
# 为特定模块设置详细日志
|
|
161
|
+
sdk.logger.set_module_level("NetworkModule", "DEBUG")
|
|
162
|
+
|
|
163
|
+
# 为敏感模块设置更高级别
|
|
164
|
+
sdk.logger.set_module_level("AuthModule", "WARNING")
|
|
165
|
+
|
|
166
|
+
# 根据配置设置模块日志级别
|
|
167
|
+
for module, level in config.get("logging", {}).items():
|
|
168
|
+
success = sdk.logger.set_module_level(module, level)
|
|
169
|
+
if not success:
|
|
170
|
+
print(f"无法为模块 {module} 设置日志级别 {level}")
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 日志存储和输出
|
|
174
|
+
#### set_output_file(path: str | list) -> None
|
|
175
|
+
设置日志输出文件。
|
|
176
|
+
- 参数:
|
|
177
|
+
- path: 日志文件路径,可以是单个字符串或路径列表
|
|
178
|
+
- 返回:
|
|
179
|
+
- None
|
|
180
|
+
- 异常:
|
|
181
|
+
- 如果无法设置日志文件,会抛出异常
|
|
182
|
+
- 示例:
|
|
183
|
+
```python
|
|
184
|
+
# 设置单个日志文件
|
|
185
|
+
sdk.logger.set_output_file("app.log")
|
|
186
|
+
|
|
187
|
+
# 设置多个日志文件
|
|
188
|
+
sdk.logger.set_output_file(["app.log", "debug.log"])
|
|
189
|
+
|
|
190
|
+
# 使用日期命名日志文件
|
|
191
|
+
from datetime import datetime
|
|
192
|
+
log_file = f"logs/app_{datetime.now().strftime('%Y%m%d')}.log"
|
|
193
|
+
sdk.logger.set_output_file(log_file)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
#### save_logs(path: str | list) -> None
|
|
197
|
+
保存内存中的日志到文件。
|
|
198
|
+
- 参数:
|
|
199
|
+
- path: 保存路径,可以是单个字符串或路径列表
|
|
200
|
+
- 返回:
|
|
201
|
+
- None
|
|
202
|
+
- 异常:
|
|
203
|
+
- 如果无法保存日志,会抛出异常
|
|
204
|
+
- 示例:
|
|
205
|
+
```python
|
|
206
|
+
# 保存到单个文件
|
|
207
|
+
sdk.logger.save_logs("saved_logs.txt")
|
|
208
|
+
|
|
209
|
+
# 保存到多个文件
|
|
210
|
+
sdk.logger.save_logs(["main_log.txt", "backup_log.txt"])
|
|
211
|
+
|
|
212
|
+
# 在应用退出前保存日志
|
|
213
|
+
import atexit
|
|
214
|
+
atexit.register(lambda: sdk.logger.save_logs("final_logs.txt"))
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### 异常捕获 (准备弃用)
|
|
218
|
+
#### catch(func_or_level=None, level="error")
|
|
219
|
+
异常捕获装饰器。
|
|
220
|
+
- 参数:
|
|
221
|
+
- func_or_level: 要装饰的函数或日志级别
|
|
222
|
+
- level: 捕获异常时使用的日志级别
|
|
223
|
+
- 返回:
|
|
224
|
+
- function: 装饰后的函数
|
|
225
|
+
- 注意:
|
|
226
|
+
- 此功能已集成到 raiserr 模块中,建议使用 raiserr 进行异常处理
|
|
227
|
+
- 示例:
|
|
228
|
+
```python
|
|
229
|
+
# 基本用法 (不推荐,请使用raiserr)
|
|
230
|
+
@sdk.logger.catch
|
|
231
|
+
def risky_function():
|
|
232
|
+
# 可能抛出异常的代码
|
|
233
|
+
process_data()
|
|
234
|
+
|
|
235
|
+
# 指定日志级别 (不推荐,请使用raiserr)
|
|
236
|
+
@sdk.logger.catch(level="critical")
|
|
237
|
+
def very_important_function():
|
|
238
|
+
# 关键操作
|
|
239
|
+
update_database()
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## 最佳实践
|
|
243
|
+
1. 日志级别使用
|
|
244
|
+
```python
|
|
245
|
+
# 开发环境使用详细日志
|
|
246
|
+
if is_development():
|
|
247
|
+
sdk.logger.set_level("DEBUG")
|
|
248
|
+
sdk.logger.debug("详细的调试信息")
|
|
249
|
+
else:
|
|
250
|
+
sdk.logger.set_level("INFO")
|
|
251
|
+
|
|
252
|
+
# 性能敏感模块使用更高级别
|
|
253
|
+
sdk.logger.set_module_level("PerformanceModule", "WARNING")
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
2. 结构化日志信息
|
|
257
|
+
```python
|
|
258
|
+
# 使用一致的格式
|
|
259
|
+
def log_api_request(endpoint, method, status, duration):
|
|
260
|
+
sdk.logger.info(
|
|
261
|
+
f"API请求: {method} {endpoint} - 状态: {status}, 耗时: {duration}ms"
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# 包含关键上下文
|
|
265
|
+
def log_user_action(user_id, action, result):
|
|
266
|
+
sdk.logger.info(
|
|
267
|
+
f"用户操作: [用户:{user_id}] {action} - 结果: {result}"
|
|
268
|
+
)
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
3. 日志文件管理
|
|
272
|
+
```python
|
|
273
|
+
# 按日期分割日志文件
|
|
274
|
+
from datetime import datetime
|
|
275
|
+
import os
|
|
276
|
+
|
|
277
|
+
def setup_logging():
|
|
278
|
+
log_dir = "logs"
|
|
279
|
+
os.makedirs(log_dir, exist_ok=True)
|
|
280
|
+
|
|
281
|
+
today = datetime.now().strftime("%Y-%m-%d")
|
|
282
|
+
log_file = os.path.join(log_dir, f"app_{today}.log")
|
|
283
|
+
|
|
284
|
+
sdk.logger.set_output_file(log_file)
|
|
285
|
+
sdk.logger.info(f"日志文件已设置: {log_file}")
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
4. 异常处理与日志
|
|
289
|
+
```python
|
|
290
|
+
# 推荐方式:使用raiserr结合logger
|
|
291
|
+
def process_with_logging():
|
|
292
|
+
try:
|
|
293
|
+
result = perform_operation()
|
|
294
|
+
sdk.logger.info(f"操作成功: {result}")
|
|
295
|
+
return result
|
|
296
|
+
except Exception as e:
|
|
297
|
+
sdk.logger.error(f"操作失败: {str(e)}")
|
|
298
|
+
sdk.raiserr.OperationError(f"处理失败: {str(e)}")
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## 注意事项
|
|
302
|
+
1. 日志级别选择
|
|
303
|
+
- DEBUG: 详细的调试信息,仅在开发环境使用
|
|
304
|
+
- INFO: 常规操作信息,适用于生产环境
|
|
305
|
+
- WARNING: 潜在问题或异常情况
|
|
306
|
+
- ERROR: 错误但不影响整体功能
|
|
307
|
+
- CRITICAL: 致命错误,导致程序终止
|
|
308
|
+
|
|
309
|
+
2. 性能考虑
|
|
310
|
+
- 避免在高频循环中记录过多日志
|
|
311
|
+
- 使用适当的日志级别减少不必要的输出
|
|
312
|
+
- 考虑日志文件大小和轮转策略
|
|
313
|
+
|
|
314
|
+
3. 敏感信息保护
|
|
315
|
+
- 不要记录密码、令牌等敏感信息
|
|
316
|
+
- 在记录用户数据前进行脱敏处理
|
|
317
|
+
- 遵循数据保护法规要求
|
|
318
|
+
|
|
319
|
+
4. 迁移建议
|
|
320
|
+
- 从catch装饰器迁移到raiserr模块
|
|
321
|
+
- 使用结构化的错误处理方式
|
|
322
|
+
- 结合日志和错误管理实现完整的异常处理流程
|
|
323
|
+
"""
|
|
324
|
+
|
|
1
325
|
import logging
|
|
2
326
|
import inspect
|
|
3
327
|
import datetime
|
|
@@ -152,4 +476,4 @@ class Logger:
|
|
|
152
476
|
raiserr.register("CriticalError", doc="发生致命错误")
|
|
153
477
|
raiserr.CriticalError(f"程序发生致命错误:{msg}", exit=True)
|
|
154
478
|
|
|
155
|
-
logger = Logger()
|
|
479
|
+
logger = Logger()
|
ErisPulse/mods.py
CHANGED
|
@@ -1,3 +1,334 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# 模块管理系统
|
|
3
|
+
|
|
4
|
+
提供模块的注册、状态管理和依赖解析功能。支持模块信息存储、状态切换和批量操作。
|
|
5
|
+
|
|
6
|
+
## 核心功能
|
|
7
|
+
1. 模块信息管理
|
|
8
|
+
2. 模块状态控制
|
|
9
|
+
3. 批量模块操作
|
|
10
|
+
4. 存储前缀自定义
|
|
11
|
+
5. 模块依赖管理
|
|
12
|
+
|
|
13
|
+
## API 文档
|
|
14
|
+
|
|
15
|
+
### 模块状态管理
|
|
16
|
+
#### set_module_status(module_name: str, status: bool) -> None
|
|
17
|
+
设置模块的启用状态。
|
|
18
|
+
- 参数:
|
|
19
|
+
- module_name: 模块名称
|
|
20
|
+
- status: 模块状态,True为启用,False为禁用
|
|
21
|
+
- 返回:
|
|
22
|
+
- None
|
|
23
|
+
- 示例:
|
|
24
|
+
```python
|
|
25
|
+
# 启用模块
|
|
26
|
+
sdk.mods.set_module_status("MyModule", True)
|
|
27
|
+
|
|
28
|
+
# 禁用模块
|
|
29
|
+
sdk.mods.set_module_status("MyModule", False)
|
|
30
|
+
|
|
31
|
+
# 条件性启用模块
|
|
32
|
+
if check_dependencies():
|
|
33
|
+
sdk.mods.set_module_status("MyModule", True)
|
|
34
|
+
else:
|
|
35
|
+
sdk.logger.warning("依赖检查失败,模块未启用")
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
#### get_module_status(module_name: str) -> bool
|
|
39
|
+
获取模块的启用状态。
|
|
40
|
+
- 参数:
|
|
41
|
+
- module_name: 模块名称
|
|
42
|
+
- 返回:
|
|
43
|
+
- bool: 模块状态,True为启用,False为禁用
|
|
44
|
+
- 示例:
|
|
45
|
+
```python
|
|
46
|
+
# 检查模块是否启用
|
|
47
|
+
if sdk.mods.get_module_status("MyModule"):
|
|
48
|
+
print("模块已启用")
|
|
49
|
+
else:
|
|
50
|
+
print("模块已禁用")
|
|
51
|
+
|
|
52
|
+
# 在条件中使用
|
|
53
|
+
if sdk.mods.get_module_status("DatabaseModule") and sdk.mods.get_module_status("NetworkModule"):
|
|
54
|
+
start_application()
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 模块信息管理
|
|
58
|
+
#### set_module(module_name: str, module_info: dict) -> None
|
|
59
|
+
设置模块信息。
|
|
60
|
+
- 参数:
|
|
61
|
+
- module_name: 模块名称
|
|
62
|
+
- module_info: 模块信息字典,包含模块的元数据和配置
|
|
63
|
+
- 返回:
|
|
64
|
+
- None
|
|
65
|
+
- 示例:
|
|
66
|
+
```python
|
|
67
|
+
# 设置基本模块信息
|
|
68
|
+
sdk.mods.set_module("MyModule", {
|
|
69
|
+
"status": True,
|
|
70
|
+
"info": {
|
|
71
|
+
"meta": {
|
|
72
|
+
"name": "MyModule",
|
|
73
|
+
"version": "1.0.0",
|
|
74
|
+
"description": "示例模块",
|
|
75
|
+
"author": "开发者"
|
|
76
|
+
},
|
|
77
|
+
"dependencies": {
|
|
78
|
+
"requires": ["CoreModule"],
|
|
79
|
+
"optional": ["OptionalModule"],
|
|
80
|
+
"pip": ["requests", "numpy"]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
# 更新现有模块信息
|
|
86
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
87
|
+
module_info["info"]["meta"]["version"] = "1.1.0"
|
|
88
|
+
sdk.mods.set_module("MyModule", module_info)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
#### get_module(module_name: str) -> dict | None
|
|
92
|
+
获取模块信息。
|
|
93
|
+
- 参数:
|
|
94
|
+
- module_name: 模块名称
|
|
95
|
+
- 返回:
|
|
96
|
+
- dict: 模块信息字典
|
|
97
|
+
- None: 如果模块不存在
|
|
98
|
+
- 示例:
|
|
99
|
+
```python
|
|
100
|
+
# 获取模块信息
|
|
101
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
102
|
+
if module_info:
|
|
103
|
+
print(f"模块版本: {module_info['info']['meta']['version']}")
|
|
104
|
+
print(f"模块描述: {module_info['info']['meta']['description']}")
|
|
105
|
+
print(f"模块状态: {'启用' if module_info['status'] else '禁用'}")
|
|
106
|
+
else:
|
|
107
|
+
print("模块不存在")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### get_all_modules() -> dict
|
|
111
|
+
获取所有模块信息。
|
|
112
|
+
- 参数: 无
|
|
113
|
+
- 返回:
|
|
114
|
+
- dict: 包含所有模块信息的字典,键为模块名,值为模块信息
|
|
115
|
+
- 示例:
|
|
116
|
+
```python
|
|
117
|
+
# 获取所有模块
|
|
118
|
+
all_modules = sdk.mods.get_all_modules()
|
|
119
|
+
|
|
120
|
+
# 统计启用和禁用的模块
|
|
121
|
+
enabled_count = 0
|
|
122
|
+
disabled_count = 0
|
|
123
|
+
for name, info in all_modules.items():
|
|
124
|
+
if info.get("status", False):
|
|
125
|
+
enabled_count += 1
|
|
126
|
+
else:
|
|
127
|
+
disabled_count += 1
|
|
128
|
+
|
|
129
|
+
print(f"已启用模块: {enabled_count}")
|
|
130
|
+
print(f"已禁用模块: {disabled_count}")
|
|
131
|
+
|
|
132
|
+
# 查找特定类型的模块
|
|
133
|
+
adapters = [name for name, info in all_modules.items()
|
|
134
|
+
if "adapter" in info.get("info", {}).get("meta", {}).get("tags", [])]
|
|
135
|
+
print(f"适配器模块: {adapters}")
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### update_module(module_name: str, module_info: dict) -> None
|
|
139
|
+
更新模块信息。
|
|
140
|
+
- 参数:
|
|
141
|
+
- module_name: 模块名称
|
|
142
|
+
- module_info: 更新后的模块信息字典
|
|
143
|
+
- 返回:
|
|
144
|
+
- None
|
|
145
|
+
- 示例:
|
|
146
|
+
```python
|
|
147
|
+
# 更新模块版本
|
|
148
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
149
|
+
module_info["info"]["meta"]["version"] = "1.2.0"
|
|
150
|
+
sdk.mods.update_module("MyModule", module_info)
|
|
151
|
+
|
|
152
|
+
# 添加新的配置项
|
|
153
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
154
|
+
if "config" not in module_info:
|
|
155
|
+
module_info["config"] = {}
|
|
156
|
+
module_info["config"]["debug_mode"] = True
|
|
157
|
+
sdk.mods.update_module("MyModule", module_info)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### remove_module(module_name: str) -> bool
|
|
161
|
+
删除模块。
|
|
162
|
+
- 参数:
|
|
163
|
+
- module_name: 模块名称
|
|
164
|
+
- 返回:
|
|
165
|
+
- bool: 是否成功删除
|
|
166
|
+
- 示例:
|
|
167
|
+
```python
|
|
168
|
+
# 删除模块
|
|
169
|
+
if sdk.mods.remove_module("OldModule"):
|
|
170
|
+
print("模块已成功删除")
|
|
171
|
+
else:
|
|
172
|
+
print("模块不存在或删除失败")
|
|
173
|
+
|
|
174
|
+
# 条件删除
|
|
175
|
+
if sdk.mods.get_module_status("TestModule") and is_test_environment():
|
|
176
|
+
sdk.mods.remove_module("TestModule")
|
|
177
|
+
print("测试模块已在生产环境中移除")
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### set_all_modules(modules_info: Dict[str, dict]) -> None
|
|
181
|
+
批量设置多个模块信息。
|
|
182
|
+
- 参数:
|
|
183
|
+
- modules_info: 模块信息字典的字典,键为模块名,值为模块信息
|
|
184
|
+
- 返回:
|
|
185
|
+
- None
|
|
186
|
+
- 示例:
|
|
187
|
+
```python
|
|
188
|
+
# 批量设置模块
|
|
189
|
+
sdk.mods.set_all_modules({
|
|
190
|
+
"Module1": {
|
|
191
|
+
"status": True,
|
|
192
|
+
"info": {"meta": {"name": "Module1", "version": "1.0.0"}}
|
|
193
|
+
},
|
|
194
|
+
"Module2": {
|
|
195
|
+
"status": True,
|
|
196
|
+
"info": {"meta": {"name": "Module2", "version": "1.0.0"}}
|
|
197
|
+
}
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
# 从配置文件加载模块信息
|
|
201
|
+
import json
|
|
202
|
+
with open("modules_config.json", "r") as f:
|
|
203
|
+
modules_config = json.load(f)
|
|
204
|
+
sdk.mods.set_all_modules(modules_config)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 前缀管理
|
|
208
|
+
#### update_prefixes(module_prefix: str = None, status_prefix: str = None) -> None
|
|
209
|
+
更新存储前缀。
|
|
210
|
+
- 参数:
|
|
211
|
+
- module_prefix: 模块存储前缀
|
|
212
|
+
- status_prefix: 状态存储前缀
|
|
213
|
+
- 返回:
|
|
214
|
+
- None
|
|
215
|
+
- 示例:
|
|
216
|
+
```python
|
|
217
|
+
# 更新模块前缀
|
|
218
|
+
sdk.mods.update_prefixes(module_prefix="custom.module.")
|
|
219
|
+
|
|
220
|
+
# 更新状态前缀
|
|
221
|
+
sdk.mods.update_prefixes(status_prefix="custom.status.")
|
|
222
|
+
|
|
223
|
+
# 同时更新两个前缀
|
|
224
|
+
sdk.mods.update_prefixes(
|
|
225
|
+
module_prefix="app.modules.",
|
|
226
|
+
status_prefix="app.status."
|
|
227
|
+
)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
#### module_prefix 属性
|
|
231
|
+
获取当前模块存储前缀。
|
|
232
|
+
- 返回:
|
|
233
|
+
- str: 当前模块存储前缀
|
|
234
|
+
- 示例:
|
|
235
|
+
```python
|
|
236
|
+
# 获取当前模块前缀
|
|
237
|
+
prefix = sdk.mods.module_prefix
|
|
238
|
+
print(f"当前模块前缀: {prefix}")
|
|
239
|
+
|
|
240
|
+
# 在自定义存储操作中使用
|
|
241
|
+
custom_key = f"{sdk.mods.module_prefix}custom.{module_name}"
|
|
242
|
+
sdk.env.set(custom_key, custom_data)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
#### status_prefix 属性
|
|
246
|
+
获取当前状态存储前缀。
|
|
247
|
+
- 返回:
|
|
248
|
+
- str: 当前状态存储前缀
|
|
249
|
+
- 示例:
|
|
250
|
+
```python
|
|
251
|
+
# 获取当前状态前缀
|
|
252
|
+
prefix = sdk.mods.status_prefix
|
|
253
|
+
print(f"当前状态前缀: {prefix}")
|
|
254
|
+
|
|
255
|
+
# 在自定义状态操作中使用
|
|
256
|
+
custom_status_key = f"{sdk.mods.status_prefix}custom.{module_name}"
|
|
257
|
+
sdk.env.set(custom_status_key, is_active)
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 最佳实践
|
|
261
|
+
1. 模块信息结构
|
|
262
|
+
```python
|
|
263
|
+
# 推荐的模块信息结构
|
|
264
|
+
module_info = {
|
|
265
|
+
"status": True, # 模块启用状态
|
|
266
|
+
"info": {
|
|
267
|
+
"meta": {
|
|
268
|
+
"name": "ModuleName", # 模块名称
|
|
269
|
+
"version": "1.0.0", # 模块版本
|
|
270
|
+
"description": "模块描述",
|
|
271
|
+
"author": "作者",
|
|
272
|
+
"license": "MIT",
|
|
273
|
+
"tags": ["tag1", "tag2"] # 分类标签
|
|
274
|
+
},
|
|
275
|
+
"dependencies": {
|
|
276
|
+
"requires": ["RequiredModule1"], # 必需依赖
|
|
277
|
+
"optional": ["OptionalModule1"], # 可选依赖
|
|
278
|
+
"pip": ["package1", "package2"] # pip包依赖
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"config": { # 模块配置(可选)
|
|
282
|
+
"setting1": "value1",
|
|
283
|
+
"setting2": "value2"
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
2. 模块状态管理
|
|
289
|
+
```python
|
|
290
|
+
# 根据条件启用/禁用模块
|
|
291
|
+
def toggle_modules_by_environment():
|
|
292
|
+
env_type = get_environment_type()
|
|
293
|
+
|
|
294
|
+
# 开发环境启用调试模块
|
|
295
|
+
if env_type == "development":
|
|
296
|
+
sdk.mods.set_module_status("DebugModule", True)
|
|
297
|
+
sdk.mods.set_module_status("PerformanceModule", False)
|
|
298
|
+
|
|
299
|
+
# 生产环境禁用调试模块,启用性能模块
|
|
300
|
+
elif env_type == "production":
|
|
301
|
+
sdk.mods.set_module_status("DebugModule", False)
|
|
302
|
+
sdk.mods.set_module_status("PerformanceModule", True)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
3. 模块依赖检查
|
|
306
|
+
```python
|
|
307
|
+
# 检查模块依赖
|
|
308
|
+
def check_module_dependencies(module_name):
|
|
309
|
+
module_info = sdk.mods.get_module(module_name)
|
|
310
|
+
if not module_info:
|
|
311
|
+
return False
|
|
312
|
+
|
|
313
|
+
dependencies = module_info.get("info", {}).get("dependencies", {}).get("requires", [])
|
|
314
|
+
|
|
315
|
+
for dep in dependencies:
|
|
316
|
+
dep_info = sdk.mods.get_module(dep)
|
|
317
|
+
if not dep_info or not dep_info.get("status", False):
|
|
318
|
+
sdk.logger.warning(f"模块 {module_name} 的依赖 {dep} 未启用或不存在")
|
|
319
|
+
return False
|
|
320
|
+
|
|
321
|
+
return True
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## 注意事项
|
|
325
|
+
1. 模块名称应唯一,避免冲突
|
|
326
|
+
2. 模块信息结构应保持一致,便于管理
|
|
327
|
+
3. 更新模块信息前应先获取现有信息,避免覆盖
|
|
328
|
+
4. 批量操作时注意性能影响
|
|
329
|
+
5. 自定义前缀时确保不与系统其他键冲突
|
|
330
|
+
"""
|
|
331
|
+
|
|
1
332
|
import json
|
|
2
333
|
from typing import Dict, Optional
|
|
3
334
|
|