Skip to content

Commit

Permalink
✨ Lifespan's requirement
Browse files Browse the repository at this point in the history
  • Loading branch information
RF-Tar-Railt committed Dec 2, 2024
1 parent efc48a4 commit 13ef344
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 7 deletions.
6 changes: 5 additions & 1 deletion arclet/entari/builtins/echo.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
from arclet.entari import MessageChain, Session, command, metadata
from arclet.entari.command import Match

metadata(__file__)
metadata(
"echo",
author=["RF-Tar-Railt <rf_tar_railt@qq.com>"],
description="Echo the content",
)


cmd = command.mount(Alconna("echo", Args["content?", AllParam], meta=CommandMeta(compact=True)))
Expand Down
5 changes: 5 additions & 0 deletions arclet/entari/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import os

from arclet.letoderea import BaseAuxiliary, Contexts, Param, Provider, ProviderFactory, es, global_providers
from creart import it
from launart import Launart
from loguru import logger
from satori import LoginStatus
Expand Down Expand Up @@ -125,3 +126,7 @@ async def account_hook(self, account: Account, state: LoginStatus):
await asyncio.gather(*_connected, return_exceptions=True)
elif state == LoginStatus.DISCONNECT:
await asyncio.gather(*_disconnected, return_exceptions=True)

@classmethod
def current(cls):
return it(Launart).get_component(cls)
9 changes: 9 additions & 0 deletions arclet/entari/plugin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,15 @@ def metadata(data: PluginMetadata):
plugin._metadata = data # type: ignore


def requirements(*reqs: str):
if not (plugin := _current_plugin.get(None)):
raise LookupError("no plugin context found")
plugin.inject(*reqs)


inject = requirements


def find_plugin(name: str) -> Plugin | None:
return plugin_service.plugins.get(name)

Expand Down
17 changes: 15 additions & 2 deletions arclet/entari/plugin/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ class Plugin:
dispatchers: dict[str, PluginDispatcher] = field(default_factory=dict)
subplugins: set[str] = field(default_factory=set)
config: dict[str, Any] = field(default_factory=dict)
_requires: list[str] = field(default_factory=list)
_metadata: PluginMetadata | None = None
_is_disposed: bool = False

Expand Down Expand Up @@ -171,14 +172,23 @@ def current() -> Plugin:
def metadata(self) -> PluginMetadata | None:
return self._metadata

def inject(self, *requires: str):
plugin = self
while plugin.id in plugin_service._subplugined:
plugin = plugin_service.plugins[plugin_service._subplugined[plugin.id]]
plugin._requires.extend(requires)
if plugin._lifecycle:
plugin._lifecycle.requires.update(requires)
return self

def __post_init__(self):
plugin_service.plugins[self.id] = self
if self.id not in plugin_service._keep_values:
plugin_service._keep_values[self.id] = {}
if self.id not in plugin_service._referents:
plugin_service._referents[self.id] = set()
if self.id not in plugin_service._subplugined:
self._lifecycle = PluginLifecycleService(self.id)
self._lifecycle = PluginLifecycleService(self.id, set(self._requires))
if plugin_service.status.blocking and (self._preparing or self._running or self._cleanup):
it(Launart).add_component(self._lifecycle)
finalize(self, self.dispose)
Expand Down Expand Up @@ -278,7 +288,10 @@ class KeepingVariable:
def __init__(self, obj: T, dispose: Callable[[T], None] | None = None):
self.obj = obj
self._dispose = dispose
setattr(self.obj, "__keeping__", True)
try:
setattr(self.obj, "__keeping__", True)
except AttributeError:
pass

def dispose(self):
if hasattr(self.obj, "dispose"):
Expand Down
9 changes: 5 additions & 4 deletions arclet/entari/plugin/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,16 @@ def id(self) -> str:

@property
def required(self) -> set[str]:
return {"arclet.entari.plugin.manager"}
return {"entari.plugin.manager", *self.requires}

@property
def stages(self) -> set[Phase]:
return {"preparing", "cleanup", "blocking"}

def __init__(self, plugin_id: str):
def __init__(self, plugin_id: str, requires: set[str]):
super().__init__()
self.plugin_id = plugin_id
self.requires = requires

@property
def available(self) -> bool:
Expand Down Expand Up @@ -77,7 +78,7 @@ async def launch(self, manager: Launart):


class PluginManagerService(Service):
id = "arclet.entari.plugin.manager"
id = "entari.plugin.manager"

plugins: dict[str, "Plugin"]
_keep_values: dict[str, dict[str, "KeepingVariable"]]
Expand All @@ -95,7 +96,7 @@ def __init__(self):

@property
def required(self) -> set[str]:
return set()
return {"entari.service"}

@property
def stages(self) -> set[Phase]:
Expand Down

0 comments on commit 13ef344

Please sign in to comment.