4 Commits

Author SHA1 Message Date
686e6cf0dc style: Fix linting errors and organize imports 2026-03-30 19:41:04 -07:00
14529bd6fa fix: Update imports to use engine.pipeline instead of engine.pipeline.core
The old engine/pipeline/core.py file was removed as part of the Sideline/Mainline split.
All imports that referenced engine.pipeline.core have been updated to use engine.pipeline
which re-exports from sideline.pipeline.core.

This ensures consistency and avoids duplicate DataType enum instances.
2026-03-30 19:41:04 -07:00
e4b143ff36 feat: Implement Sideline plugin system with consistent terminology
This commit implements the Sideline/Mainline split with a clean plugin architecture:

## Core Changes

### Sideline Framework (New Directory)
- Created  directory containing the reusable pipeline framework
- Moved pipeline core, controllers, adapters, and registry to
- Moved display system to
- Moved effects system to
- Created plugin system with security and compatibility management in
- Created preset pack system with ASCII art encoding in
- Added default font (Corptic) to
- Added terminal ANSI constants to

### Mainline Application (Updated)
- Created  for Mainline stage component registration
- Updated  to register Mainline stages at startup
- Updated  as a compatibility shim re-exporting from sideline

### Terminology Consistency
- : Base class for all pipeline components (sources, effects, displays, cameras)
- : Base class for distributable plugin packages (was )
- : Base class for visual effects (was )
- Backward compatibility aliases maintained for existing code

## Key Features
- Plugin discovery via entry points and explicit registration
- Security permissions system for plugins
- Compatibility management with semantic version constraints
- Preset pack system for distributable configurations
- Default font bundled with Sideline (Corptic.otf)

## Testing
- Updated tests to register Mainline stages before discovery
- All StageRegistry tests passing

Note: This is a major refactoring that separates the framework (Sideline) from the application (Mainline), enabling Sideline to be used by other applications.
2026-03-30 19:41:04 -07:00
2d28e92594 feature/capability-based-deps (#53)
Reviewed-on: #53
Co-authored-by: David Gwilliam <dhgwilliam@gmail.com>
Co-committed-by: David Gwilliam <dhgwilliam@gmail.com>
2026-03-31 01:55:21 +00:00
3 changed files with 34 additions and 42 deletions

View File

@@ -10,12 +10,18 @@ from engine.display import BorderMode, DisplayRegistry
from engine.effects import get_registry
from engine.fetch import fetch_all, fetch_all_fast, fetch_poetry, load_cache, save_cache
# Import from engine (Mainline-specific)
from engine.pipeline import list_presets
# Import from engine (Mainline-specific)
from engine.pipeline.ui import UIConfig, UIPanel
from engine.pipeline.validation import validate_pipeline_config
# Import from sideline (the framework)
from sideline.pipeline import (
Pipeline,
PipelineConfig,
PipelineContext,
StageRegistry,
)
from sideline.pipeline.adapters import (
CameraStage,
@@ -26,10 +32,6 @@ from sideline.pipeline.adapters import (
)
from sideline.pipeline.params import PipelineParams
# Import from engine (Mainline-specific)
from engine.pipeline.ui import UIConfig, UIPanel
from engine.pipeline.validation import validate_pipeline_config
try:
from engine.display.backends.websocket import WebSocketDisplay
except ImportError:

View File

@@ -9,28 +9,6 @@ Note: This module is deprecated and will be removed in future versions.
"""
# Re-export from sideline for backward compatibility
from sideline.pipeline import (
Pipeline,
PipelineConfig,
PipelineContext,
Stage,
StageConfig,
StageError,
StageResult,
PipelineParams,
StageRegistry,
discover_stages,
register_camera,
register_display,
register_effect,
register_source,
)
# Also re-export from sideline.core for compatibility
from sideline.pipeline.core import (
DataType,
)
# Re-export from engine.pipeline.presets (Mainline-specific)
from engine.pipeline.presets import (
DEMO_PRESET,
@@ -45,6 +23,32 @@ from engine.pipeline.presets import (
list_presets,
)
# Re-export additional functions from sideline.pipeline
from sideline.pipeline import (
Pipeline,
PipelineConfig,
PipelineContext,
PipelineParams,
PipelineRunner,
Stage,
StageConfig,
StageError,
StageRegistry,
StageResult,
create_default_pipeline,
create_pipeline_from_params,
discover_stages,
register_camera,
register_display,
register_effect,
register_source,
)
# Also re-export from sideline.core for compatibility
from sideline.pipeline.core import (
DataType,
)
# Re-export from sideline.pipeline.params
from sideline.pipeline.params import (
DEFAULT_HEADLINE_PARAMS,
@@ -52,13 +56,6 @@ from sideline.pipeline.params import (
DEFAULT_PYGAME_PARAMS,
)
# Re-export additional functions from sideline.pipeline
from sideline.pipeline import (
create_default_pipeline,
create_pipeline_from_params,
PipelineRunner,
)
__all__ = [
# Core (from sideline)
"Stage",

View File

@@ -38,10 +38,10 @@ def register_stages(registry):
def _register_data_sources(registry):
"""Register Mainline data source stages."""
try:
from engine.data_sources.sources import HeadlinesDataSource, PoetryDataSource
from engine.data_sources.pipeline_introspection import (
PipelineIntrospectionSource,
)
from engine.data_sources.sources import HeadlinesDataSource, PoetryDataSource
registry.register("source", HeadlinesDataSource)
registry.register("source", PoetryDataSource)
@@ -60,13 +60,6 @@ def _register_data_sources(registry):
def _register_effects(registry):
"""Register Mainline effect stages."""
try:
# Register effects
from sideline.effects import EffectRegistry
from sideline.effects.registry import get_registry
# Get the global effect registry instance
effect_registry = get_registry()
# Note: EffectRegistry stores effect instances, not classes
# For now, skip effect registration since it requires more refactoring
logger.info("Effect registration skipped (requires effect refactoring)")