initial commit
This commit is contained in:
59
plugins/__init__.py
Normal file
59
plugins/__init__.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user