""" Registre de plugins SeedMover. Tout plugin placé dans ce dossier et héritant de AbstractFS est automatiquement découvert et enregistré. """ import importlib import os from .base import AbstractFS _registry: dict[str, type] = {} def _discover(): """Scan le dossier plugins/ et importe chaque module.""" plugins_dir = os.path.dirname(__file__) for fname in os.listdir(plugins_dir): if fname.startswith('_') or not fname.endswith('.py'): continue module_name = fname[:-3] if module_name in ('base',): continue try: mod = importlib.import_module(f'.{module_name}', package='plugins') for attr in dir(mod): cls = getattr(mod, attr) if ( isinstance(cls, type) and issubclass(cls, AbstractFS) and cls is not AbstractFS and cls.PLUGIN_NAME ): _registry[cls.PLUGIN_NAME] = cls except Exception as e: print(f"[plugins] Impossible de charger {fname}: {e}") def get_plugin(name: str) -> type: """Retourne la classe plugin pour un nom donné.""" if not _registry: _discover() return _registry.get(name) def list_plugins() -> list: """Retourne la liste des plugins disponibles avec leur config.""" if not _registry: _discover() return [ { 'name': cls.PLUGIN_NAME, 'label': cls.PLUGIN_LABEL, 'fields': cls.get_config_fields() } for cls in _registry.values() ] # Découverte au chargement du module _discover()