60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
"""
|
|
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()
|