ErisPulse 2.2.1.dev0__py3-none-any.whl → 2.3.0.dev5__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.
Files changed (35) hide show
  1. ErisPulse/Core/Bases/__init__.py +14 -0
  2. ErisPulse/Core/Bases/adapter.py +196 -0
  3. ErisPulse/Core/Bases/module.py +54 -0
  4. ErisPulse/Core/Event/__init__.py +14 -0
  5. ErisPulse/Core/Event/base.py +15 -2
  6. ErisPulse/Core/Event/command.py +21 -2
  7. ErisPulse/Core/Event/message.py +15 -0
  8. ErisPulse/Core/Event/meta.py +15 -0
  9. ErisPulse/Core/Event/notice.py +15 -0
  10. ErisPulse/Core/Event/request.py +16 -1
  11. ErisPulse/Core/__init__.py +38 -19
  12. ErisPulse/Core/{erispulse_config.py → _self_config.py} +16 -3
  13. ErisPulse/Core/adapter.py +374 -377
  14. ErisPulse/Core/config.py +137 -38
  15. ErisPulse/Core/exceptions.py +6 -1
  16. ErisPulse/Core/lifecycle.py +167 -0
  17. ErisPulse/Core/logger.py +97 -49
  18. ErisPulse/Core/module.py +279 -56
  19. ErisPulse/Core/router.py +112 -23
  20. ErisPulse/Core/storage.py +258 -77
  21. ErisPulse/Core/ux.py +664 -0
  22. ErisPulse/__init__.py +587 -242
  23. ErisPulse/__main__.py +1 -1999
  24. ErisPulse/utils/__init__.py +15 -0
  25. ErisPulse/utils/cli.py +1102 -0
  26. ErisPulse/utils/package_manager.py +847 -0
  27. ErisPulse/utils/reload_handler.py +135 -0
  28. {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/METADATA +24 -6
  29. erispulse-2.3.0.dev5.dist-info/RECORD +33 -0
  30. {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/WHEEL +1 -1
  31. {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/licenses/LICENSE +1 -1
  32. ErisPulse/Core/env.py +0 -15
  33. ErisPulse/Core/module_registry.py +0 -227
  34. erispulse-2.2.1.dev0.dist-info/RECORD +0 -26
  35. {erispulse-2.2.1.dev0.dist-info → erispulse-2.3.0.dev5.dist-info}/entry_points.txt +0 -0
ErisPulse/Core/logger.py CHANGED
@@ -13,22 +13,23 @@ ErisPulse 日志系统
13
13
  import logging
14
14
  import inspect
15
15
  import datetime
16
- from typing import List, Dict, Any, Optional, Union, Type, Set, Tuple, FrozenSet
17
16
  from rich.logging import RichHandler
18
17
  from rich.console import Console
19
18
 
19
+
20
20
  class Logger:
21
21
  """
22
22
  日志管理器
23
-
23
+
24
24
  提供模块化日志记录和存储功能
25
-
25
+
26
26
  {!--< tips >!--}
27
27
  1. 使用set_module_level设置模块日志级别
28
28
  2. 使用get_logs获取历史日志
29
29
  3. 支持标准日志级别(DEBUG, INFO等)
30
30
  {!--< /tips >!--}
31
31
  """
32
+
32
33
  def __init__(self):
33
34
  self._max_logs = 1000
34
35
  self._logs = {}
@@ -42,15 +43,15 @@ class Logger:
42
43
  show_time=False,
43
44
  show_level=True,
44
45
  show_path=False,
45
- markup=False
46
+ markup=False,
46
47
  )
47
48
  self._logger.addHandler(console_handler)
48
49
  self._setup_config()
49
-
50
+
50
51
  def set_memory_limit(self, limit: int) -> bool:
51
52
  """
52
53
  设置日志内存存储上限
53
-
54
+
54
55
  :param limit: 日志存储上限
55
56
  :return: bool 设置是否成功
56
57
  """
@@ -68,7 +69,7 @@ class Logger:
68
69
  def set_level(self, level: str) -> bool:
69
70
  """
70
71
  设置全局日志级别
71
-
72
+
72
73
  :param level: 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
73
74
  :return: bool 设置是否成功
74
75
  """
@@ -78,7 +79,7 @@ class Logger:
78
79
  self._logger.setLevel(getattr(logging, level))
79
80
  return True
80
81
  return False
81
- except Exception as e:
82
+ except Exception:
82
83
  self._logger.error(f"无效的日志等级: {level}")
83
84
  return False
84
85
 
@@ -90,8 +91,9 @@ class Logger:
90
91
  :param level: 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
91
92
  :return: bool 设置是否成功
92
93
  """
93
- from .module_registry import module_registry
94
- if not module_registry.get_module_status(module_name):
94
+ from .module import module
95
+
96
+ if not module.is_enabled(module_name):
95
97
  self._logger.warning(f"模块 {module_name} 未启用,无法设置日志等级。")
96
98
  return False
97
99
  level = level.upper()
@@ -119,7 +121,7 @@ class Logger:
119
121
 
120
122
  for p in path:
121
123
  try:
122
- file_handler = logging.FileHandler(p, encoding='utf-8')
124
+ file_handler = logging.FileHandler(p, encoding="utf-8")
123
125
  # 使用自定义格式化器去除rich markup标签
124
126
  file_handler.setFormatter(logging.Formatter("[%(name)s] %(message)s"))
125
127
  self._logger.addHandler(file_handler)
@@ -127,20 +129,23 @@ class Logger:
127
129
  except Exception as e:
128
130
  self._logger.error(f"无法设置日志文件 {p}: {e}")
129
131
  return False
130
-
132
+
133
+ self._logger.warning("出现极端错误,无法设置日志文件。")
134
+ return False
135
+
131
136
  def save_logs(self, path) -> bool:
132
137
  """
133
138
  保存所有在内存中记录的日志
134
-
139
+
135
140
  :param path: 日志文件路径 Str/List
136
141
  :return: bool 设置是否成功
137
142
  """
138
- if self._logs == None:
143
+ if self._logs is None:
139
144
  self._logger.warning("没有log记录可供保存。")
140
145
  return False
141
146
  if isinstance(path, str):
142
147
  path = [path]
143
-
148
+
144
149
  for p in path:
145
150
  try:
146
151
  with open(p, "w", encoding="utf-8") as file:
@@ -154,7 +159,10 @@ class Logger:
154
159
  self._logger.error(f"无法保存日志到 {p}: {e}。")
155
160
  return False
156
161
 
157
- def get_logs(self, module_name: str = None) -> dict:
162
+ self._logger.warning("出现极端错误,无法保存日志。")
163
+ return False
164
+
165
+ def get_logs(self, module_name: str = "Unknown") -> dict:
158
166
  """
159
167
  获取日志内容
160
168
 
@@ -164,21 +172,22 @@ class Logger:
164
172
  if module_name:
165
173
  return {module_name: self._logs.get(module_name, [])}
166
174
  return {k: v.copy() for k, v in self._logs.items()}
167
-
175
+
168
176
  def _save_in_memory(self, ModuleName, msg):
169
177
  if ModuleName not in self._logs:
170
178
  self._logs[ModuleName] = []
171
-
179
+
172
180
  # 检查日志数量是否超过限制
173
181
  if len(self._logs[ModuleName]) >= self._max_logs:
174
182
  self._logs[ModuleName].pop(0)
175
-
183
+
176
184
  timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
177
185
  msg = f"{timestamp} - {msg}"
178
186
  self._logs[ModuleName].append(msg)
179
187
 
180
188
  def _setup_config(self):
181
- from .erispulse_config import get_logger_config
189
+ from ._self_config import get_logger_config
190
+
182
191
  logger_config = get_logger_config()
183
192
  if "level" in logger_config:
184
193
  self.set_level(logger_config["level"])
@@ -186,26 +195,41 @@ class Logger:
186
195
  self.set_output_file(logger_config["log_files"])
187
196
  if "memory_limit" in logger_config:
188
197
  self.set_memory_limit(logger_config["memory_limit"])
189
-
198
+
190
199
  def _get_effective_level(self, module_name):
191
200
  return self._module_levels.get(module_name, self._logger.level)
192
201
 
202
+
193
203
  def _get_caller(self):
194
- frame = inspect.currentframe().f_back.f_back
195
- module = inspect.getmodule(frame)
196
- module_name = module.__name__
197
- if module_name == "__main__":
198
- module_name = "Main"
199
- if module_name.endswith(".Core"):
200
- module_name = module_name[:-5]
201
- if module_name.startswith("ErisPulse"):
202
- module_name = "ErisPulse"
203
- return module_name
204
-
205
- def get_child(self, child_name: str = None):
204
+ try:
205
+ frame = inspect.currentframe()
206
+ # 安全地获取调用栈帧
207
+ if frame is None or frame.f_back is None or frame.f_back.f_back is None:
208
+ return "Unknown"
209
+
210
+ frame = frame.f_back.f_back
211
+ module = inspect.getmodule(frame)
212
+
213
+ # 处理模块为None的情况
214
+ if module is None:
215
+ return "Unknown"
216
+
217
+ module_name = module.__name__
218
+ if module_name == "__main__":
219
+ module_name = "Main"
220
+ elif module_name.endswith(".Core"):
221
+ module_name = module_name[:-5]
222
+ elif module_name.startswith("ErisPulse"):
223
+ module_name = "ErisPulse"
224
+
225
+ return module_name
226
+ except Exception:
227
+ return "Unknown"
228
+
229
+ def get_child(self, child_name: str = "UnknownChild"):
206
230
  """
207
231
  获取子日志记录器
208
-
232
+
209
233
  :param child_name: 子模块名称(可选)
210
234
  :return: LoggerChild 子日志记录器实例
211
235
  """
@@ -241,60 +265,86 @@ class Logger:
241
265
  self._logger.error(f"[{caller_module}] {msg}", *args, **kwargs)
242
266
 
243
267
  def critical(self, msg, *args, **kwargs):
268
+ """
269
+ 记录 CRITICAL 级别日志
270
+ 这是最高级别的日志,表示严重的系统错误
271
+ 注意:此方法不会触发程序崩溃,仅记录日志
272
+
273
+ {!--< tips >!--}
274
+ 1. 这是最高级别的日志,表示严重系统错误
275
+ 2. 不会触发程序崩溃,如需终止程序请显式调用 sys.exit()
276
+ 3. 会在日志文件中添加 CRITICAL 标记便于后续分析
277
+ {!--< /tips >!--}
278
+ """
244
279
  caller_module = self._get_caller()
245
280
  if self._get_effective_level(caller_module) <= logging.CRITICAL:
246
281
  self._save_in_memory(caller_module, msg)
247
282
  self._logger.critical(f"[{caller_module}] {msg}", *args, **kwargs)
248
- raise Exception(msg)
249
283
 
250
284
 
251
285
  class LoggerChild:
252
286
  """
253
287
  子日志记录器
254
-
288
+
255
289
  用于创建具有特定名称的子日志记录器,仅改变模块名称,其他功能全部委托给父日志记录器
256
290
  """
257
-
291
+
258
292
  def __init__(self, parent_logger: Logger, name: str):
259
293
  """
260
294
  初始化子日志记录器
261
-
295
+
262
296
  :param parent_logger: 父日志记录器实例
263
297
  :param name: 子日志记录器名称
264
298
  """
265
299
  self._parent = parent_logger
266
300
  self._name = name
267
-
301
+
268
302
  def debug(self, msg, *args, **kwargs):
269
- if self._parent._get_effective_level(self._name.split('.')[0]) <= logging.DEBUG:
303
+ if self._parent._get_effective_level(self._name.split(".")[0]) <= logging.DEBUG:
270
304
  self._parent._save_in_memory(self._name, msg)
271
305
  self._parent._logger.debug(f"[{self._name}] {msg}", *args, **kwargs)
272
306
 
273
307
  def info(self, msg, *args, **kwargs):
274
- if self._parent._get_effective_level(self._name.split('.')[0]) <= logging.INFO:
308
+ if self._parent._get_effective_level(self._name.split(".")[0]) <= logging.INFO:
275
309
  self._parent._save_in_memory(self._name, msg)
276
310
  self._parent._logger.info(f"[{self._name}] {msg}", *args, **kwargs)
277
311
 
278
312
  def warning(self, msg, *args, **kwargs):
279
- if self._parent._get_effective_level(self._name.split('.')[0]) <= logging.WARNING:
313
+ if (
314
+ self._parent._get_effective_level(self._name.split(".")[0])
315
+ <= logging.WARNING
316
+ ):
280
317
  self._parent._save_in_memory(self._name, msg)
281
318
  self._parent._logger.warning(f"[{self._name}] {msg}", *args, **kwargs)
282
319
 
283
320
  def error(self, msg, *args, **kwargs):
284
- if self._parent._get_effective_level(self._name.split('.')[0]) <= logging.ERROR:
321
+ if self._parent._get_effective_level(self._name.split(".")[0]) <= logging.ERROR:
285
322
  self._parent._save_in_memory(self._name, msg)
286
323
  self._parent._logger.error(f"[{self._name}] {msg}", *args, **kwargs)
287
324
 
288
325
  def critical(self, msg, *args, **kwargs):
289
- if self._parent._get_effective_level(self._name.split('.')[0]) <= logging.CRITICAL:
326
+ """
327
+ 记录 CRITICAL 级别日志
328
+ 这是最高级别的日志,表示严重的系统错误
329
+ 注意:此方法不会触发程序崩溃,仅记录日志
330
+
331
+ {!--< tips >!--}
332
+ 1. 这是最高级别的日志,表示严重系统错误
333
+ 2. 不会触发程序崩溃,如需终止程序请显式调用 sys.exit()
334
+ 3. 会在日志文件中添加 CRITICAL 标记便于后续分析
335
+ {!--< /tips >!--}
336
+ """
337
+ if (
338
+ self._parent._get_effective_level(self._name.split(".")[0])
339
+ <= logging.CRITICAL
340
+ ):
290
341
  self._parent._save_in_memory(self._name, msg)
291
342
  self._parent._logger.critical(f"[{self._name}] {msg}", *args, **kwargs)
292
- raise Exception(msg)
293
343
 
294
344
  def get_child(self, child_name: str):
295
345
  """
296
346
  获取子日志记录器的子记录器
297
-
347
+
298
348
  :param child_name: 子模块名称
299
349
  :return: LoggerChild 子日志记录器实例
300
350
  """
@@ -304,6 +354,4 @@ class LoggerChild:
304
354
 
305
355
  logger = Logger()
306
356
 
307
- __all__ = [
308
- "logger"
309
- ]
357
+ __all__ = ["logger"]