From 06de2bd52b3f537198383cc7828505f0026ac98f Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Mon, 27 Oct 2025 15:53:54 +1100 Subject: [PATCH] plugin loading error handling --- assets/theme_mappings.py | 3 ++- plugin_loader.py | 29 +++++++++++++++++++++++------ plugins/test-plugin/lua/main.lua | 8 +++----- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/assets/theme_mappings.py b/assets/theme_mappings.py index f273f39..81f1d34 100644 --- a/assets/theme_mappings.py +++ b/assets/theme_mappings.py @@ -13,5 +13,6 @@ theme_mappings = { "sh": "bash", "yaml": "yaml", "md": "markdown", - "gitignore": "markdown" + "gitignore": "markdown", + "lua": "lua" } \ No newline at end of file diff --git a/plugin_loader.py b/plugin_loader.py index 1087400..fb3281f 100644 --- a/plugin_loader.py +++ b/plugin_loader.py @@ -14,13 +14,16 @@ class PluginLoader(Window): icon="⚙️", starting_horizontal="right", starting_vertical="bottom", - start_open=True + start_open=True, + allow_maximize=True ) @work async def find_plugins(self): log = self.query_one(RichLog) + no_errors = True + log.write("[b]Setting up LUA runtime..[/]") self.lua_runtime = lua51.LuaRuntime() lua_runtime_stuff = { @@ -47,14 +50,17 @@ class PluginLoader(Window): if not os.path.isdir(plugin_folder): log.write(f"[d]Ignoring {plugin_folder} because it is not a folder.[/]") + no_errors = False continue if not os.path.isdir(os.path.join(plugin_folder, "lua")): log.write(f"[d]Ignoring {plugin_folder} because it has no \"lua\" folder.[/]") + no_errors = False continue if not os.path.isfile(os.path.join(plugin_folder, "plugin.json")): log.write(f"[d]Ignoring {plugin_folder} because it has no plugin.json file.[/]") + no_errors = False continue with open(os.path.join(plugin_folder, "plugin.json"), "r") as f: @@ -66,15 +72,19 @@ class PluginLoader(Window): plugin_json["dependencies"] except UnicodeDecodeError: log.write(f"[d]Ignoring {plugin_folder} because its plugin.json file is unreadable.[/]") + no_errors = False continue except json.JSONDecodeError: log.write(f"[d]Ignoring {plugin_folder} because its plugin.json file is malformed.[/]") + no_errors = False continue except KeyError as e: log.write(f"[d]Ignoring {plugin_folder} because its plugin.json file is missing the field {e}.") + no_errors = False continue except Exception as e: log.write(f"[d]Ignoring {plugin_folder} because of error: {e}.[/]") + no_errors = False continue @@ -93,7 +103,13 @@ class PluginLoader(Window): sandbox.berry = lua_runtime_stuff setfenv(0, sandbox) - executed_code = self.lua_runtime.execute(code) + try: + executed_code = self.lua_runtime.execute(code) + except lua51.LuaError as e: + log.write(f"[b red]Error in {lua_file_path}: {e}[/]") + self.notify("There was Lua error while loading one your installed plugins. Check the Plugin Loader window for more details.", title="Lua Error", severity="error") + no_errors = False + continue if executed_code.init: executed_code.init() @@ -102,13 +118,14 @@ class PluginLoader(Window): plugin_paths.append(plugin_folder) - log.write("\n[d]Window will automatically close in 5 seconds.[/]") - await asyncio.sleep(5.0) - self.close_window() + if no_errors: + log.write("\n[d]Window will automatically close in 5 seconds.[/]") + await asyncio.sleep(5.0) + self.close_window() async def on_mount(self): self.find_plugins() def compose(self): - yield RichLog(markup=True, id="plugins-log") \ No newline at end of file + yield RichLog(markup=True, id="plugins-log", wrap=True) \ No newline at end of file diff --git a/plugins/test-plugin/lua/main.lua b/plugins/test-plugin/lua/main.lua index 47f010f..379d35a 100644 --- a/plugins/test-plugin/lua/main.lua +++ b/plugins/test-plugin/lua/main.lua @@ -1,10 +1,8 @@ local plugin = {} function plugin.init() - berry.ui.notify("hiiii") + berry.ui.notify(tostring(math.random(10))) end -function plugin.main() -end - -return plugin \ No newline at end of file +return plugin +123 \ No newline at end of file