ErisPulse 1.1.15__py3-none-any.whl → 1.2.0__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/db.py CHANGED
@@ -3,13 +3,6 @@
3
3
 
4
4
  提供键值存储、事务支持、快照和恢复功能,用于管理框架配置数据。基于SQLite实现持久化存储,支持复杂数据类型和原子操作。
5
5
 
6
- ## 核心功能
7
- 1. 键值存储
8
- 2. 事务支持
9
- 3. 数据库快照
10
- 4. 自动备份
11
- 5. 配置文件集成
12
-
13
6
  ## API 文档
14
7
 
15
8
  ### 基本操作
@@ -431,27 +424,6 @@ def safe_bulk_update(updates):
431
424
  raise
432
425
  ```
433
426
 
434
- ## 注意事项
435
-
436
- 1. 性能优化
437
- - 使用批量操作代替多次单独操作
438
- - 合理使用事务减少数据库操作次数
439
- - 避免存储过大的值,考虑分片存储
440
-
441
- 2. 数据安全
442
- - 定期创建快照备份重要数据
443
- - 使用事务确保数据一致性
444
- - 不要存储敏感信息(如密码)的明文
445
-
446
- 3. 配置管理
447
- - 使用有意义的键名和层次结构
448
- - 记录配置的更新历史
449
- - 定期清理不再使用的配置
450
-
451
- 4. 错误处理
452
- - 所有数据库操作都应该有错误处理
453
- - 重要操作前创建快照以便回滚
454
- - 记录所有关键操作的日志
455
427
  """
456
428
 
457
429
  import os
@@ -674,38 +646,6 @@ class EnvManager:
674
646
  for key, value in vars(env_module).items():
675
647
  if not key.startswith("__") and isinstance(value, (dict, list, str, int, float, bool)):
676
648
  self.set(key, value)
677
-
678
- def create_env_file_if_not_exists(self):
679
- env_file = Path("env.py")
680
- if not env_file.exists():
681
- content = '''# env.py
682
- # ErisPulse 环境配置文件
683
- # 本文件由 SDK 自动创建,请勿随意删除
684
- # 配置项可通过 sdk.env.get(key, default) 获取,或使用 sdk.env.set(key, value) 设置
685
- # 你也可以像写普通变量一样直接定义配置项,例如:
686
- #
687
- # MY_CONFIG = "value"
688
- # MY_CONFIG_2 = {"key": "value"}
689
- # MY_CONFIG_3 = [1, 2, 3]
690
- #
691
- # sdk.env.set("MY_CONFIG", "value")
692
- # sdk.env.set("MY_CONFIG_2", {"key": "value"})
693
- # sdk.env.set("MY_CONFIG_3", [1, 2, 3])
694
- #
695
- # 这些变量会自动被加载到 SDK 的配置系统中,可通过 sdk.env.MY_CONFIG 或 sdk.env.get("MY_CONFIG") 访问。
696
-
697
- from ErisPulse import sdk
698
- '''
699
- try:
700
- with open(env_file, "w", encoding="utf-8") as f:
701
- f.write(content)
702
- return True
703
- except Exception as e:
704
- from . import sdk
705
- sdk.logger.error(f"无法创建 env.py 文件: {e}")
706
- return False
707
- return False
708
-
709
649
  def __getattr__(self, key):
710
650
  try:
711
651
  return self.get(key)
ErisPulse/logger.py CHANGED
@@ -3,62 +3,16 @@
3
3
 
4
4
  提供模块化、多级别的日志记录功能,支持内存存储和文件输出。实现了模块级别的日志控制、彩色输出和灵活的存储选项。
5
5
 
6
- ## 核心功能
7
- 1. 多级别日志记录
8
- 2. 模块级别日志控制
9
- 3. 内存日志存储
10
- 4. 文件输出支持
11
- 5. 自动调用者识别
12
- 6. 异常捕获装饰器
13
-
14
6
  ## API 文档
15
7
 
16
8
  ### 基本日志操作
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
9
 
30
- # 带有变量的调试信息
31
- config_value = get_config("timeout")
32
- sdk.logger.debug(f"读取配置: timeout = {config_value}")
10
+ 以debug为例:
11
+ > 此外,还有其他级别的日志记录函数,如info, warning, error, critical等,用法相同。
33
12
 
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("应用已启动")
13
+ debug(msg: str, *args, **kwargs) -> None
51
14
 
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
- 记录警告级别的日志信息。
15
+ 记录调试级别的日志信息。
62
16
  - 参数:
63
17
  - msg: 日志消息
64
18
  - *args: 传递给底层logger的位置参数
@@ -66,64 +20,9 @@ sdk.logger.info("数据导入完成,共处理 %d 条记录", record_count)
66
20
  - 返回:
67
21
  - None
68
22
  - 示例:
69
- ```python
70
- # 基本警告信息
71
- sdk.logger.warning("配置文件未找到,使用默认配置")
72
23
 
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
24
  ```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)
25
+ sdk.logger.debug("这是一条日志")
127
26
  ```
128
27
 
129
28
  ### 日志级别控制
@@ -214,118 +113,11 @@ import atexit
214
113
  atexit.register(lambda: sdk.logger.save_logs("final_logs.txt"))
215
114
  ```
216
115
 
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
116
  """
324
117
 
325
118
  import logging
326
119
  import inspect
327
120
  import datetime
328
- import functools
329
121
 
330
122
  class Logger:
331
123
  def __init__(self):
@@ -395,34 +187,6 @@ class Logger:
395
187
  self._logger.error(f"无法保存日志到 {p}: {e}。")
396
188
  raise e
397
189
 
398
- def catch(self, func_or_level=None, level="error"):
399
- if isinstance(func_or_level, str):
400
- return lambda func: self.catch(func, level=func_or_level)
401
- if func_or_level is None:
402
- return lambda func: self.catch(func, level=level)
403
- func = func_or_level
404
-
405
- @functools.wraps(func)
406
- def wrapper(*args, **kwargs):
407
- try:
408
- return func(*args, **kwargs)
409
- except Exception as e:
410
- import traceback
411
- error_info = traceback.format_exc()
412
-
413
- module_name = func.__module__
414
- if module_name == "__main__":
415
- module_name = "Main"
416
- func_name = func.__name__
417
-
418
- error_msg = f"Exception in {func_name}: {str(e)}\n{error_info}"
419
-
420
- log_method = getattr(self, level, self.error)
421
- log_method(error_msg)
422
-
423
- return None
424
- return wrapper
425
-
426
190
  def _save_in_memory(self, ModuleName, msg):
427
191
  if ModuleName not in self._logs:
428
192
  self._logs[ModuleName] = []
@@ -441,6 +205,8 @@ class Logger:
441
205
  module_name = "Main"
442
206
  if module_name.endswith(".Core"):
443
207
  module_name = module_name[:-5]
208
+ if module_name.startswith("ErisPulse"):
209
+ module_name = "ErisPulse"
444
210
  return module_name
445
211
 
446
212
  def debug(self, msg, *args, **kwargs):
ErisPulse/mods.py CHANGED
@@ -3,13 +3,6 @@
3
3
 
4
4
  提供模块的注册、状态管理和依赖解析功能。支持模块信息存储、状态切换和批量操作。
5
5
 
6
- ## 核心功能
7
- 1. 模块信息管理
8
- 2. 模块状态控制
9
- 3. 批量模块操作
10
- 4. 存储前缀自定义
11
- 5. 模块依赖管理
12
-
13
6
  ## API 文档
14
7
 
15
8
  ### 模块状态管理
@@ -257,76 +250,6 @@ custom_status_key = f"{sdk.mods.status_prefix}custom.{module_name}"
257
250
  sdk.env.set(custom_status_key, is_active)
258
251
  ```
259
252
 
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
253
  """
331
254
 
332
255
  import json
ErisPulse/raiserr.py CHANGED
@@ -3,13 +3,6 @@
3
3
 
4
4
  提供错误类型注册、抛出和管理功能,集成全局异常处理。支持自定义错误类型、错误链追踪和全局异常捕获。
5
5
 
6
- ## 核心功能
7
- 1. 错误类型注册和管理
8
- 2. 动态错误抛出
9
- 3. 全局异常处理
10
- 4. 错误信息追踪
11
- 5. 异步错误处理
12
-
13
6
  ## API 文档
14
7
 
15
8
  ### 错误注册
@@ -73,87 +66,6 @@ except Exception as e:
73
66
  print(f"捕获到错误: {e}")
74
67
  ```
75
68
 
76
- ### 全局异常处理
77
- #### global_exception_handler(exc_type: type, exc_value: Exception, exc_traceback: traceback)
78
- 全局同步异常处理器。
79
- - 参数:
80
- - exc_type: 异常类型
81
- - exc_value: 异常值
82
- - exc_traceback: 异常追踪信息
83
- - 示例:
84
- ```python
85
- # 系统会自动捕获未处理的异常
86
- def risky_operation():
87
- raise Exception("未处理的异常")
88
-
89
- # 异常会被global_exception_handler捕获并处理
90
- risky_operation()
91
- ```
92
-
93
- #### async_exception_handler(loop: asyncio.AbstractEventLoop, context: dict)
94
- 全局异步异常处理器。
95
- - 参数:
96
- - loop: 事件循环实例
97
- - context: 异常上下文信息
98
- - 示例:
99
- ```python
100
- async def async_operation():
101
- raise Exception("异步操作错误")
102
-
103
- # 异常会被async_exception_handler捕获并处理
104
- asyncio.create_task(async_operation())
105
- ```
106
-
107
- ## 最佳实践
108
- 1. 错误类型注册
109
- ```python
110
- # 为特定功能模块注册错误类型
111
- sdk.raiserr.register("DatabaseError", "数据库操作错误")
112
- sdk.raiserr.register("NetworkError", "网络连接错误")
113
- sdk.raiserr.register("ValidationError", "数据验证错误")
114
-
115
- # 使用继承关系组织错误类型
116
- class ModuleError(Exception):
117
- pass
118
- sdk.raiserr.register("ConfigError", "配置错误", ModuleError)
119
- sdk.raiserr.register("PluginError", "插件错误", ModuleError)
120
- ```
121
-
122
- 2. 错误处理流程
123
- ```python
124
- def process_data(data):
125
- try:
126
- if not data:
127
- sdk.raiserr.ValidationError("数据不能为空")
128
- if not isinstance(data, dict):
129
- sdk.raiserr.ValidationError("数据必须是字典类型")
130
-
131
- # 处理数据...
132
-
133
- except Exception as e:
134
- # 错误会被自动记录并处理
135
- sdk.raiserr.ProcessingError(f"数据处理失败: {str(e)}")
136
- ```
137
-
138
- 3. 异步环境使用
139
- ```python
140
- async def async_task():
141
- try:
142
- result = await some_async_operation()
143
- if not result.success:
144
- sdk.raiserr.AsyncOperationError("异步操作失败")
145
- except Exception as e:
146
- # 异步错误会被async_exception_handler捕获
147
- raise
148
- ```
149
-
150
- ## 注意事项
151
- 1. 错误类型命名应具有描述性,便于理解错误来源
152
- 2. 错误消息应包含足够的上下文信息,便于调试
153
- 3. 适当使用exit参数,只在致命错误时设置为True
154
- 4. 避免在全局异常处理器中执行耗时操作
155
- 5. 确保异步代码中的错误能够被正确捕获和处理
156
-
157
69
  """
158
70
 
159
71
  import sys
@@ -209,24 +121,16 @@ raiserr = Error()
209
121
 
210
122
  # 全局异常处理器
211
123
  def global_exception_handler(exc_type, exc_value, exc_traceback):
212
- from .logger import logger
213
124
  error_message = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
214
- logger.error(f"未处理的异常被捕获:\n{error_message}")
215
- raiserr.CaughtExternalError(
216
- 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}"
217
127
  )
218
- sys.excepthook = global_exception_handler
219
-
220
128
  def async_exception_handler(loop, context):
221
- from .logger import logger
222
129
  exception = context.get('exception')
223
- message = context.get('message', 'Async error')
224
- if exception:
225
- tb = ''.join(traceback.format_exception(type(exception), exception, exception.__traceback__))
226
- logger.error(f"异步任务异常: {message}\n{tb}")
227
- raiserr.CaughtExternalError(
228
- f"检测到异步任务异常,请优先使用 sdk.raiserr 抛出错误。\n原始异常: {type(exception).__name__}: {exception}\nTraceback:\n{tb}"
229
- )
230
- else:
231
- 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
232
136
  asyncio.get_event_loop().set_exception_handler(async_exception_handler)