fix: ListDataSource cache and camera dependency resolution

Two critical fixes:

1. ListDataSource Cache Bug
   - Previously, ListDataSource.__init__ cached raw tuples directly
   - get_items() would return cached raw tuples without converting to SourceItem
   - This caused SourceItemsToBufferStage to receive tuples and stringify them
   - Results: ugly tuple representations in terminal/pygame instead of formatted text
   - Fix: Store raw items in _raw_items, let fetch() convert to SourceItem
   - Cache now contains proper SourceItem objects

2. Camera Dependency Resolution
   - CameraStage declared dependency on 'source.items' exactly
   - DataSourceStage provides 'source.headlines' (or 'source.poetry', etc.)
   - Capability matching didn't trigger prefix match for exact dependency
   - Fix: Change CameraStage dependency to 'source' for prefix matching

3. Added app.py Camera Stage Support
   - Pipeline now adds camera stage from preset.camera config
   - Supports vertical, horizontal, omni, floating, bounce modes
   - Tests now passing with proper data flow through all stages

Tests: All 502 tests passing, 16 skipped
This commit is contained in:
2026-03-16 21:55:57 -07:00
parent 85d8b29bab
commit affafe810c
17 changed files with 708 additions and 1301 deletions

View File

@@ -88,17 +88,9 @@ class HudEffect(EffectPlugin):
f"\033[2;1H\033[38;5;45mEFFECT:\033[0m \033[1;38;5;227m{effect_name:12s}\033[0m \033[38;5;245m|\033[0m {bar} \033[38;5;245m|\033[0m \033[38;5;219m{effect_intensity * 100:.0f}%\033[0m"
)
# Try to get pipeline order from context
# Get pipeline order from context
pipeline_order = ctx.get_state("pipeline_order")
if pipeline_order:
pipeline_str = ",".join(pipeline_order)
else:
# Fallback to legacy effect chain
from engine.effects import get_effect_chain
chain = get_effect_chain()
order = chain.get_order() if chain else []
pipeline_str = ",".join(order) if order else "(none)"
pipeline_str = ",".join(pipeline_order) if pipeline_order else "(none)"
hud_lines.append(f"\033[3;1H\033[38;5;44mPIPELINE:\033[0m {pipeline_str}")
for i, line in enumerate(hud_lines):