reload plugins without restarting server

This commit is contained in:
Muhammad Labeeb 2025-02-20 16:07:47 +05:00 committed by Régis Behmo
parent 3c1b5616ac
commit 3043c33948
2 changed files with 13 additions and 1 deletions

View File

@ -167,7 +167,12 @@ async def plugin_toggle(name: str) -> WerkzeugResponse:
@app.post("/plugin/<name>/install")
async def plugin_install(name: str) -> WerkzeugResponse:
tutorclient.CliPool.run_parallel(app, ["plugins", "install", name])
async def bg_install_and_reload():
tutorclient.CliPool.run_parallel(app, ["plugins", "install", name])
while tutorclient.CliPool.THREAD and tutorclient.CliPool.THREAD.is_alive():
await asyncio.sleep(0.1)
tutorclient.Client.reload_plugins()
asyncio.create_task(bg_install_and_reload())
return redirect(url_for("plugin", name=name, show_logs=True))

View File

@ -1,5 +1,6 @@
import asyncio
import contextlib
import importlib_metadata
import logging
import os
import shlex
@ -19,6 +20,7 @@ import tutor.commands.cli
import tutor.config
import tutor.utils
import tutor.plugins.indexes
from tutor.plugins.v1 import discover_package
from . import constants
@ -292,6 +294,11 @@ class Client:
@classmethod
def enabled_plugins(cls) -> list[str]:
return list(hooks.Filters.PLUGINS_LOADED.iterate())
@classmethod
def reload_plugins(cls) -> None:
for entrypoint in importlib_metadata.entry_points(group="tutor.plugin.v1"):
discover_package(entrypoint)
@classmethod
def plugin_config_unique(cls, name: str) -> Config: