aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/conventionalrp/plugins/base.py
blob: f9e92a740aafd2258bb64c31fc6fded30d40d3f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from typing import Any, Dict, List, Optional
from abc import ABC, abstractmethod
import logging

logger = logging.getLogger(__name__)


class Plugin(ABC):
    """
    插件基类
    
    所有插件必须继承此类并实现必要的方法
    """
    
    def __init__(self, name: str, version: str = "1.0.0"):
        self.name = name
        self.version = version
        self.enabled = True
        self.logger = logging.getLogger(f"conventionalrp.plugins.{name}")
    
    @abstractmethod
    def initialize(self, config: Optional[Dict[str, Any]] = None):
        pass
    
    @abstractmethod
    def process(self, data: Any) -> Any:
        pass
    
    def on_enable(self):
        """插件启用时调用"""
        self.logger.info(f"Plugin {self.name} enabled")
    
    def on_disable(self):
        """插件禁用时调用"""
        self.logger.info(f"Plugin {self.name} disabled")
    
    def get_metadata(self) -> Dict[str, Any]:
        return {
            "name": self.name,
            "version": self.version,
            "enabled": self.enabled,
            "type": self.__class__.__name__,
        }
    
    def __repr__(self) -> str:
        return f"Plugin(name={self.name}, version={self.version}, enabled={self.enabled})"


class ParserPlugin(Plugin):
    def __init__(self, name: str, version: str = "1.0.0"):
        super().__init__(name, version)
        self.priority = 50
    
    @abstractmethod
    def can_parse(self, text: str) -> bool:
        """
        判断是否可以解析给定文本
        """
        pass
    
    @abstractmethod
    def parse(self, text: str) -> List[Dict[str, Any]]:
        """
        解析文本
        """
        pass


class ProcessorPlugin(Plugin):
    @abstractmethod
    def process_token(self, token: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理单个 token
        """
        pass
    
    def process(self, data: Any) -> Any:
        """
        处理数据(实现基类方法)
        """
        if isinstance(data, dict):
            return self.process_token(data)
        elif isinstance(data, list):
            return [self.process_token(token) for token in data]
        return data


class RendererPlugin(Plugin):
    @abstractmethod
    def render(self, data: Any) -> str:
        pass
    
    def process(self, data: Any) -> Any:
        return self.render(data)


class AnalyzerPlugin(Plugin):
    @abstractmethod
    def analyze(self, data: Any) -> Dict[str, Any]:
        pass
    
    def process(self, data: Any) -> Any:
        return self.analyze(data)