ErisPulse 2.3.2__py3-none-any.whl → 2.3.3__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/Bases/__init__.pyi +14 -0
- ErisPulse/Core/Bases/adapter.py +13 -1
- ErisPulse/Core/Bases/adapter.pyi +140 -0
- ErisPulse/Core/Bases/module.pyi +52 -0
- ErisPulse/Core/Event/__init__.py +3 -1
- ErisPulse/Core/Event/__init__.pyi +26 -0
- ErisPulse/Core/Event/base.py +5 -0
- ErisPulse/Core/Event/base.pyi +62 -0
- ErisPulse/Core/Event/command.py +66 -17
- ErisPulse/Core/Event/command.pyi +113 -0
- ErisPulse/Core/Event/exceptions.pyi +43 -0
- ErisPulse/Core/Event/message.pyi +93 -0
- ErisPulse/Core/Event/meta.pyi +92 -0
- ErisPulse/Core/Event/notice.pyi +108 -0
- ErisPulse/Core/Event/request.pyi +76 -0
- ErisPulse/Core/Event/wrapper.py +592 -0
- ErisPulse/Core/Event/wrapper.pyi +404 -0
- ErisPulse/Core/__init__.py +16 -8
- ErisPulse/Core/__init__.pyi +17 -0
- ErisPulse/Core/_self_config.pyi +72 -0
- ErisPulse/Core/adapter.pyi +229 -0
- ErisPulse/Core/config.pyi +70 -0
- ErisPulse/Core/exceptions.pyi +60 -0
- ErisPulse/Core/lifecycle.py +6 -1
- ErisPulse/Core/lifecycle.pyi +92 -0
- ErisPulse/Core/logger.pyi +168 -0
- ErisPulse/Core/module.pyi +178 -0
- ErisPulse/Core/router.pyi +120 -0
- ErisPulse/Core/storage.pyi +273 -0
- ErisPulse/Core/ux.pyi +94 -0
- ErisPulse/__init__.py +10 -5
- ErisPulse/__init__.pyi +310 -0
- ErisPulse/__main__.py +0 -5
- ErisPulse/__main__.pyi +24 -0
- ErisPulse/sdk_protocol.py +150 -0
- ErisPulse/sdk_protocol.pyi +100 -0
- ErisPulse/utils/__init__.pyi +16 -0
- ErisPulse/utils/cli.pyi +145 -0
- ErisPulse/utils/console.pyi +20 -0
- ErisPulse/utils/package_manager.pyi +224 -0
- ErisPulse/utils/reload_handler.pyi +64 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Bases/__init__.pyi +14 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Bases/adapter.pyi +140 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Bases/module.pyi +52 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/__init__.pyi +26 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/base.pyi +62 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/command.pyi +113 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/exceptions.pyi +43 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/message.pyi +93 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/meta.pyi +92 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/notice.pyi +108 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/request.pyi +76 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/Event/wrapper.pyi +404 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/__init__.pyi +17 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/_self_config.pyi +72 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/adapter.pyi +229 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/config.pyi +70 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/exceptions.pyi +60 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/lifecycle.pyi +92 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/logger.pyi +168 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/module.pyi +178 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/router.pyi +120 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/storage.pyi +273 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/Core/ux.pyi +94 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/__init__.pyi +310 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/__main__.pyi +24 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/sdk_protocol.pyi +100 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/utils/__init__.pyi +16 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/utils/cli.pyi +145 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/utils/console.pyi +20 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/utils/package_manager.pyi +224 -0
- erispulse-2.3.3.data/data/ErisPulse-stubs/ErisPulse/utils/reload_handler.pyi +64 -0
- {erispulse-2.3.2.dist-info → erispulse-2.3.3.dist-info}/METADATA +1 -3
- erispulse-2.3.3.dist-info/RECORD +98 -0
- erispulse-2.3.2.dist-info/RECORD +0 -34
- {erispulse-2.3.2.dist-info → erispulse-2.3.3.dist-info}/WHEEL +0 -0
- {erispulse-2.3.2.dist-info → erispulse-2.3.3.dist-info}/entry_points.txt +0 -0
- {erispulse-2.3.2.dist-info → erispulse-2.3.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for module.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 模块系统
|
|
9
|
+
|
|
10
|
+
提供标准化的模块注册、加载和管理功能,与适配器系统保持一致的设计模式
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
from typing import Any, Dict, List, Type, Optional
|
|
15
|
+
from .logger import logger
|
|
16
|
+
from .config import config
|
|
17
|
+
from .Bases import BaseModule
|
|
18
|
+
from .lifecycle import lifecycle
|
|
19
|
+
|
|
20
|
+
class ModuleManager:
|
|
21
|
+
"""
|
|
22
|
+
模块管理器
|
|
23
|
+
|
|
24
|
+
提供标准化的模块注册、加载和管理功能,模仿适配器管理器的模式
|
|
25
|
+
|
|
26
|
+
{!--< tips >!--}
|
|
27
|
+
1. 使用register方法注册模块类
|
|
28
|
+
2. 使用load/unload方法加载/卸载模块
|
|
29
|
+
3. 通过get方法获取模块实例
|
|
30
|
+
{!--< /tips >!--}
|
|
31
|
+
"""
|
|
32
|
+
def __init__(self: None) -> ...:
|
|
33
|
+
...
|
|
34
|
+
def register(self: object, module_name: str, module_class: Type, module_info: Optional[Dict] = ...) -> bool:
|
|
35
|
+
"""
|
|
36
|
+
注册模块类
|
|
37
|
+
|
|
38
|
+
:param module_name: 模块名称
|
|
39
|
+
:param module_class: 模块类
|
|
40
|
+
:param module_info: 模块信息
|
|
41
|
+
:return: 是否注册成功
|
|
42
|
+
|
|
43
|
+
:raises TypeError: 当模块类无效时抛出
|
|
44
|
+
|
|
45
|
+
:example:
|
|
46
|
+
>>> module.register("MyModule", MyModuleClass)
|
|
47
|
+
"""
|
|
48
|
+
...
|
|
49
|
+
async def load(self: object, module_name: str) -> bool:
|
|
50
|
+
"""
|
|
51
|
+
加载指定模块(标准化加载逻辑)
|
|
52
|
+
|
|
53
|
+
:param module_name: 模块名称
|
|
54
|
+
:return: 是否加载成功
|
|
55
|
+
|
|
56
|
+
:example:
|
|
57
|
+
>>> await module.load("MyModule")
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
async def unload(self: object, module_name: str = ...) -> bool:
|
|
61
|
+
"""
|
|
62
|
+
卸载指定模块或所有模块
|
|
63
|
+
|
|
64
|
+
:param module_name: 模块名称,如果为None则卸载所有模块
|
|
65
|
+
:return: 是否卸载成功
|
|
66
|
+
|
|
67
|
+
:example:
|
|
68
|
+
>>> await module.unload("MyModule")
|
|
69
|
+
>>> await module.unload() # 卸载所有模块
|
|
70
|
+
"""
|
|
71
|
+
...
|
|
72
|
+
def get(self: object, module_name: str) -> Any:
|
|
73
|
+
"""
|
|
74
|
+
获取模块实例
|
|
75
|
+
|
|
76
|
+
:param module_name: 模块名称
|
|
77
|
+
:return: 模块实例或None
|
|
78
|
+
|
|
79
|
+
:example:
|
|
80
|
+
>>> my_module = module.get("MyModule")
|
|
81
|
+
"""
|
|
82
|
+
...
|
|
83
|
+
def exists(self: object, module_name: str) -> bool:
|
|
84
|
+
"""
|
|
85
|
+
检查模块是否存在(在配置中注册)
|
|
86
|
+
|
|
87
|
+
:param module_name: [str] 模块名称
|
|
88
|
+
:return: [bool] 模块是否存在
|
|
89
|
+
"""
|
|
90
|
+
...
|
|
91
|
+
def is_loaded(self: object, module_name: str) -> bool:
|
|
92
|
+
"""
|
|
93
|
+
检查模块是否已加载
|
|
94
|
+
|
|
95
|
+
:param module_name: 模块名称
|
|
96
|
+
:return: 模块是否已加载
|
|
97
|
+
|
|
98
|
+
:example:
|
|
99
|
+
>>> if module.is_loaded("MyModule"): ...
|
|
100
|
+
"""
|
|
101
|
+
...
|
|
102
|
+
def list_registered(self: object) -> List[str]:
|
|
103
|
+
"""
|
|
104
|
+
列出所有已注册的模块
|
|
105
|
+
|
|
106
|
+
:return: 模块名称列表
|
|
107
|
+
|
|
108
|
+
:example:
|
|
109
|
+
>>> registered = module.list_registered()
|
|
110
|
+
"""
|
|
111
|
+
...
|
|
112
|
+
def list_loaded(self: object) -> List[str]:
|
|
113
|
+
"""
|
|
114
|
+
列出所有已加载的模块
|
|
115
|
+
|
|
116
|
+
:return: 模块名称列表
|
|
117
|
+
|
|
118
|
+
:example:
|
|
119
|
+
>>> loaded = module.list_loaded()
|
|
120
|
+
"""
|
|
121
|
+
...
|
|
122
|
+
def _config_register(self: object, module_name: str, enabled: bool = ...) -> bool:
|
|
123
|
+
"""
|
|
124
|
+
注册新模块信息
|
|
125
|
+
|
|
126
|
+
:param module_name: [str] 模块名称
|
|
127
|
+
:param enabled: [bool] 是否启用模块
|
|
128
|
+
:return: [bool] 操作是否成功
|
|
129
|
+
"""
|
|
130
|
+
...
|
|
131
|
+
def is_enabled(self: object, module_name: str) -> bool:
|
|
132
|
+
"""
|
|
133
|
+
检查模块是否启用
|
|
134
|
+
|
|
135
|
+
:param module_name: [str] 模块名称
|
|
136
|
+
:return: [bool] 模块是否启用
|
|
137
|
+
"""
|
|
138
|
+
...
|
|
139
|
+
def enable(self: object, module_name: str) -> bool:
|
|
140
|
+
"""
|
|
141
|
+
启用模块
|
|
142
|
+
|
|
143
|
+
:param module_name: [str] 模块名称
|
|
144
|
+
:return: [bool] 操作是否成功
|
|
145
|
+
"""
|
|
146
|
+
...
|
|
147
|
+
def disable(self: object, module_name: str) -> bool:
|
|
148
|
+
"""
|
|
149
|
+
禁用模块
|
|
150
|
+
|
|
151
|
+
:param module_name: [str] 模块名称
|
|
152
|
+
:return: [bool] 操作是否成功
|
|
153
|
+
"""
|
|
154
|
+
...
|
|
155
|
+
def list_modules(self: object) -> Dict[(str, bool)]:
|
|
156
|
+
"""
|
|
157
|
+
列出所有模块状态
|
|
158
|
+
|
|
159
|
+
:return: [Dict[str, bool]] 模块状态字典
|
|
160
|
+
"""
|
|
161
|
+
...
|
|
162
|
+
def __getattr__(self: object, module_name: str) -> Any:
|
|
163
|
+
"""
|
|
164
|
+
通过属性访问获取模块实例
|
|
165
|
+
|
|
166
|
+
:param module_name: [str] 模块名称
|
|
167
|
+
:return: [Any] 模块实例
|
|
168
|
+
:raises AttributeError: 当模块不存在或未启用时
|
|
169
|
+
"""
|
|
170
|
+
...
|
|
171
|
+
def __contains__(self: object, module_name: str) -> bool:
|
|
172
|
+
"""
|
|
173
|
+
检查模块是否存在且处于启用状态
|
|
174
|
+
|
|
175
|
+
:param module_name: [str] 模块名称
|
|
176
|
+
:return: [bool] 模块是否存在且启用
|
|
177
|
+
"""
|
|
178
|
+
...
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for router.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 路由系统
|
|
9
|
+
|
|
10
|
+
提供统一的HTTP和WebSocket路由管理,支持多适配器路由注册和生命周期管理。
|
|
11
|
+
|
|
12
|
+
{!--< tips >!--}
|
|
13
|
+
1. 适配器只需注册路由,无需自行管理服务器
|
|
14
|
+
2. WebSocket支持自定义认证逻辑
|
|
15
|
+
{!--< /tips >!--}
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
19
|
+
from fastapi.routing import APIRoute
|
|
20
|
+
from typing import Dict, List, Optional, Callable, Any, Awaitable, Tuple
|
|
21
|
+
from collections import defaultdict
|
|
22
|
+
from .logger import logger
|
|
23
|
+
from .lifecycle import lifecycle
|
|
24
|
+
import asyncio
|
|
25
|
+
from hypercorn.config import Config
|
|
26
|
+
from hypercorn.asyncio import serve
|
|
27
|
+
|
|
28
|
+
class RouterManager:
|
|
29
|
+
"""
|
|
30
|
+
路由管理器
|
|
31
|
+
|
|
32
|
+
{!--< tips >!--}
|
|
33
|
+
核心功能:
|
|
34
|
+
- HTTP/WebSocket路由注册
|
|
35
|
+
- 生命周期管理
|
|
36
|
+
- 统一错误处理
|
|
37
|
+
{!--< /tips >!--}
|
|
38
|
+
"""
|
|
39
|
+
def __init__(self: None) -> ...:
|
|
40
|
+
"""
|
|
41
|
+
初始化路由管理器
|
|
42
|
+
|
|
43
|
+
{!--< tips >!--}
|
|
44
|
+
会自动创建FastAPI实例并设置核心路由
|
|
45
|
+
{!--< /tips >!--}
|
|
46
|
+
"""
|
|
47
|
+
...
|
|
48
|
+
def register_http_route(self: object, module_name: str, path: str, handler: Callable, methods: List[str] = ...) -> None:
|
|
49
|
+
"""
|
|
50
|
+
注册HTTP路由
|
|
51
|
+
|
|
52
|
+
:param module_name: str 模块名称
|
|
53
|
+
:param path: str 路由路径
|
|
54
|
+
:param handler: Callable 处理函数
|
|
55
|
+
:param methods: List[str] HTTP方法列表(默认["POST"])
|
|
56
|
+
|
|
57
|
+
:raises ValueError: 当路径已注册时抛出
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
def register_webhook(self: object, *args: ..., **kwargs: ...) -> None:
|
|
61
|
+
"""
|
|
62
|
+
兼容性方法:注册HTTP路由(适配器旧接口)
|
|
63
|
+
"""
|
|
64
|
+
...
|
|
65
|
+
def unregister_http_route(self: object, module_name: str, path: str) -> bool:
|
|
66
|
+
"""
|
|
67
|
+
取消注册HTTP路由
|
|
68
|
+
|
|
69
|
+
:param module_name: 模块名称
|
|
70
|
+
:param path: 路由路径
|
|
71
|
+
|
|
72
|
+
:return: Bool
|
|
73
|
+
"""
|
|
74
|
+
...
|
|
75
|
+
def register_websocket(self: object, module_name: str, path: str, handler: Callable[([WebSocket], Awaitable[Any])], auth_handler: Optional[Callable[([WebSocket], Awaitable[bool])]] = ...) -> None:
|
|
76
|
+
"""
|
|
77
|
+
注册WebSocket路由
|
|
78
|
+
|
|
79
|
+
:param module_name: str 模块名称
|
|
80
|
+
:param path: str WebSocket路径
|
|
81
|
+
:param handler: Callable[[WebSocket], Awaitable[Any]] 主处理函数
|
|
82
|
+
:param auth_handler: Optional[Callable[[WebSocket], Awaitable[bool]]] 认证函数
|
|
83
|
+
|
|
84
|
+
:raises ValueError: 当路径已注册时抛出
|
|
85
|
+
"""
|
|
86
|
+
...
|
|
87
|
+
def unregister_websocket(self: object, module_name: str, path: str) -> bool:
|
|
88
|
+
...
|
|
89
|
+
def get_app(self: object) -> FastAPI:
|
|
90
|
+
"""
|
|
91
|
+
获取FastAPI应用实例
|
|
92
|
+
|
|
93
|
+
:return: FastAPI应用实例
|
|
94
|
+
"""
|
|
95
|
+
...
|
|
96
|
+
async def start(self: object, host: str = ..., port: int = ..., ssl_certfile: Optional[str] = ..., ssl_keyfile: Optional[str] = ...) -> None:
|
|
97
|
+
"""
|
|
98
|
+
启动路由服务器
|
|
99
|
+
|
|
100
|
+
:param host: str 监听地址(默认"0.0.0.0")
|
|
101
|
+
:param port: int 监听端口(默认8000)
|
|
102
|
+
:param ssl_certfile: Optional[str] SSL证书路径
|
|
103
|
+
:param ssl_keyfile: Optional[str] SSL密钥路径
|
|
104
|
+
|
|
105
|
+
:raises RuntimeError: 当服务器已在运行时抛出
|
|
106
|
+
"""
|
|
107
|
+
...
|
|
108
|
+
async def stop(self: object) -> None:
|
|
109
|
+
"""
|
|
110
|
+
停止服务器
|
|
111
|
+
"""
|
|
112
|
+
...
|
|
113
|
+
def _format_display_url(self: object, url: str) -> str:
|
|
114
|
+
"""
|
|
115
|
+
格式化URL显示,将回环地址转换为更友好的格式
|
|
116
|
+
|
|
117
|
+
:param url: 原始URL
|
|
118
|
+
:return: 格式化后的URL
|
|
119
|
+
"""
|
|
120
|
+
...
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for storage.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 存储管理模块
|
|
9
|
+
|
|
10
|
+
提供键值存储、事务支持、快照和恢复功能,用于管理框架运行时数据。
|
|
11
|
+
基于SQLite实现持久化存储,支持复杂数据类型和原子操作。
|
|
12
|
+
|
|
13
|
+
支持两种数据库模式:
|
|
14
|
+
1. 项目数据库(默认):位于项目目录下的 config/config.db
|
|
15
|
+
2. 全局数据库:位于包内的 ../data/config.db
|
|
16
|
+
|
|
17
|
+
用户可通过在 config.toml 中配置以下选项来选择使用全局数据库:
|
|
18
|
+
```toml
|
|
19
|
+
[ErisPulse.storage]
|
|
20
|
+
use_global_db = true
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
{!--< tips >!--}
|
|
24
|
+
1. 支持JSON序列化存储复杂数据类型
|
|
25
|
+
2. 提供事务支持确保数据一致性
|
|
26
|
+
3. 自动快照功能防止数据丢失
|
|
27
|
+
{!--< /tips >!--}
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import os
|
|
31
|
+
import json
|
|
32
|
+
import sqlite3
|
|
33
|
+
import shutil
|
|
34
|
+
import time
|
|
35
|
+
from datetime import datetime
|
|
36
|
+
from typing import List, Dict, Optional, Any, Tuple, Type
|
|
37
|
+
|
|
38
|
+
class StorageManager:
|
|
39
|
+
"""
|
|
40
|
+
存储管理器
|
|
41
|
+
|
|
42
|
+
单例模式实现,提供键值存储的增删改查、事务和快照管理
|
|
43
|
+
|
|
44
|
+
支持两种数据库模式:
|
|
45
|
+
1. 项目数据库(默认):位于项目目录下的 config/config.db
|
|
46
|
+
2. 全局数据库:位于包内的 ../data/config.db
|
|
47
|
+
|
|
48
|
+
用户可通过在 config.toml 中配置以下选项来选择使用全局数据库:
|
|
49
|
+
```toml
|
|
50
|
+
[ErisPulse.storage]
|
|
51
|
+
use_global_db = true
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
{!--< tips >!--}
|
|
55
|
+
1. 使用get/set方法操作存储项
|
|
56
|
+
2. 使用transaction上下文管理事务
|
|
57
|
+
3. 使用snapshot/restore管理数据快照
|
|
58
|
+
{!--< /tips >!--}
|
|
59
|
+
"""
|
|
60
|
+
def __new__(cls: object, *args: ..., **kwargs: ...) -> ...:
|
|
61
|
+
...
|
|
62
|
+
def __init__(self: None) -> ...:
|
|
63
|
+
...
|
|
64
|
+
def _ensure_directories(self: object) -> None:
|
|
65
|
+
"""
|
|
66
|
+
确保必要的目录存在
|
|
67
|
+
"""
|
|
68
|
+
...
|
|
69
|
+
def get(self: object, key: str, default: Any = ...) -> Any:
|
|
70
|
+
"""
|
|
71
|
+
获取存储项的值
|
|
72
|
+
|
|
73
|
+
:param key: 存储项键名
|
|
74
|
+
:param default: 默认值(当键不存在时返回)
|
|
75
|
+
:return: 存储项的值
|
|
76
|
+
|
|
77
|
+
:example:
|
|
78
|
+
>>> timeout = storage.get("network.timeout", 30)
|
|
79
|
+
>>> user_settings = storage.get("user.settings", {})
|
|
80
|
+
"""
|
|
81
|
+
...
|
|
82
|
+
def get_all_keys(self: object) -> List[str]:
|
|
83
|
+
"""
|
|
84
|
+
获取所有存储项的键名
|
|
85
|
+
|
|
86
|
+
:return: 键名列表
|
|
87
|
+
|
|
88
|
+
:example:
|
|
89
|
+
>>> all_keys = storage.get_all_keys()
|
|
90
|
+
>>> print(f"共有 {len(all_keys)} 个存储项")
|
|
91
|
+
"""
|
|
92
|
+
...
|
|
93
|
+
def set(self: object, key: str, value: Any) -> bool:
|
|
94
|
+
"""
|
|
95
|
+
设置存储项的值
|
|
96
|
+
|
|
97
|
+
:param key: 存储项键名
|
|
98
|
+
:param value: 存储项的值
|
|
99
|
+
:return: 操作是否成功
|
|
100
|
+
|
|
101
|
+
:example:
|
|
102
|
+
>>> storage.set("app.name", "MyApp")
|
|
103
|
+
>>> storage.set("user.settings", {"theme": "dark"})
|
|
104
|
+
"""
|
|
105
|
+
...
|
|
106
|
+
def set_multi(self: object, items: Dict[(str, Any)]) -> bool:
|
|
107
|
+
"""
|
|
108
|
+
批量设置多个存储项
|
|
109
|
+
|
|
110
|
+
:param items: 键值对字典
|
|
111
|
+
:return: 操作是否成功
|
|
112
|
+
|
|
113
|
+
:example:
|
|
114
|
+
>>> storage.set_multi({
|
|
115
|
+
>>> "app.name": "MyApp",
|
|
116
|
+
>>> "app.version": "1.0.0",
|
|
117
|
+
>>> "app.debug": True
|
|
118
|
+
>>> })
|
|
119
|
+
"""
|
|
120
|
+
...
|
|
121
|
+
def getConfig(self: object, key: str, default: Any = ...) -> Any:
|
|
122
|
+
"""
|
|
123
|
+
获取模块/适配器配置项(委托给config模块)
|
|
124
|
+
:param key: 配置项的键(支持点分隔符如"module.sub.key")
|
|
125
|
+
:param default: 默认值
|
|
126
|
+
:return: 配置项的值
|
|
127
|
+
"""
|
|
128
|
+
...
|
|
129
|
+
def setConfig(self: object, key: str, value: Any) -> bool:
|
|
130
|
+
"""
|
|
131
|
+
设置模块/适配器配置(委托给config模块)
|
|
132
|
+
:param key: 配置项键名(支持点分隔符如"module.sub.key")
|
|
133
|
+
:param value: 配置项值
|
|
134
|
+
:return: 操作是否成功
|
|
135
|
+
"""
|
|
136
|
+
...
|
|
137
|
+
def delete(self: object, key: str) -> bool:
|
|
138
|
+
"""
|
|
139
|
+
删除存储项
|
|
140
|
+
|
|
141
|
+
:param key: 存储项键名
|
|
142
|
+
:return: 操作是否成功
|
|
143
|
+
|
|
144
|
+
:example:
|
|
145
|
+
>>> storage.delete("temp.session")
|
|
146
|
+
"""
|
|
147
|
+
...
|
|
148
|
+
def delete_multi(self: object, keys: List[str]) -> bool:
|
|
149
|
+
"""
|
|
150
|
+
批量删除多个存储项
|
|
151
|
+
|
|
152
|
+
:param keys: 键名列表
|
|
153
|
+
:return: 操作是否成功
|
|
154
|
+
|
|
155
|
+
:example:
|
|
156
|
+
>>> storage.delete_multi(["temp.key1", "temp.key2"])
|
|
157
|
+
"""
|
|
158
|
+
...
|
|
159
|
+
def get_multi(self: object, keys: List[str]) -> Dict[(str, Any)]:
|
|
160
|
+
"""
|
|
161
|
+
批量获取多个存储项的值
|
|
162
|
+
|
|
163
|
+
:param keys: 键名列表
|
|
164
|
+
:return: 键值对字典
|
|
165
|
+
|
|
166
|
+
:example:
|
|
167
|
+
>>> settings = storage.get_multi(["app.name", "app.version"])
|
|
168
|
+
"""
|
|
169
|
+
...
|
|
170
|
+
def transaction(self: object) -> StorageManager._Transaction:
|
|
171
|
+
"""
|
|
172
|
+
创建事务上下文
|
|
173
|
+
|
|
174
|
+
:return: 事务上下文管理器
|
|
175
|
+
|
|
176
|
+
:example:
|
|
177
|
+
>>> with storage.transaction():
|
|
178
|
+
>>> storage.set("key1", "value1")
|
|
179
|
+
>>> storage.set("key2", "value2")
|
|
180
|
+
"""
|
|
181
|
+
...
|
|
182
|
+
def set_snapshot_interval(self: object, seconds: int) -> None:
|
|
183
|
+
"""
|
|
184
|
+
设置自动快照间隔
|
|
185
|
+
|
|
186
|
+
:param seconds: 间隔秒数
|
|
187
|
+
|
|
188
|
+
:example:
|
|
189
|
+
>>> # 每30分钟自动快照
|
|
190
|
+
>>> storage.set_snapshot_interval(1800)
|
|
191
|
+
"""
|
|
192
|
+
...
|
|
193
|
+
def clear(self: object) -> bool:
|
|
194
|
+
"""
|
|
195
|
+
清空所有存储项
|
|
196
|
+
|
|
197
|
+
:return: 操作是否成功
|
|
198
|
+
|
|
199
|
+
:example:
|
|
200
|
+
>>> storage.clear() # 清空所有存储
|
|
201
|
+
"""
|
|
202
|
+
...
|
|
203
|
+
def __getattr__(self: object, key: str) -> Any:
|
|
204
|
+
"""
|
|
205
|
+
通过属性访问存储项
|
|
206
|
+
|
|
207
|
+
:param key: 存储项键名
|
|
208
|
+
:return: 存储项的值
|
|
209
|
+
|
|
210
|
+
:raises AttributeError: 当存储项不存在时抛出
|
|
211
|
+
|
|
212
|
+
:example:
|
|
213
|
+
>>> app_name = storage.app_name
|
|
214
|
+
"""
|
|
215
|
+
...
|
|
216
|
+
def __setattr__(self: object, key: str, value: Any) -> None:
|
|
217
|
+
"""
|
|
218
|
+
通过属性设置存储项
|
|
219
|
+
|
|
220
|
+
:param key: 存储项键名
|
|
221
|
+
:param value: 存储项的值
|
|
222
|
+
|
|
223
|
+
:example:
|
|
224
|
+
>>> storage.app_name = "MyApp"
|
|
225
|
+
"""
|
|
226
|
+
...
|
|
227
|
+
def snapshot(self: object, name: Optional[str] = ...) -> str:
|
|
228
|
+
"""
|
|
229
|
+
创建数据库快照
|
|
230
|
+
|
|
231
|
+
:param name: 快照名称(可选)
|
|
232
|
+
:return: 快照文件路径
|
|
233
|
+
|
|
234
|
+
:example:
|
|
235
|
+
>>> # 创建命名快照
|
|
236
|
+
>>> snapshot_path = storage.snapshot("before_update")
|
|
237
|
+
>>> # 创建时间戳快照
|
|
238
|
+
>>> snapshot_path = storage.snapshot()
|
|
239
|
+
"""
|
|
240
|
+
...
|
|
241
|
+
def restore(self: object, snapshot_name: str) -> bool:
|
|
242
|
+
"""
|
|
243
|
+
从快照恢复数据库
|
|
244
|
+
|
|
245
|
+
:param snapshot_name: 快照名称或路径
|
|
246
|
+
:return: 恢复是否成功
|
|
247
|
+
|
|
248
|
+
:example:
|
|
249
|
+
>>> storage.restore("before_update")
|
|
250
|
+
"""
|
|
251
|
+
...
|
|
252
|
+
def list_snapshots(self: object) -> List[Tuple[(str, datetime, int)]]:
|
|
253
|
+
"""
|
|
254
|
+
列出所有可用的快照
|
|
255
|
+
|
|
256
|
+
:return: 快照信息列表(名称, 创建时间, 大小)
|
|
257
|
+
|
|
258
|
+
:example:
|
|
259
|
+
>>> for name, date, size in storage.list_snapshots():
|
|
260
|
+
>>> print(f"{name} - {date} ({size} bytes)")
|
|
261
|
+
"""
|
|
262
|
+
...
|
|
263
|
+
def delete_snapshot(self: object, snapshot_name: str) -> bool:
|
|
264
|
+
"""
|
|
265
|
+
删除指定的快照
|
|
266
|
+
|
|
267
|
+
:param snapshot_name: 快照名称
|
|
268
|
+
:return: 删除是否成功
|
|
269
|
+
|
|
270
|
+
:example:
|
|
271
|
+
>>> storage.delete_snapshot("old_backup")
|
|
272
|
+
"""
|
|
273
|
+
...
|
ErisPulse/Core/ux.pyi
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for ux.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse UX优化模块
|
|
9
|
+
|
|
10
|
+
提供更友好的初始化和API接口,简化常用操作
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import asyncio
|
|
15
|
+
from typing import List, Dict
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from rich.console import Console
|
|
18
|
+
from rich.table import Table
|
|
19
|
+
from rich.panel import Panel
|
|
20
|
+
from rich.prompt import Confirm
|
|
21
|
+
|
|
22
|
+
class UXManager:
|
|
23
|
+
"""
|
|
24
|
+
UX优化管理器
|
|
25
|
+
|
|
26
|
+
提供用户友好的界面和简化操作
|
|
27
|
+
"""
|
|
28
|
+
def __init__(self: None) -> ...:
|
|
29
|
+
...
|
|
30
|
+
async def _fetch_available_adapters(self: object) -> Dict[(str, str)]:
|
|
31
|
+
"""
|
|
32
|
+
从云端获取可用适配器列表
|
|
33
|
+
|
|
34
|
+
:return: 适配器名称到描述的映射
|
|
35
|
+
"""
|
|
36
|
+
...
|
|
37
|
+
def welcome(self: object, version: str = ...) -> None:
|
|
38
|
+
"""
|
|
39
|
+
显示欢迎信息
|
|
40
|
+
|
|
41
|
+
:param version: 框架版本号
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
def show_status(self: object) -> None:
|
|
45
|
+
"""
|
|
46
|
+
显示系统状态概览
|
|
47
|
+
"""
|
|
48
|
+
...
|
|
49
|
+
def list_modules(self: object, detailed: bool = ...) -> None:
|
|
50
|
+
"""
|
|
51
|
+
列出所有模块状态
|
|
52
|
+
|
|
53
|
+
:param detailed: 是否显示详细信息
|
|
54
|
+
"""
|
|
55
|
+
...
|
|
56
|
+
def list_adapters(self: object, detailed: bool = ...) -> None:
|
|
57
|
+
"""
|
|
58
|
+
列出所有适配器状态
|
|
59
|
+
|
|
60
|
+
:param detailed: 是否显示详细信息
|
|
61
|
+
"""
|
|
62
|
+
...
|
|
63
|
+
def init_project(self: object, project_name: str, adapter_list: List[str] = ...) -> bool:
|
|
64
|
+
"""
|
|
65
|
+
初始化新项目
|
|
66
|
+
|
|
67
|
+
:param project_name: 项目名称
|
|
68
|
+
:param adapter_list: 需要初始化的适配器列表
|
|
69
|
+
:return: 是否初始化成功
|
|
70
|
+
"""
|
|
71
|
+
...
|
|
72
|
+
def interactive_init(self: object, project_name: str = ..., force: bool = ...) -> bool:
|
|
73
|
+
"""
|
|
74
|
+
交互式初始化项目,包括项目创建和配置设置
|
|
75
|
+
|
|
76
|
+
:param project_name: 项目名称,可为None
|
|
77
|
+
:param force: 是否强制覆盖现有配置
|
|
78
|
+
:return: 是否初始化成功
|
|
79
|
+
"""
|
|
80
|
+
...
|
|
81
|
+
def _configure_adapters_interactive_sync(self: object, project_path: str = ...) -> None:
|
|
82
|
+
"""
|
|
83
|
+
交互式配置适配器的同步版本,从云端获取适配器列表
|
|
84
|
+
|
|
85
|
+
:param project_path: 项目路径,用于加载项目特定的配置
|
|
86
|
+
"""
|
|
87
|
+
...
|
|
88
|
+
async def _configure_adapters_interactive(self: object, project_path: str = ...) -> None:
|
|
89
|
+
"""
|
|
90
|
+
交互式配置适配器,从云端获取适配器列表
|
|
91
|
+
|
|
92
|
+
:param project_path: 项目路径,用于加载项目特定的配置
|
|
93
|
+
"""
|
|
94
|
+
...
|
ErisPulse/__init__.py
CHANGED
|
@@ -17,9 +17,13 @@ import importlib
|
|
|
17
17
|
import asyncio
|
|
18
18
|
import inspect
|
|
19
19
|
import importlib.metadata
|
|
20
|
-
from typing import Dict, List, Tuple, Type, Any
|
|
20
|
+
from typing import Dict, List, Tuple, Type, Any, TYPE_CHECKING
|
|
21
21
|
from pathlib import Path
|
|
22
22
|
|
|
23
|
+
# 类型检查时导入 Protocol,避免运行时循环导入
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from .sdk_protocol import SDKProtocol
|
|
26
|
+
|
|
23
27
|
# BaseModules: SDK核心模块
|
|
24
28
|
# 事件处理模块
|
|
25
29
|
from .Core import Event
|
|
@@ -37,7 +41,7 @@ from .Core import router, adapter_server
|
|
|
37
41
|
from .Core import ux, UXManager
|
|
38
42
|
|
|
39
43
|
# SDK统一对外接口
|
|
40
|
-
sdk = types.ModuleType('sdk')
|
|
44
|
+
sdk: 'SDKProtocol' = types.ModuleType('sdk') # type: ignore[assignment]
|
|
41
45
|
|
|
42
46
|
try:
|
|
43
47
|
__version__ = importlib.metadata.version('ErisPulse')
|
|
@@ -1182,7 +1186,7 @@ async def restart() -> bool:
|
|
|
1182
1186
|
logger.info("[Reload] 重新加载完成")
|
|
1183
1187
|
return True
|
|
1184
1188
|
|
|
1185
|
-
async def run() -> None:
|
|
1189
|
+
async def run(keep_running: bool = True) -> None:
|
|
1186
1190
|
"""
|
|
1187
1191
|
无头模式运行ErisPulse
|
|
1188
1192
|
|
|
@@ -1197,8 +1201,9 @@ async def run() -> None:
|
|
|
1197
1201
|
|
|
1198
1202
|
await adapter.startup()
|
|
1199
1203
|
|
|
1200
|
-
|
|
1201
|
-
|
|
1204
|
+
if keep_running:
|
|
1205
|
+
# 保持程序运行
|
|
1206
|
+
await asyncio.Event().wait()
|
|
1202
1207
|
except Exception as e:
|
|
1203
1208
|
logger.error(e)
|
|
1204
1209
|
finally:
|