From 08ad320d196687b32a01e0c8052c082806e4c070 Mon Sep 17 00:00:00 2001 From: Evgeny Vakhteev Date: Mon, 17 Apr 2023 09:33:01 -0700 Subject: [PATCH] moving load plugins into plugins from main, adding tests --- autogpt/__main__.py | 22 +----- autogpt/config/config.py | 1 + autogpt/plugins.py | 63 ++++++++++++++---- .../Auto-GPT-Plugin-Test-master.zip | Bin 0 -> 14879 bytes tests/unit/test_plugins.py | 32 +++++++++ 5 files changed, 85 insertions(+), 33 deletions(-) create mode 100644 tests/unit/data/test_plugins/Auto-GPT-Plugin-Test-master.zip create mode 100644 tests/unit/test_plugins.py diff --git a/autogpt/__main__.py b/autogpt/__main__.py index 5fc9a1ea..f995fb12 100644 --- a/autogpt/__main__.py +++ b/autogpt/__main__.py @@ -24,27 +24,7 @@ def main() -> None: check_openai_api_key() parse_arguments() logger.set_level(logging.DEBUG if cfg.debug_mode else logging.INFO) - plugins_found = load_plugins(Path(os.getcwd()) / "plugins") - loaded_plugins = [] - for plugin in plugins_found: - if plugin.__name__ in cfg.plugins_blacklist: - continue - if plugin.__name__ in cfg.plugins_whitelist: - loaded_plugins.append(plugin()) - else: - ack = input( - f"WARNNG Plugin {plugin.__name__} found. But not in the" - " whitelist... Load? (y/n): " - ) - if ack.lower() == "y": - loaded_plugins.append(plugin()) - - if loaded_plugins: - print(f"\nPlugins found: {len(loaded_plugins)}\n" "--------------------") - for plugin in loaded_plugins: - print(f"{plugin._name}: {plugin._version} - {plugin._description}") - - cfg.set_plugins(loaded_plugins) + cfg.set_plugins(load_plugins(cfg)) # Create a CommandRegistry instance and scan default folder command_registry = CommandRegistry() command_registry.import_commands("scripts.ai_functions") diff --git a/autogpt/config/config.py b/autogpt/config/config.py index 46ab95d8..66a23086 100644 --- a/autogpt/config/config.py +++ b/autogpt/config/config.py @@ -107,6 +107,7 @@ class Config(metaclass=Singleton): # Initialize the OpenAI API client openai.api_key = self.openai_api_key + self.plugins_dir = os.getenv("PLUGINS_DIR", "plugins") self.plugins = [] self.plugins_whitelist = [] self.plugins_blacklist = [] diff --git a/autogpt/plugins.py b/autogpt/plugins.py index 7b843a6a..18680cba 100644 --- a/autogpt/plugins.py +++ b/autogpt/plugins.py @@ -1,11 +1,15 @@ """Handles loading of plugins.""" - -from ast import Module +import os import zipfile +from glob import glob from pathlib import Path from zipimport import zipimporter from typing import List, Optional, Tuple +from abstract_singleton import AbstractSingleton + +from autogpt.config import Config + def inspect_zip_for_module(zip_path: str, debug: bool = False) -> Optional[str]: """ @@ -29,32 +33,66 @@ def inspect_zip_for_module(zip_path: str, debug: bool = False) -> Optional[str]: return None -def scan_plugins(plugins_path: Path, debug: bool = False) -> List[Tuple[str, Path]]: +def scan_plugins(plugins_path: str, debug: bool = False) -> List[Tuple[str, Path]]: """Scan the plugins directory for plugins. Args: - plugins_path (Path): Path to the plugins directory. + plugins_path (str): Path to the plugins directory. + debug (bool, optional): Enable debug logging. Defaults to False. Returns: - List[Path]: List of plugins. + List[Tuple[str, Path]]: List of plugins. """ plugins = [] - for plugin in plugins_path.glob("*.zip"): + plugins_path_path = Path(plugins_path) + + for plugin in plugins_path_path.glob("*.zip"): if module := inspect_zip_for_module(str(plugin), debug): plugins.append((module, plugin)) return plugins -def load_plugins(plugins_path: Path, debug: bool = False) -> List[Module]: +def blacklist_whitelist_check(plugins: List[AbstractSingleton], cfg: Config): + """Check if the plugin is in the whitelist or blacklist. + + Args: + plugins (List[Tuple[str, Path]]): List of plugins. + cfg (Config): Config object. + + Returns: + List[Tuple[str, Path]]: List of plugins. + """ + loaded_plugins = [] + for plugin in plugins: + if plugin.__name__ in cfg.plugins_blacklist: + continue + if plugin.__name__ in cfg.plugins_whitelist: + loaded_plugins.append(plugin()) + else: + ack = input( + f"WARNNG Plugin {plugin.__name__} found. But not in the" + " whitelist... Load? (y/n): " + ) + if ack.lower() == "y": + loaded_plugins.append(plugin()) + + if loaded_plugins: + print(f"\nPlugins found: {len(loaded_plugins)}\n" "--------------------") + for plugin in loaded_plugins: + print(f"{plugin._name}: {plugin._version} - {plugin._description}") + return loaded_plugins + + +def load_plugins(cfg: Config = Config(), debug: bool = False) -> List[object]: """Load plugins from the plugins directory. Args: - plugins_path (Path): Path to the plugins directory. - + cfg (Config): Config instance inluding plugins config + debug (bool, optional): Enable debug logging. Defaults to False. Returns: - List[Path]: List of plugins. + List[AbstractSingleton]: List of plugins initialized. """ - plugins = scan_plugins(plugins_path) + plugins = scan_plugins(cfg.plugins_dir) plugin_modules = [] for module, plugin in plugins: plugin = Path(plugin) @@ -70,4 +108,5 @@ def load_plugins(plugins_path: Path, debug: bool = False) -> List[Module]: a_keys = dir(a_module) if "_abc_impl" in a_keys and a_module.__name__ != "AutoGPTPluginTemplate": plugin_modules.append(a_module) - return plugin_modules + loaded_plugin_modules = blacklist_whitelist_check(plugin_modules, cfg) + return loaded_plugin_modules diff --git a/tests/unit/data/test_plugins/Auto-GPT-Plugin-Test-master.zip b/tests/unit/data/test_plugins/Auto-GPT-Plugin-Test-master.zip new file mode 100644 index 0000000000000000000000000000000000000000..f0db121e29dfa7a6b8fe77bc2f34c4b6f27e43de GIT binary patch literal 14879 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 UWM?&FHfCmKG3Msr<~B3_e=-UAnE(I) literal 0 HcmV?d00001 diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py new file mode 100644 index 00000000..a1d9d5e7 --- /dev/null +++ b/tests/unit/test_plugins.py @@ -0,0 +1,32 @@ +import pytest +from pathlib import Path +from zipfile import ZipFile +from autogpt.plugins import inspect_zip_for_module, scan_plugins, load_plugins +from autogpt.config import Config + +PLUGINS_TEST_DIR = "tests/unit/data/test_plugins/" +PLUGIN_TEST_ZIP_FILE = "Auto-GPT-Plugin-Test-master.zip" +PLUGIN_TEST_INIT_PY = "Auto-GPT-Plugin-Test-master/src/auto_gpt_plugin_template/__init__.py" + + +@pytest.fixture +def config_with_plugins(): + cfg = Config() + cfg.plugins_dir = PLUGINS_TEST_DIR + return cfg + + +def test_inspect_zip_for_module(): + result = inspect_zip_for_module(str(PLUGINS_TEST_DIR + PLUGIN_TEST_ZIP_FILE)) + assert result == PLUGIN_TEST_INIT_PY + +def test_scan_plugins(): + result = scan_plugins(PLUGINS_TEST_DIR, debug=True) + assert len(result) == 1 + assert result[0][0] == PLUGIN_TEST_INIT_PY + + +def test_load_plugins_blacklisted(config_with_plugins): + config_with_plugins.plugins_blacklist = ['AbstractSingleton'] + result = load_plugins(cfg=config_with_plugins) + assert len(result) == 0