核心变更: - engine.py(1781行)拆分为8个独立模块: lifecycle/security/deps/ datastore/pl_injector/watcher/signature/manager - 新增plugin-bridge: 事件总线 + 服务注册 + RPC通信 - 新增i18n: 国际化/多语言翻译支持 - 新增plugin-storage: 插件键值/文件存储 - 新增ws-api: WebSocket实时通信(pub/sub + 自定义处理器) - nodejs-adapter统一为Plugin ABC模式 Bug修复: - 修复load_all()中store_dir未定义崩溃 - 修复DependencyResolver入度计算(拓扑排序) - 修复PermissionError隐藏内置异常 - 修复CORS中间件头部未附加到响应 - 修复IntegrityChecker跳过__pycache__目录 - 修复版本号不一致(v2.0.0→v1.2.0) - 修复测试文件的Logger导入/路径/私有方法调用 - 修复context.py缺少typing导入 - 修复config.py STORE_DIR默认路径(./mods→./store) 测试覆盖: 14→91个测试, 全部通过
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
from typing import Optional, Callable
|
|
|
|
|
|
class DependencyError(Exception):
|
|
pass
|
|
|
|
|
|
class DependencyResolver:
|
|
def __init__(self):
|
|
self.graph: dict[str, list[str]] = {}
|
|
|
|
def add_dependency(self, name: str, dependencies: list[str]):
|
|
self.graph[name] = dependencies
|
|
|
|
def resolve(self) -> list[str]:
|
|
self._detect_cycles()
|
|
|
|
in_degree: dict[str, int] = {name: 0 for name in self.graph}
|
|
who_depends_on: dict[str, list[str]] = {name: [] for name in self.graph}
|
|
|
|
for name, deps in self.graph.items():
|
|
for dep in deps:
|
|
if dep in in_degree:
|
|
in_degree[name] += 1
|
|
who_depends_on[dep].append(name)
|
|
|
|
queue = [name for name, degree in in_degree.items() if degree == 0]
|
|
result = []
|
|
|
|
while queue:
|
|
node = queue.pop(0)
|
|
result.append(node)
|
|
for dependent in who_depends_on.get(node, []):
|
|
in_degree[dependent] -= 1
|
|
if in_degree[dependent] == 0:
|
|
queue.append(dependent)
|
|
|
|
if len(result) != len(self.graph):
|
|
raise DependencyError("无法解析依赖,可能存在循环依赖")
|
|
|
|
return result
|
|
|
|
def _detect_cycles(self):
|
|
all_deps = set()
|
|
for deps in self.graph.values():
|
|
all_deps.update(deps)
|
|
all_plugins = set(self.graph.keys())
|
|
return list(all_deps - all_plugins)
|