refactor: Make EffectPlugin an abstract base class, update effects to inherit from it, and improve plugin discovery.

This commit is contained in:
2026-03-18 23:06:04 -07:00
parent ac9b47f668
commit edd1416407
6 changed files with 45 additions and 15 deletions

View File

@@ -1,3 +1,4 @@
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import Any
@@ -8,10 +9,11 @@ class EffectContext:
terminal_height: int
scroll_cam: int
ticker_height: int
mic_excess: float
grad_offset: float
frame_number: int
has_message: bool
camera_x: int = 0
mic_excess: float = 0.0
grad_offset: float = 0.0
frame_number: int = 0
has_message: bool = False
items: list = field(default_factory=list)
@@ -22,15 +24,42 @@ class EffectConfig:
params: dict[str, Any] = field(default_factory=dict)
class EffectPlugin:
class EffectPlugin(ABC):
name: str
config: EffectConfig
def process(self, buf: list[str], ctx: EffectContext) -> list[str]:
raise NotImplementedError
@abstractmethod
def process(self, buf: list[str], ctx: EffectContext) -> list[str]: ...
def configure(self, config: EffectConfig) -> None:
raise NotImplementedError
@abstractmethod
def configure(self, config: EffectConfig) -> None: ...
def create_effect_context(
terminal_width: int = 80,
terminal_height: int = 24,
scroll_cam: int = 0,
ticker_height: int = 0,
camera_x: int = 0,
mic_excess: float = 0.0,
grad_offset: float = 0.0,
frame_number: int = 0,
has_message: bool = False,
items: list | None = None,
) -> EffectContext:
"""Factory function to create EffectContext with sensible defaults."""
return EffectContext(
terminal_width=terminal_width,
terminal_height=terminal_height,
scroll_cam=scroll_cam,
ticker_height=ticker_height,
camera_x=camera_x,
mic_excess=mic_excess,
grad_offset=grad_offset,
frame_number=frame_number,
has_message=has_message,
items=items or [],
)
@dataclass