wangzhibo
2026-08-30 c8515170fd399b4d2dfaebb59128d4674e58915e
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
from typing import Any
 
from .base import Plugin
 
 
class PluginManager:
    def __init__(self) -> None:
        self._plugins: list[Plugin] = []
        self._by_name: dict[str, Plugin] = {}
 
    def register(self, *plugins: Plugin) -> None:
        for plugin in sorted(plugins, key=lambda item: getattr(item, "priority", 50)):
            if plugin in self._plugins:
                continue
            self._plugins.append(plugin)
            name = getattr(plugin, "name", "")
            if isinstance(name, str) and name:
                self._by_name[name] = plugin
 
    def get_plugin(self, name: str) -> Plugin | None:
        return self._by_name.get(name)
 
    def setup_all(self, app: Any) -> None:
        for plugin in list(self._plugins):
            plugin.setup(app)
 
    def start_all(self) -> None:
        for plugin in list(self._plugins):
            plugin.start()
 
    def stop_all(self) -> None:
        for plugin in reversed(self._plugins):
            plugin.stop()
 
    def shutdown_all(self) -> None:
        for plugin in reversed(self._plugins):
            plugin.shutdown()