Spaces:
Running
Running
File size: 1,344 Bytes
d646dd7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | """Module registry — maps WorkflowNode.type to ProcessingModule instance.
模块在 app/processing/modules/ 下自动发现(见 __init__.py),按 slug 注册。
Worker 执行与前端画布目录都从本注册表取模块定义。
"""
from importlib import import_module
from app.processing import ProcessingModule, ModuleDescriptor
from app.workflow_types import canonical_node_type
_registry: dict[str, ProcessingModule] = {}
def register(cls):
"""Register a processing module by its slug (decorator)."""
if not cls.slug:
raise ValueError(f"Module {cls.__name__} has no slug")
if cls.slug in _registry:
raise ValueError(f"Duplicate module slug: {cls.slug}")
_registry[cls.slug] = cls()
return cls
def get(slug: str) -> ProcessingModule | None:
"""Look up a module by canonical slug or a historical alias."""
return _registry.get(canonical_node_type(slug))
def all_modules() -> list[ProcessingModule]:
"""All registered modules."""
return list(_registry.values())
def all_descriptors() -> list[ModuleDescriptor]:
"""All module descriptors (catalog source of truth)."""
return [m.descriptor() for m in _registry.values()]
# Populate registry on import
# (modules register themselves via @register decorator on class definition)
import_module("app.processing.modules")
|