Compare commits

...

2 Commits

Author SHA1 Message Date
AI Christianson 7f65efa728 add console renderer backend 2025-02-24 13:56:08 -05:00
AI Christianson 3af8780f51 base types for abstracting output 2025-02-24 13:50:25 -05:00
3 changed files with 90 additions and 0 deletions

View File

@ -0,0 +1,8 @@
from typing import Protocol
from .models import MarkdownPanel, StageHeader, TaskHeader, StatusMessage
class OutputRenderer(Protocol):
def render_panel(self, panel: MarkdownPanel) -> None: ...
def render_stage(self, header: StageHeader) -> None: ...
def render_task(self, header: TaskHeader) -> None: ...
def render_status(self, message: StatusMessage) -> None: ...

View File

@ -0,0 +1,24 @@
from dataclasses import dataclass
from typing import Optional
@dataclass
class MarkdownPanel:
content: str
title: Optional[str] = None
icon: Optional[str] = None
border_style: Optional[str] = None
@dataclass
class StageHeader:
text: str
icon: Optional[str] = None
@dataclass
class TaskHeader:
text: str
icon: Optional[str] = None
@dataclass
class StatusMessage:
text: str
style: Optional[str] = None

View File

@ -0,0 +1,58 @@
"""Console renderer implementation using Rich."""
from rich.markdown import Markdown
from rich.panel import Panel
from ra_aid.console.formatting import console
from ra_aid.output.interface.base import OutputRenderer
from ra_aid.output.interface.models import (
MarkdownPanel,
StageHeader,
TaskHeader,
StatusMessage,
)
class ConsoleRenderer(OutputRenderer):
"""Rich console implementation of the OutputRenderer interface."""
def render_panel(self, panel: MarkdownPanel) -> None:
"""Render a markdown panel using Rich.
Args:
panel: Panel configuration containing content and styling
"""
console.print(
Panel(
Markdown(panel.content),
title=f"{panel.icon + ' ' if panel.icon else ''}{panel.title or ''}".strip() or None,
border_style=panel.border_style or "bright_blue",
)
)
def render_stage(self, header: StageHeader) -> None:
"""Render a stage header.
Args:
header: Stage header configuration
"""
icon = f"{header.icon} " if header.icon else "🚀 " # Default icon
panel_content = f"{icon}{header.text.title()}"
console.print(Panel(panel_content, style="green bold", padding=0))
def render_task(self, header: TaskHeader) -> None:
"""Render a task header with markdown support.
Args:
header: Task header configuration
"""
icon = f"{header.icon} " if header.icon else "🔧 " # Default icon
console.print(Panel(Markdown(header.text), title=f"{icon}Task", border_style="yellow bold"))
def render_status(self, message: StatusMessage) -> None:
"""Render a status message.
Args:
message: Status message configuration
"""
console.print(message.text, style=message.style or "blue")