Skip to content

Commit 0c3b3b9

Browse files
committed
Update bcasl/executor.py to support new plugin registration style
1 parent d18571f commit 0c3b3b9

1 file changed

Lines changed: 27 additions & 2 deletions

File tree

bcasl/executor.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ def _set(limit, soft, hard):
883883
module = _ilu.module_from_spec(spec)
884884
_sys.modules[spec.name] = module
885885
spec.loader.exec_module(module) # type: ignore[attr-defined]
886-
# Récupérer PLUGIN ou fallback via bcasl_register
886+
# Récupérer PLUGIN ou fallback via bcasl_register ou décorateur @bc_register
887887
plg = getattr(module, "PLUGIN", None)
888888
if plg is None or getattr(getattr(plg, "meta", None), "id", None) != plugin_id:
889889
try:
@@ -899,10 +899,35 @@ def _set(limit, soft, hard):
899899
module.bcasl_register(mgr)
900900
rec = getattr(mgr, "_registry", {}).get(plugin_id)
901901
if rec is None:
902+
# Nouveau style: chercher les classes marquées avec @bc_register
903+
# Ces classes ont l'attribut __bcasl_plugin__ = True
904+
# et peuvent avoir _bcasl_instance_ pour l'instance
905+
for attr_name in dir(module):
906+
try:
907+
attr = getattr(module, attr_name, None)
908+
if attr is None:
909+
continue
910+
if not isinstance(attr, type):
911+
continue
912+
if not getattr(attr, "__bcasl_plugin__", False):
913+
continue
914+
plugin_instance = getattr(attr, "_bcasl_instance_", None)
915+
if plugin_instance is None:
916+
try:
917+
plugin_instance = attr()
918+
except Exception:
919+
continue
920+
if getattr(plugin_instance.meta, "id", None) == plugin_id:
921+
plg = plugin_instance
922+
break
923+
except Exception:
924+
continue
925+
else:
926+
plg = rec.plugin
927+
if plg is None:
902928
raise RuntimeError(
903929
f"Plugin '{plugin_id}' introuvable dans le module"
904930
)
905-
plg = rec.plugin
906931
except Exception as ex:
907932
raise RuntimeError(f"Impossible d'instancier le plugin: {ex}")
908933
# Exécution

0 commit comments

Comments
 (0)