ErisPulse 2.3.4.dev0__py3-none-any.whl → 2.3.4.dev2__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/{utils/cli → CLI}/__init__.py +1 -1
- ErisPulse/{utils/cli → CLI}/__init__.pyi +1 -1
- ErisPulse/{utils/cli/__main__.py → CLI/cli.py} +3 -4
- ErisPulse/{utils/cli/__main__.pyi → CLI/cli.pyi} +2 -3
- ErisPulse/{utils/cli → CLI}/commands/init.py +4 -9
- ErisPulse/{utils/cli → CLI}/commands/init.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/install.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/install.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/list.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/list.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/list_remote.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/list_remote.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/run.py +3 -7
- ErisPulse/{utils/cli → CLI}/commands/run.pyi +2 -11
- ErisPulse/{utils/cli → CLI}/commands/self_update.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/self_update.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/uninstall.py +1 -6
- ErisPulse/{utils/cli → CLI}/commands/uninstall.pyi +1 -14
- ErisPulse/{utils/cli → CLI}/commands/upgrade.py +1 -7
- ErisPulse/{utils/cli → CLI}/commands/upgrade.pyi +1 -14
- ErisPulse/{utils → CLI/utils}/__init__.py +1 -5
- ErisPulse/{utils → CLI/utils}/__init__.pyi +0 -2
- ErisPulse/{utils → CLI/utils}/package_manager.py +146 -20
- ErisPulse/{utils → CLI/utils}/package_manager.pyi +20 -3
- ErisPulse/{utils → CLI/utils}/reload_handler.py +7 -8
- ErisPulse/{utils → CLI/utils}/reload_handler.pyi +1 -1
- ErisPulse/Core/Bases/manager.py +136 -0
- ErisPulse/Core/Bases/manager.pyi +108 -0
- ErisPulse/Core/Bases/module.py +53 -1
- ErisPulse/Core/Bases/module.pyi +43 -0
- ErisPulse/Core/Event/command.py +6 -1
- ErisPulse/Core/_self_config.py +1 -1
- ErisPulse/Core/adapter.py +70 -10
- ErisPulse/Core/adapter.pyi +18 -1
- ErisPulse/Core/exceptions.py +4 -2
- ErisPulse/Core/lifecycle.py +9 -0
- ErisPulse/Core/logger.py +21 -15
- ErisPulse/Core/logger.pyi +2 -1
- ErisPulse/Core/module.py +57 -9
- ErisPulse/Core/module.pyi +12 -1
- ErisPulse/Core/router.py +13 -5
- ErisPulse/Core/storage.py +94 -256
- ErisPulse/Core/storage.pyi +13 -66
- ErisPulse/__init__.py +35 -1237
- ErisPulse/__init__.pyi +3 -290
- ErisPulse/__main__.py +1 -1
- ErisPulse/__main__.pyi +1 -1
- ErisPulse/loaders/__init__.py +22 -0
- ErisPulse/loaders/__init__.pyi +21 -0
- ErisPulse/loaders/adapter_loader.py +187 -0
- ErisPulse/loaders/adapter_loader.pyi +82 -0
- ErisPulse/loaders/base_loader.py +162 -0
- ErisPulse/loaders/base_loader.pyi +23 -0
- ErisPulse/loaders/initializer.py +150 -0
- ErisPulse/loaders/initializer.pyi +60 -0
- ErisPulse/loaders/module_loader.py +618 -0
- ErisPulse/loaders/module_loader.pyi +179 -0
- ErisPulse/loaders/strategy.py +129 -0
- ErisPulse/loaders/strategy.pyi +90 -0
- ErisPulse/sdk.py +435 -0
- ErisPulse/sdk.pyi +158 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/METADATA +1 -1
- erispulse-2.3.4.dev2.dist-info/RECORD +103 -0
- ErisPulse/sdk_protocol.py +0 -143
- ErisPulse/sdk_protocol.pyi +0 -97
- erispulse-2.3.4.dev0.dist-info/RECORD +0 -89
- /ErisPulse/{utils/cli → CLI}/base.py +0 -0
- /ErisPulse/{utils/cli → CLI}/base.pyi +0 -0
- /ErisPulse/{utils/cli → CLI}/commands/__init__.py +0 -0
- /ErisPulse/{utils/cli → CLI}/commands/__init__.pyi +0 -0
- /ErisPulse/{utils → CLI}/console.py +0 -0
- /ErisPulse/{utils → CLI}/console.pyi +0 -0
- /ErisPulse/{utils/cli → CLI}/registry.py +0 -0
- /ErisPulse/{utils/cli → CLI}/registry.pyi +0 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/WHEEL +0 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/entry_points.txt +0 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/licenses/LICENSE +0 -0
ErisPulse/__init__.pyi
CHANGED
|
@@ -16,294 +16,7 @@ ErisPulse SDK 主模块
|
|
|
16
16
|
{!--< /tips >!--}
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
|
-
import os
|
|
20
|
-
import sys
|
|
21
|
-
import types
|
|
22
|
-
import importlib
|
|
23
|
-
import asyncio
|
|
24
|
-
import inspect
|
|
25
19
|
import importlib.metadata
|
|
26
|
-
from
|
|
27
|
-
from
|
|
28
|
-
from .
|
|
29
|
-
from .Core import lifecycle, logger, exceptions
|
|
30
|
-
from .Core import storage, env, config
|
|
31
|
-
from .Core import adapter, AdapterFather, BaseAdapter, SendDSL
|
|
32
|
-
from .Core import module
|
|
33
|
-
from .Core import router, adapter_server
|
|
34
|
-
|
|
35
|
-
sdk: SDKProtocol
|
|
36
|
-
|
|
37
|
-
class LazyModule:
|
|
38
|
-
"""
|
|
39
|
-
懒加载模块包装器
|
|
40
|
-
|
|
41
|
-
当模块第一次被访问时才进行实例化
|
|
42
|
-
|
|
43
|
-
{!--< tips >!--}
|
|
44
|
-
1. 模块的实际实例化会在第一次属性访问时进行
|
|
45
|
-
2. 依赖模块会在被使用时自动初始化
|
|
46
|
-
3. 对于继承自 BaseModule 的模块,会自动调用生命周期方法
|
|
47
|
-
{!--< /tips >!--}
|
|
48
|
-
"""
|
|
49
|
-
def __init__(self: None, module_name: str, module_class: Type, sdk_ref: Any, module_info: Dict[(str, Any)]) -> None:
|
|
50
|
-
"""
|
|
51
|
-
初始化懒加载包装器
|
|
52
|
-
|
|
53
|
-
:param module_name: str 模块名称
|
|
54
|
-
:param module_class: Type 模块类
|
|
55
|
-
:param sdk_ref: Any SDK引用
|
|
56
|
-
:param module_info: Dict[str, Any] 模块信息字典
|
|
57
|
-
"""
|
|
58
|
-
...
|
|
59
|
-
async def _initialize(self: object) -> ...:
|
|
60
|
-
"""
|
|
61
|
-
实际初始化模块
|
|
62
|
-
|
|
63
|
-
:raises LazyLoadError: 当模块初始化失败时抛出
|
|
64
|
-
"""
|
|
65
|
-
...
|
|
66
|
-
def _initialize_sync(self: object) -> ...:
|
|
67
|
-
"""
|
|
68
|
-
同步初始化模块,用于在异步上下文中进行同步调用
|
|
69
|
-
|
|
70
|
-
:raises LazyLoadError: 当模块初始化失败时抛出
|
|
71
|
-
"""
|
|
72
|
-
...
|
|
73
|
-
async def _complete_async_init(self: object) -> ...:
|
|
74
|
-
"""
|
|
75
|
-
完成异步初始化部分,用于同步初始化后的异步处理
|
|
76
|
-
|
|
77
|
-
这个方法用于处理 module.load 和事件提交等异步操作
|
|
78
|
-
"""
|
|
79
|
-
...
|
|
80
|
-
def _ensure_initialized(self: object) -> None:
|
|
81
|
-
"""
|
|
82
|
-
确保模块已初始化
|
|
83
|
-
|
|
84
|
-
:raises LazyLoadError: 当模块未初始化时抛出
|
|
85
|
-
"""
|
|
86
|
-
...
|
|
87
|
-
def __getattr__(self: object, name: str) -> Any:
|
|
88
|
-
"""
|
|
89
|
-
属性访问时触发初始化
|
|
90
|
-
|
|
91
|
-
:param name: str 属性名
|
|
92
|
-
:return: Any 属性值
|
|
93
|
-
"""
|
|
94
|
-
...
|
|
95
|
-
def __setattr__(self: object, name: str, value: Any) -> None:
|
|
96
|
-
"""
|
|
97
|
-
属性设置
|
|
98
|
-
|
|
99
|
-
:param name: str 属性名
|
|
100
|
-
:param value: Any 属性值
|
|
101
|
-
"""
|
|
102
|
-
...
|
|
103
|
-
def __delattr__(self: object, name: str) -> None:
|
|
104
|
-
"""
|
|
105
|
-
属性删除
|
|
106
|
-
|
|
107
|
-
:param name: str 属性名
|
|
108
|
-
"""
|
|
109
|
-
...
|
|
110
|
-
def __getattribute__(self: object, name: str) -> Any:
|
|
111
|
-
"""
|
|
112
|
-
属性访问,初始化后直接委托给实际实例
|
|
113
|
-
|
|
114
|
-
:param name: str 属性名
|
|
115
|
-
:return: Any 属性值
|
|
116
|
-
"""
|
|
117
|
-
...
|
|
118
|
-
def __dir__(self: object) -> List[str]:
|
|
119
|
-
"""
|
|
120
|
-
返回模块属性列表
|
|
121
|
-
|
|
122
|
-
:return: List[str] 属性列表
|
|
123
|
-
"""
|
|
124
|
-
...
|
|
125
|
-
def __repr__(self: object) -> str:
|
|
126
|
-
"""
|
|
127
|
-
返回模块表示字符串
|
|
128
|
-
|
|
129
|
-
:return: str 表示字符串
|
|
130
|
-
"""
|
|
131
|
-
...
|
|
132
|
-
def __call__(self: object, *args: ..., **kwargs: ...) -> ...:
|
|
133
|
-
"""
|
|
134
|
-
代理函数调用
|
|
135
|
-
"""
|
|
136
|
-
...
|
|
137
|
-
|
|
138
|
-
class AdapterLoader:
|
|
139
|
-
"""
|
|
140
|
-
适配器加载器
|
|
141
|
-
|
|
142
|
-
专门用于从PyPI包加载和初始化适配器
|
|
143
|
-
|
|
144
|
-
{!--< tips >!--}
|
|
145
|
-
1. 适配器必须通过entry-points机制注册到erispulse.adapter组
|
|
146
|
-
2. 适配器类必须继承BaseAdapter
|
|
147
|
-
3. 适配器不适用懒加载
|
|
148
|
-
{!--< /tips >!--}
|
|
149
|
-
"""
|
|
150
|
-
async def load() -> Tuple[(Dict[(str, object)], List[str], List[str])]:
|
|
151
|
-
"""
|
|
152
|
-
从PyPI包entry-points加载适配器
|
|
153
|
-
|
|
154
|
-
:return:
|
|
155
|
-
Dict[str, object]: 适配器对象字典 {适配器名: 模块对象}
|
|
156
|
-
List[str]: 启用的适配器名称列表
|
|
157
|
-
List[str]: 停用的适配器名称列表
|
|
158
|
-
|
|
159
|
-
:raises ImportError: 当无法加载适配器时抛出
|
|
160
|
-
"""
|
|
161
|
-
...
|
|
162
|
-
|
|
163
|
-
class ModuleLoader:
|
|
164
|
-
"""
|
|
165
|
-
模块加载器
|
|
166
|
-
|
|
167
|
-
专门用于从PyPI包加载和初始化普通模块
|
|
168
|
-
|
|
169
|
-
{!--< tips >!--}
|
|
170
|
-
1. 模块必须通过entry-points机制注册到erispulse.module组
|
|
171
|
-
2. 模块类名应与entry-point名称一致
|
|
172
|
-
{!--< /tips >!--}
|
|
173
|
-
"""
|
|
174
|
-
async def load() -> Tuple[(Dict[(str, object)], List[str], List[str])]:
|
|
175
|
-
"""
|
|
176
|
-
从PyPI包entry-points加载模块
|
|
177
|
-
|
|
178
|
-
:return:
|
|
179
|
-
Dict[str, object]: 模块对象字典 {模块名: 模块对象}
|
|
180
|
-
List[str]: 启用的模块名称列表
|
|
181
|
-
List[str]: 停用的模块名称列表
|
|
182
|
-
|
|
183
|
-
:raises ImportError: 当无法加载模块时抛出
|
|
184
|
-
"""
|
|
185
|
-
...
|
|
186
|
-
def _should_lazy_load(module_class: Type) -> bool:
|
|
187
|
-
"""
|
|
188
|
-
检查模块是否应该懒加载
|
|
189
|
-
|
|
190
|
-
:param module_class: Type 模块类
|
|
191
|
-
:return: bool 如果返回 False,则立即加载;否则懒加载
|
|
192
|
-
"""
|
|
193
|
-
...
|
|
194
|
-
|
|
195
|
-
class ModuleInitializer:
|
|
196
|
-
"""
|
|
197
|
-
模块初始化器(注意:适配器是一个特殊的模块)
|
|
198
|
-
|
|
199
|
-
负责协调适配器和模块的初始化流程
|
|
200
|
-
|
|
201
|
-
{!--< tips >!--}
|
|
202
|
-
1. 初始化顺序:适配器 → 模块
|
|
203
|
-
2. 模块初始化采用懒加载机制
|
|
204
|
-
{!--< /tips >!--}
|
|
205
|
-
"""
|
|
206
|
-
async def init() -> bool:
|
|
207
|
-
"""
|
|
208
|
-
初始化所有模块和适配器
|
|
209
|
-
|
|
210
|
-
执行步骤:
|
|
211
|
-
1. 从PyPI包加载适配器
|
|
212
|
-
2. 从PyPI包加载模块
|
|
213
|
-
3. 预记录所有模块信息
|
|
214
|
-
4. 注册适配器
|
|
215
|
-
5. 初始化各模块
|
|
216
|
-
|
|
217
|
-
:return: bool 初始化是否成功
|
|
218
|
-
:raises InitError: 当初始化失败时抛出
|
|
219
|
-
"""
|
|
220
|
-
...
|
|
221
|
-
|
|
222
|
-
async def init_progress() -> bool:
|
|
223
|
-
"""
|
|
224
|
-
初始化项目环境文件
|
|
225
|
-
|
|
226
|
-
1. 检查并创建main.py入口文件
|
|
227
|
-
2. 确保基础目录结构存在
|
|
228
|
-
|
|
229
|
-
:return: bool 是否创建了新的main.py文件
|
|
230
|
-
|
|
231
|
-
{!--< tips >!--}
|
|
232
|
-
1. 如果main.py已存在则不会覆盖
|
|
233
|
-
2. 此方法通常由SDK内部调用
|
|
234
|
-
{!--< /tips >!--}
|
|
235
|
-
"""
|
|
236
|
-
...
|
|
237
|
-
|
|
238
|
-
async def init() -> bool:
|
|
239
|
-
"""
|
|
240
|
-
SDK初始化入口
|
|
241
|
-
|
|
242
|
-
:return: bool SDK初始化是否成功
|
|
243
|
-
"""
|
|
244
|
-
...
|
|
245
|
-
|
|
246
|
-
def init_sync() -> bool:
|
|
247
|
-
"""
|
|
248
|
-
SDK初始化入口(同步版本)
|
|
249
|
-
|
|
250
|
-
用于命令行直接调用,自动在事件循环中运行异步初始化
|
|
251
|
-
|
|
252
|
-
:return: bool SDK初始化是否成功
|
|
253
|
-
"""
|
|
254
|
-
...
|
|
255
|
-
|
|
256
|
-
def init_task() -> asyncio.Task:
|
|
257
|
-
"""
|
|
258
|
-
SDK初始化入口,返回Task对象
|
|
259
|
-
|
|
260
|
-
:return: asyncio.Task 初始化任务
|
|
261
|
-
"""
|
|
262
|
-
...
|
|
263
|
-
|
|
264
|
-
async def uninit() -> bool:
|
|
265
|
-
"""
|
|
266
|
-
SDK反初始化
|
|
267
|
-
|
|
268
|
-
执行以下操作:
|
|
269
|
-
1. 关闭所有适配器
|
|
270
|
-
2. 卸载所有模块
|
|
271
|
-
3. 清理所有事件处理器
|
|
272
|
-
4. 清理僵尸线程
|
|
273
|
-
|
|
274
|
-
:return: bool 反初始化是否成功
|
|
275
|
-
"""
|
|
276
|
-
...
|
|
277
|
-
|
|
278
|
-
async def restart() -> bool:
|
|
279
|
-
"""
|
|
280
|
-
SDK重新启动
|
|
281
|
-
|
|
282
|
-
执行完整的反初始化后再初始化过程
|
|
283
|
-
|
|
284
|
-
:return: bool 重新加载是否成功
|
|
285
|
-
"""
|
|
286
|
-
...
|
|
287
|
-
|
|
288
|
-
async def run(keep_running: bool = ...) -> None:
|
|
289
|
-
"""
|
|
290
|
-
无头模式运行ErisPulse
|
|
291
|
-
|
|
292
|
-
此方法提供了一种无需入口启动的方式,适用于与其它框架集成的场景
|
|
293
|
-
"""
|
|
294
|
-
...
|
|
295
|
-
|
|
296
|
-
async def load_module(module_name: str) -> bool:
|
|
297
|
-
"""
|
|
298
|
-
手动加载指定模块
|
|
299
|
-
|
|
300
|
-
:param module_name: str 要加载的模块名称
|
|
301
|
-
:return: bool 加载是否成功
|
|
302
|
-
|
|
303
|
-
{!--< tips >!--}
|
|
304
|
-
1. 可用于手动触发懒加载模块的初始化
|
|
305
|
-
2. 如果模块不存在或已加载会返回False
|
|
306
|
-
3. 对于需要异步初始化的模块,这是唯一的加载方式
|
|
307
|
-
{!--< /tips >!--}
|
|
308
|
-
"""
|
|
309
|
-
...
|
|
20
|
+
from .Core import Event, lifecycle, logger, exceptions, storage, env, config, adapter, AdapterFather, BaseAdapter, SendDSL, module, router, adapter_server
|
|
21
|
+
from .sdk import sdk
|
|
22
|
+
from .loaders.module_loader import LazyModule
|
ErisPulse/__main__.py
CHANGED
ErisPulse/__main__.pyi
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 加载器模块
|
|
3
|
+
|
|
4
|
+
提供适配器和模块的加载功能
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 此模块由 SDK 内部使用
|
|
8
|
+
2. 一般不需要手动导入这些加载器
|
|
9
|
+
{!--< /tips >!--}
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .adapter_loader import AdapterLoader
|
|
13
|
+
from .module_loader import ModuleLoader
|
|
14
|
+
from .initializer import Initializer
|
|
15
|
+
from .strategy import ModuleLoadStrategy
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"AdapterLoader",
|
|
19
|
+
"ModuleLoader",
|
|
20
|
+
"Initializer",
|
|
21
|
+
"ModuleLoadStrategy",
|
|
22
|
+
]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for __init__.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 加载器模块
|
|
9
|
+
|
|
10
|
+
提供适配器和模块的加载功能
|
|
11
|
+
|
|
12
|
+
{!--< tips >!--}
|
|
13
|
+
1. 此模块由 SDK 内部使用
|
|
14
|
+
2. 一般不需要手动导入这些加载器
|
|
15
|
+
{!--< /tips >!--}
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from .adapter_loader import AdapterLoader
|
|
19
|
+
from .module_loader import ModuleLoader
|
|
20
|
+
from .initializer import Initializer
|
|
21
|
+
from .strategy import ModuleLoadStrategy
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 适配器加载器
|
|
3
|
+
|
|
4
|
+
专门用于从 PyPI 包加载和初始化适配器
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 适配器必须通过 entry-points 机制注册到 erispulse.adapter 组
|
|
8
|
+
2. 适配器类必须继承 BaseAdapter
|
|
9
|
+
3. 适配器不适用懒加载
|
|
10
|
+
{!--< /tips >!--}
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
import asyncio
|
|
15
|
+
import importlib.metadata
|
|
16
|
+
from typing import Dict, List, Any, Tuple
|
|
17
|
+
from .base_loader import BaseLoader
|
|
18
|
+
from ..Core.logger import logger
|
|
19
|
+
from ..Core.lifecycle import lifecycle
|
|
20
|
+
|
|
21
|
+
class AdapterLoader(BaseLoader):
|
|
22
|
+
"""
|
|
23
|
+
适配器加载器
|
|
24
|
+
|
|
25
|
+
负责从 PyPI entry-points 加载适配器
|
|
26
|
+
|
|
27
|
+
{!--< tips >!--}
|
|
28
|
+
使用方式:
|
|
29
|
+
>>> loader = AdapterLoader()
|
|
30
|
+
>>> adapter_objs, enabled, disabled = await loader.load(adapter_manager)
|
|
31
|
+
{!--< /tips >!--}
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
"""初始化适配器加载器"""
|
|
36
|
+
super().__init__("ErisPulse.adapters")
|
|
37
|
+
|
|
38
|
+
def _get_entry_point_group(self) -> str:
|
|
39
|
+
"""
|
|
40
|
+
获取 entry-point 组名
|
|
41
|
+
|
|
42
|
+
:return: "erispulse.adapter"
|
|
43
|
+
"""
|
|
44
|
+
return "erispulse.adapter"
|
|
45
|
+
|
|
46
|
+
async def _process_entry_point(
|
|
47
|
+
self,
|
|
48
|
+
entry_point: Any,
|
|
49
|
+
objs: Dict[str, Any],
|
|
50
|
+
enabled_list: List[str],
|
|
51
|
+
disabled_list: List[str],
|
|
52
|
+
manager_instance: Any
|
|
53
|
+
) -> Tuple[Dict[str, Any], List[str], List[str]]:
|
|
54
|
+
"""
|
|
55
|
+
处理单个适配器 entry-point
|
|
56
|
+
|
|
57
|
+
:param entry_point: entry-point 对象
|
|
58
|
+
:param objs: 适配器对象字典
|
|
59
|
+
:param enabled_list: 启用的适配器列表
|
|
60
|
+
:param disabled_list: 停用的适配器列表
|
|
61
|
+
:param manager_instance: 适配器管理器实例
|
|
62
|
+
|
|
63
|
+
:return:
|
|
64
|
+
Dict[str, Any]: 更新后的适配器对象字典
|
|
65
|
+
List[str]: 更新后的启用适配器列表
|
|
66
|
+
List[str]: 更新后的禁用适配器列表
|
|
67
|
+
|
|
68
|
+
:raises ImportError: 当适配器加载失败时抛出
|
|
69
|
+
"""
|
|
70
|
+
meta_name = entry_point.name
|
|
71
|
+
|
|
72
|
+
# 检查适配器是否已经注册,如果未注册则进行注册(默认启用)
|
|
73
|
+
if not manager_instance.exists(meta_name):
|
|
74
|
+
manager_instance._config_register(meta_name, True)
|
|
75
|
+
logger.info(f"发现新适配器 {meta_name},默认已启用")
|
|
76
|
+
|
|
77
|
+
# 获取适配器当前状态
|
|
78
|
+
adapter_status = manager_instance.is_enabled(meta_name)
|
|
79
|
+
logger.debug(f"适配器 {meta_name} 状态: {adapter_status}")
|
|
80
|
+
|
|
81
|
+
if not adapter_status:
|
|
82
|
+
disabled_list.append(meta_name)
|
|
83
|
+
logger.debug(f"适配器 {meta_name} 已禁用,跳过...")
|
|
84
|
+
return objs, enabled_list, disabled_list
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
loaded_class = entry_point.load()
|
|
88
|
+
adapter_obj = sys.modules[loaded_class.__module__]
|
|
89
|
+
dist = importlib.metadata.distribution(entry_point.dist.name)
|
|
90
|
+
|
|
91
|
+
adapter_info = {
|
|
92
|
+
"meta": {
|
|
93
|
+
"name": meta_name,
|
|
94
|
+
"version": getattr(adapter_obj, "__version__", dist.version if dist else "1.0.0"),
|
|
95
|
+
"description": getattr(adapter_obj, "__description__", ""),
|
|
96
|
+
"author": getattr(adapter_obj, "__author__", ""),
|
|
97
|
+
"license": getattr(adapter_obj, "__license__", ""),
|
|
98
|
+
"package": entry_point.dist.name
|
|
99
|
+
},
|
|
100
|
+
"adapter_class": loaded_class
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if not hasattr(adapter_obj, 'adapterInfo'):
|
|
104
|
+
setattr(adapter_obj, 'adapterInfo', {})
|
|
105
|
+
|
|
106
|
+
adapter_obj.adapterInfo[meta_name] = adapter_info
|
|
107
|
+
|
|
108
|
+
objs[meta_name] = adapter_obj
|
|
109
|
+
enabled_list.append(meta_name)
|
|
110
|
+
logger.debug(f"从 PyPI 包发现适配器: {meta_name}")
|
|
111
|
+
|
|
112
|
+
except Exception as e:
|
|
113
|
+
logger.warning(f"从 entry-point 加载适配器 {meta_name} 失败: {e}")
|
|
114
|
+
raise ImportError(f"无法加载适配器 {meta_name}: {e}")
|
|
115
|
+
|
|
116
|
+
return objs, enabled_list, disabled_list
|
|
117
|
+
|
|
118
|
+
async def register_to_manager(
|
|
119
|
+
self,
|
|
120
|
+
adapters: List[str],
|
|
121
|
+
adapter_objs: Dict[str, Any],
|
|
122
|
+
manager_instance: Any
|
|
123
|
+
) -> bool:
|
|
124
|
+
"""
|
|
125
|
+
将适配器注册到管理器
|
|
126
|
+
|
|
127
|
+
:param adapters: 适配器名称列表
|
|
128
|
+
:param adapter_objs: 适配器对象字典
|
|
129
|
+
:param manager_instance: 适配器管理器实例
|
|
130
|
+
:return: 适配器注册是否成功
|
|
131
|
+
|
|
132
|
+
{!--< tips >!--}
|
|
133
|
+
此方法由初始化协调器调用
|
|
134
|
+
{!--< /tips >!--}
|
|
135
|
+
"""
|
|
136
|
+
# 并行注册所有适配器
|
|
137
|
+
register_tasks = []
|
|
138
|
+
|
|
139
|
+
for adapter_name in adapters:
|
|
140
|
+
adapter_obj = adapter_objs[adapter_name]
|
|
141
|
+
|
|
142
|
+
async def register_single_adapter(name: str, obj: Any) -> bool:
|
|
143
|
+
"""注册单个适配器"""
|
|
144
|
+
try:
|
|
145
|
+
success = True
|
|
146
|
+
if hasattr(obj, "adapterInfo") and isinstance(obj.adapterInfo, dict):
|
|
147
|
+
for platform, adapter_info in obj.adapterInfo.items():
|
|
148
|
+
# 使用管理器的方法检查是否已存在
|
|
149
|
+
if platform in manager_instance._adapters:
|
|
150
|
+
continue
|
|
151
|
+
|
|
152
|
+
adapter_class = adapter_info["adapter_class"]
|
|
153
|
+
|
|
154
|
+
# 调用管理器的 register 方法
|
|
155
|
+
manager_instance.register(platform, adapter_class, adapter_info)
|
|
156
|
+
logger.info(f"注册适配器: {platform} ({adapter_class.__name__})")
|
|
157
|
+
|
|
158
|
+
# 提交适配器加载完成事件
|
|
159
|
+
await lifecycle.submit_event(
|
|
160
|
+
"adapter.load",
|
|
161
|
+
msg=f"适配器 {platform} 加载完成",
|
|
162
|
+
data={
|
|
163
|
+
"platform": platform,
|
|
164
|
+
"success": True
|
|
165
|
+
}
|
|
166
|
+
)
|
|
167
|
+
return success
|
|
168
|
+
except Exception as e:
|
|
169
|
+
logger.error(f"适配器 {name} 注册失败: {e}")
|
|
170
|
+
# 提交适配器加载失败事件
|
|
171
|
+
await lifecycle.submit_event(
|
|
172
|
+
"adapter.load",
|
|
173
|
+
msg=f"适配器 {name} 加载失败: {e}",
|
|
174
|
+
data={
|
|
175
|
+
"platform": name,
|
|
176
|
+
"success": False
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
register_tasks.append(register_single_adapter(adapter_name, adapter_obj))
|
|
182
|
+
|
|
183
|
+
# 等待所有注册任务完成
|
|
184
|
+
register_results = await asyncio.gather(*register_tasks, return_exceptions=True)
|
|
185
|
+
|
|
186
|
+
# 检查是否有注册失败的情况
|
|
187
|
+
return not any(isinstance(result, Exception) or result is False for result in register_results)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for adapter_loader.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 适配器加载器
|
|
9
|
+
|
|
10
|
+
专门用于从 PyPI 包加载和初始化适配器
|
|
11
|
+
|
|
12
|
+
{!--< tips >!--}
|
|
13
|
+
1. 适配器必须通过 entry-points 机制注册到 erispulse.adapter 组
|
|
14
|
+
2. 适配器类必须继承 BaseAdapter
|
|
15
|
+
3. 适配器不适用懒加载
|
|
16
|
+
{!--< /tips >!--}
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import sys
|
|
20
|
+
import asyncio
|
|
21
|
+
import importlib.metadata
|
|
22
|
+
from typing import Dict, List, Any, Tuple
|
|
23
|
+
from .base_loader import BaseLoader
|
|
24
|
+
from ..Core.logger import logger
|
|
25
|
+
from ..Core.lifecycle import lifecycle
|
|
26
|
+
|
|
27
|
+
class AdapterLoader(BaseLoader):
|
|
28
|
+
"""
|
|
29
|
+
适配器加载器
|
|
30
|
+
|
|
31
|
+
负责从 PyPI entry-points 加载适配器
|
|
32
|
+
|
|
33
|
+
{!--< tips >!--}
|
|
34
|
+
使用方式:
|
|
35
|
+
>>> loader = AdapterLoader()
|
|
36
|
+
>>> adapter_objs, enabled, disabled = await loader.load(adapter_manager)
|
|
37
|
+
{!--< /tips >!--}
|
|
38
|
+
"""
|
|
39
|
+
def __init__(self: None) -> ...:
|
|
40
|
+
"""
|
|
41
|
+
初始化适配器加载器
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
def _get_entry_point_group(self: object) -> str:
|
|
45
|
+
"""
|
|
46
|
+
获取 entry-point 组名
|
|
47
|
+
|
|
48
|
+
:return: "erispulse.adapter"
|
|
49
|
+
"""
|
|
50
|
+
...
|
|
51
|
+
async def _process_entry_point(self: object, entry_point: Any, objs: Dict[(str, Any)], enabled_list: List[str], disabled_list: List[str], manager_instance: Any) -> Tuple[(Dict[(str, Any)], List[str], List[str])]:
|
|
52
|
+
"""
|
|
53
|
+
处理单个适配器 entry-point
|
|
54
|
+
|
|
55
|
+
:param entry_point: entry-point 对象
|
|
56
|
+
:param objs: 适配器对象字典
|
|
57
|
+
:param enabled_list: 启用的适配器列表
|
|
58
|
+
:param disabled_list: 停用的适配器列表
|
|
59
|
+
:param manager_instance: 适配器管理器实例
|
|
60
|
+
|
|
61
|
+
:return:
|
|
62
|
+
Dict[str, Any]: 更新后的适配器对象字典
|
|
63
|
+
List[str]: 更新后的启用适配器列表
|
|
64
|
+
List[str]: 更新后的禁用适配器列表
|
|
65
|
+
|
|
66
|
+
:raises ImportError: 当适配器加载失败时抛出
|
|
67
|
+
"""
|
|
68
|
+
...
|
|
69
|
+
async def register_to_manager(self: object, adapters: List[str], adapter_objs: Dict[(str, Any)], manager_instance: Any) -> bool:
|
|
70
|
+
"""
|
|
71
|
+
将适配器注册到管理器
|
|
72
|
+
|
|
73
|
+
:param adapters: 适配器名称列表
|
|
74
|
+
:param adapter_objs: 适配器对象字典
|
|
75
|
+
:param manager_instance: 适配器管理器实例
|
|
76
|
+
:return: 适配器注册是否成功
|
|
77
|
+
|
|
78
|
+
{!--< tips >!--}
|
|
79
|
+
此方法由初始化协调器调用
|
|
80
|
+
{!--< /tips >!--}
|
|
81
|
+
"""
|
|
82
|
+
...
|