更改项目名为NebulaShell

This commit is contained in:
Falck
2026-05-02 08:30:31 +08:00
parent d16e28ab17
commit 2c2ec60a2b
233 changed files with 298 additions and 276 deletions

View File

@@ -0,0 +1,30 @@
# lifecycle 生命周期管理
管理插件的状态转换和钩子函数。
## 功能
- 状态机:`pending``running``stopped`
- 支持状态转换验证
- 提供生命周期钩子:
- `before_start`
- `after_start`
- `before_stop`
- `after_stop`
- 支持扩展能力注入
## 状态转换
```
pending → running → stopped
(可重启)
```
## 使用
```python
lc = lifecycle_plugin.create("my-plugin")
lc.on("after_start", lambda: print("started"))
lc.start()
```

View File

@@ -0,0 +1,8 @@
{
"signature": "nfM9Sj7VvV+L85zCvVcmIQY4qZ9FDdsk8MZf0LrO/ys1o6FCQ96Ixt1aB+2j6crOvXUBavnSRPk/LNaDs9r3eh49+Zfy5rEK+M0UyGjcawvEY4e/lO20UWy4iLw3JdSBo9nnFQC9eE8D6C9F2oM7YcqmT/sH0wYuyjCsa8tk6P/jy5/IdCwR6bo6AIQSpCnvyNcS9JPU19f603f0nl/siafXVozQxMS3wCLQ5EAoDz7atLevvQK7xAZCIIcCsre/sHTZ3a6O+BFlYYQ5w/giWlrl4aF7W7JJntOwpain39B0ktDRV96msbW744a1BFkcUw91W/2sRU7T9xplARjmhlRPGkdMTlj4PGyy394oaLwhx+uusx28C9+gWxp7pQZNo08LQ6dKmzog4fpUFD3EEyZBtPY2XYsILqKnGQVn3TLAaMmdoHdwoR6moLtR6BfD3ToRFV6vcNRTig8hTiS9GTzZeQtEtVkoSeAZphzxWfB7FunimDRpPxndDmvhervPUJ/uAVLcdorbDFB0RfvR3znUZrQkaw5YQZjP8mhUNyA6avyOBvGdt1i0bhZsc6CUMN4BrC+vOULiykyVGnk3B07XrMHNB8AGuqR8Ai/2DFglomfs/l07mz01HeUotRg3MezqF8aSkofpPTpRieeD9IeQgH03sOGdvXHDgDJB3Xc=",
"signer": "NebulaShell",
"algorithm": "RSA-SHA256",
"timestamp": 1775960646.0212853,
"plugin_hash": "a7d6c6e01a8dc5df868e34777233e33d984d01adedb8adcee24d6892600928a8",
"author": "NebulaShell"
}

View File

@@ -0,0 +1,150 @@
"""生命周期插件 - 管理插件生命周期状态"""
from enum import Enum
from typing import Optional, Callable, Any
from oss.plugin.types import Plugin, register_plugin_type
class LifecycleState(str, Enum):
"""生命周期状态"""
PENDING = "pending"
RUNNING = "running"
STOPPED = "stopped"
class LifecycleError(Exception):
"""生命周期错误"""
pass
class Lifecycle:
"""生命周期管理器"""
VALID_TRANSITIONS = {
LifecycleState.PENDING: [LifecycleState.RUNNING],
LifecycleState.RUNNING: [LifecycleState.STOPPED],
LifecycleState.STOPPED: [LifecycleState.RUNNING],
}
def __init__(self, name: str):
self.name = name
self.state = LifecycleState.PENDING
self._hooks: dict[str, list[Callable]] = {
"before_start": [],
"after_start": [],
"before_stop": [],
"after_stop": [],
}
self._extensions: dict[str, Any] = {} # 扩展能力
def add_extension(self, name: str, extension: Any):
"""添加扩展能力"""
self._extensions[name] = extension
def get_extension(self, name: str) -> Optional[Any]:
"""获取扩展能力"""
return self._extensions.get(name)
def transition(self, target_state: LifecycleState):
"""状态转换"""
if target_state not in self.VALID_TRANSITIONS.get(self.state, []):
raise LifecycleError(
f"插件 '{self.name}' 无法从 {self.state.value} 转换到 {target_state.value}"
)
old_state = self.state
self.state = target_state
def start(self):
"""启动"""
for hook in self._hooks["before_start"]:
hook(self)
self.transition(LifecycleState.RUNNING)
for hook in self._hooks["after_start"]:
hook(self)
def stop(self):
"""停止"""
for hook in self._hooks["before_stop"]:
hook(self)
self.transition(LifecycleState.STOPPED)
for hook in self._hooks["after_stop"]:
hook(self)
def restart(self):
"""重启"""
if self.state == LifecycleState.RUNNING:
self.stop()
self.start()
def on(self, event: str, hook: Callable):
"""注册钩子"""
if event in self._hooks:
self._hooks[event].append(hook)
def is_running(self) -> bool:
return self.state == LifecycleState.RUNNING
def is_stopped(self) -> bool:
return self.state == LifecycleState.STOPPED
def is_pending(self) -> bool:
return self.state == LifecycleState.PENDING
def __repr__(self):
return f"Lifecycle({self.name}, state={self.state.value})"
class LifecyclePlugin(Plugin):
"""生命周期插件"""
def __init__(self):
self.lifecycles: dict[str, Lifecycle] = {}
def init(self, deps: dict = None):
"""初始化"""
pass
def start(self):
"""启动"""
pass
def stop(self):
"""停止"""
pass
def create(self, name: str) -> Lifecycle:
"""创建生命周期"""
lifecycle = Lifecycle(name)
self.lifecycles[name] = lifecycle
return lifecycle
def get(self, name: str) -> Optional[Lifecycle]:
"""获取生命周期"""
return self.lifecycles.get(name)
def start_all(self):
"""启动所有"""
for lc in self.lifecycles.values():
try:
lc.start()
except LifecycleError:
pass
def stop_all(self):
"""停止所有"""
for lc in self.lifecycles.values():
try:
lc.stop()
except LifecycleError:
pass
# 注册类型
register_plugin_type("Lifecycle", Lifecycle)
register_plugin_type("LifecycleState", LifecycleState)
register_plugin_type("LifecycleError", LifecycleError)
def New():
return LifecyclePlugin()

View File

@@ -0,0 +1,15 @@
{
"metadata": {
"name": "lifecycle",
"version": "1.0.0",
"author": "NebulaShell",
"description": "生命周期管理 - 管理插件的状态转换和钩子",
"type": "core"
},
"config": {
"enabled": true,
"args": {}
},
"dependencies": [],
"permissions": []
}