PregoPal / plugins /base.py
J.B-Lin
chore: save current version before UI improvements (i18n + font fix)
ec90eae
Raw
History Blame Contribute Delete
2.13 kB
"""
PregoPal - 插件基类
===================
定义 LoopPlugin 基类、PluginRegistry、LoopStage、LoopContext。
"""
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from enum import Enum
from typing import List
class LoopStage(Enum):
"""插件可注册的阶段"""
FAMILY_QUIZ = "family_quiz"
SUMMARIZE = "summarize"
ANALYZE = "analyze"
BRIEF = "brief"
THREE_DAY = "three_day"
CONSOLIDATE = "consolidate"
@dataclass
class LoopContext:
"""插件上下文:共享数据容器"""
briefing: dict = field(default_factory=dict)
weight_data: dict = field(default_factory=dict)
diet_records: list = field(default_factory=list)
family_recipes: list = field(default_factory=list)
family_memory: dict = field(default_factory=dict)
analysis_results: dict = field(default_factory=dict)
errors: list = field(default_factory=list)
@dataclass
class PluginResult:
"""插件执行结果"""
success: bool = True
data: dict = field(default_factory=dict)
message: str = ""
class LoopPlugin(ABC):
"""Loop 扩展插件基类 — 所有插件继承此类"""
@abstractmethod
def stage(self) -> LoopStage:
"""此插件注册到哪个阶段"""
@abstractmethod
def name(self) -> str:
"""插件唯一名称"""
@abstractmethod
async def run(self, ctx: LoopContext) -> PluginResult:
"""执行插件逻辑"""
class PluginRegistry:
"""插件注册中心"""
def __init__(self):
self._plugins: List[LoopPlugin] = []
def register(self, plugin: LoopPlugin):
"""注册一个插件"""
self._plugins.append(plugin)
def get_plugins(self, stage: LoopStage) -> List[LoopPlugin]:
"""获取指定阶段的所有插件"""
return [p for p in self._plugins if p.stage() == stage]
def get_all(self) -> List[LoopPlugin]:
"""获取所有插件"""
return self._plugins.copy()
def unregister(self, name: str):
"""根据名称注销插件"""
self._plugins = [p for p in self._plugins if p.name() != name]