Skip to content

Commit

Permalink
✨ add plugin config $prefix for which have same name as other libra…
Browse files Browse the repository at this point in the history
…ries
  • Loading branch information
RF-Tar-Railt committed Jan 29, 2025
1 parent bcb33eb commit 8a9e75b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 12 deletions.
21 changes: 12 additions & 9 deletions arclet/entari/builtins/auto_reload.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,20 +44,20 @@ def detect_filter_change(old: dict, new: dict):


class Watcher(Service):
id = "watcher"
id = "entari.plugin.auto_reload/watcher"

@property
def required(self) -> set[str]:
return set()

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

def __init__(self, dirs: list[Union[str, Path]], is_watch_config: bool):
self.dirs = dirs
self.is_watch_config = is_watch_config
self.fail = {}
self.fail: dict[str, tuple[str, dict]] = {}
super().__init__()

async def watch(self):
Expand All @@ -69,22 +69,23 @@ async def watch(self):
continue
logger.info(f"Detected change in <blue>{plugin.id!r}</blue>, reloading...")
pid = plugin.id
_conf = plugin.config.copy()
del plugin
unload_plugin(pid)
if plugin := load_plugin(pid):
if plugin := load_plugin(pid, _conf):
logger.info(f"Reloaded <blue>{plugin.id!r}</blue>")
del plugin
else:
logger.error(f"Failed to reload <blue>{pid!r}</blue>")
self.fail[change[1]] = pid
self.fail[change[1]] = (pid, _conf)
elif change[1] in self.fail:
logger.info(f"Detected change in {change[1]!r} which failed to reload, retrying...")
if plugin := load_plugin(self.fail[change[1]]):
if plugin := load_plugin(*self.fail[change[1]]):
logger.info(f"Reloaded <blue>{plugin.id!r}</blue>")
del plugin
del self.fail[change[1]]
else:
logger.error(f"Failed to reload <blue>{self.fail[change[1]]!r}</blue>")
logger.error(f"Failed to reload <blue>{self.fail[change[1]][0]!r}</blue>")

async def watch_config(self):
file = EntariConfig.instance.path.resolve()
Expand Down Expand Up @@ -142,13 +143,14 @@ async def watch_config(self):
continue
logger.info(f"Detected config of <blue>{pid!r}</blue> changed, reloading...")
plugin_file = str(plugin.module.__file__)
_conf = plugin.config.copy()
unload_plugin(pid)
if plugin := load_plugin(plugin_name, new_conf):
logger.info(f"Reloaded <blue>{plugin.id!r}</blue>")
del plugin
else:
logger.error(f"Failed to reload <blue>{plugin_name!r}</blue>")
self.fail[plugin_file] = pid
self.fail[plugin_file] = (pid, _conf)
else:
logger.info(f"Detected <blue>{pid!r}</blue> appended, loading...")
load_plugin(plugin_name, new_conf)
Expand All @@ -173,7 +175,8 @@ async def launch(self, manager: Launart):
if sigexit_task in done:
watch_task.cancel()
watch_config_task.cancel()
self.fail.clear()
async with self.stage("cleanup"):
self.fail.clear()


conf = plugin_config(Config)
Expand Down
8 changes: 5 additions & 3 deletions arclet/entari/plugin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,15 @@ def load_plugin(
path = path.replace("::", "arclet.entari.builtins.")
while path in plugin_service._subplugined:
path = plugin_service._subplugined[path]
if path in plugin_service.plugins:
return plugin_service.plugins[path]
if path in plugin_service._apply:
return plugin_service._apply[path](conf)
if plug := find_plugin(path):
return plug
try:
if pref := conf.pop("$prefix", None):
path = f"{pref if isinstance(pref, str) else 'entari_plugin'}_{path}"
mod = import_plugin(path, config=conf)
if not mod:
if not pref and not mod:
path1 = f"entari_plugin_{path}"
mod = import_plugin(path1, config=conf)
if not mod:
Expand Down

0 comments on commit 8a9e75b

Please sign in to comment.