Files
XtendR/xtendr/extendr_manager.py
T

70 lines
2.3 KiB
Python

import os
import importlib.util
from abc import ABC, abstractmethod
# Define the interface that all plugins must implement
class PluginInterface(ABC):
@abstractmethod
def execute(self, *args, **kwargs):
"""
Execute the plugin's functionality.
"""
pass
class PluginManager:
def __init__(self, plugins_dir="plugins"):
"""
Initialize the plugin manager.
:param plugins_dir: Directory containing plugin modules.
"""
self.plugins_dir = plugins_dir
self.plugins = {}
def load_plugins(self):
"""
Load all plugins from the plugins directory.
"""
if not os.path.exists(self.plugins_dir):
os.makedirs(self.plugins_dir)
print(f"Created plugins directory at {self.plugins_dir}.")
return
for filename in os.listdir(self.plugins_dir):
if filename.endswith(".py"):
plugin_name = os.path.splitext(filename)[0]
plugin_path = os.path.join(self.plugins_dir, filename)
spec = importlib.util.spec_from_file_location(plugin_name, plugin_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Check if the module contains a valid plugin
for attr_name in dir(module):
attr = getattr(module, attr_name)
if isinstance(attr, type) and issubclass(attr, PluginInterface) and attr is not PluginInterface:
self.plugins[plugin_name] = attr()
print(f"Loaded plugin: {plugin_name}")
def execute_plugin(self, plugin_name, *args, **kwargs):
"""
Execute a plugin by name.
:param plugin_name: Name of the plugin to execute.
"""
plugin = self.plugins.get(plugin_name)
if plugin:
return plugin.execute(*args, **kwargs)
else:
print(f"Plugin '{plugin_name}' not found.")
# Example of how the PluginManager would be used
if __name__ == "__main__":
manager = PluginManager()
manager.load_plugins()
# Execute a plugin (replace 'example_plugin' with your actual plugin name)
result = manager.execute_plugin('example_plugin', param1="Hello", param2="World")
print("Result:", result)