forked from genewildish/Mainline
- Add EffectPlugin ABC with @abstractmethod decorators for interface enforcement - Add runtime interface checking in discover_plugins() with issubclass() - Add EffectContext factory with sensible defaults - Standardize Display __init__ (remove redundant init in TerminalDisplay) - Document effect behavior when ticker_height=0 - Evaluate legacy effects: document coexistence, no deprecation needed - Research plugin patterns (VST, Python entry points) - Fix pysixel dependency (removed broken dependency) Test coverage improvements: - Add DisplayRegistry tests - Add MultiDisplay tests - Add SixelDisplay tests - Add controller._get_display tests - Add effects controller command handling tests - Add benchmark regression tests (@pytest.mark.benchmark) - Add pytest marker for benchmark tests in pyproject.toml Documentation updates: - Update AGENTS.md with 56% coverage stats and effect plugin docs - Update README.md with Sixel display mode and benchmark commands - Add new modules to architecture section
39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
from pathlib import Path
|
|
|
|
PLUGIN_DIR = Path(__file__).parent
|
|
|
|
|
|
def discover_plugins():
|
|
from engine.effects.registry import get_registry
|
|
from engine.effects.types import EffectPlugin
|
|
|
|
registry = get_registry()
|
|
imported = {}
|
|
|
|
for file_path in PLUGIN_DIR.glob("*.py"):
|
|
if file_path.name.startswith("_"):
|
|
continue
|
|
module_name = file_path.stem
|
|
if module_name in ("base", "types"):
|
|
continue
|
|
|
|
try:
|
|
module = __import__(f"effects_plugins.{module_name}", fromlist=[""])
|
|
for attr_name in dir(module):
|
|
attr = getattr(module, attr_name)
|
|
if (
|
|
isinstance(attr, type)
|
|
and issubclass(attr, EffectPlugin)
|
|
and attr is not EffectPlugin
|
|
and attr_name.endswith("Effect")
|
|
):
|
|
plugin = attr()
|
|
if not isinstance(plugin, EffectPlugin):
|
|
continue
|
|
registry.register(plugin)
|
|
imported[plugin.name] = plugin
|
|
except Exception:
|
|
pass
|
|
|
|
return imported
|