Source code for cli.plugins

import importlib
import pkgutil
from typing import Dict, Any, List
from pathlib import Path
import click

[docs] class PluginManager: """Manages CLI plugins."""
[docs] def __init__(self): self.plugins: Dict[str, Any] = {} self.commands: List[click.Command] = []
[docs] def load_plugins(self): """Load plugins from configuration.""" from .config import config for plugin_name, plugin_config in config.plugins.items(): try: self._load_plugin(plugin_name, plugin_config) except Exception as e: click.echo(f"Failed to load plugin {plugin_name}: {e}", err=True)
def _load_plugin(self, name: str, config: Dict[str, Any]): """Load a single plugin.""" module_path = config.get("module") if not module_path: return try: module = importlib.import_module(module_path) plugin_class = getattr(module, config.get("class", "Plugin")) plugin_instance = plugin_class(**config.get("kwargs", {})) self.plugins[name] = plugin_instance # If plugin has commands, add them if hasattr(plugin_instance, "get_commands"): commands = plugin_instance.get_commands() self.commands.extend(commands) except ImportError: click.echo(f"Plugin module {module_path} not found", err=True) except AttributeError as e: click.echo(f"Plugin class not found in {module_path}: {e}", err=True)
[docs] def get_commands(self) -> List[click.Command]: """Get all plugin commands.""" return self.commands
# Global plugin manager plugin_manager = PluginManager()