from typing import TYPE_CHECKING, Protocol, runtime_checkable if TYPE_CHECKING: from rich.console import Console, ConsoleOptions, RenderableType from .help import HelpEntry, HelpPanel from .specs import ColumnSpec @runtime_checkable class Renderer(Protocol): """Protocol for column renderers that transform HelpEntry to display content.""" def __call__(self, entry: "HelpEntry") -> "RenderableType": ... @runtime_checkable class ColumnSpecBuilder(Protocol): """Protocol for ColumnSpecBuilders.""" def __call__( self, console: "Console", options: "ConsoleOptions", entries: list["HelpEntry"] ) -> tuple["ColumnSpec", ...]: """Build column specifications based on console settings and entries. Parameters ---------- console : ~rich.console.Console The Rich console instance. options : ~rich.console.ConsoleOptions Console rendering options. entries : list[HelpEntry] List of help entries to be displayed. Returns ------- tuple[ColumnSpec, ...] Tuple of column specifications for table rendering. """ ... @runtime_checkable class HelpFormatter(Protocol): """Protocol for help **formatter** functions. It's the Formatter's job to transform a :class:`.HelpPanel` into rendered text on the display. Implementations may optionally provide the following methods for custom rendering of "usage" and "description". If these methods are not provided, default rendering will be used. .. code-block:: python def render_usage(self, console: Console, options: ConsoleOptions, usage: Any) -> None: \"\"\"Render the usage line.\"\"\" ... def render_description(self, console: Console, options: ConsoleOptions, description: Any) -> None: \"\"\"Render the description.\"\"\" ... """ def __call__( self, console: "Console", options: "ConsoleOptions", panel: "HelpPanel", ) -> None: """Format and render a single help panel. Parameters ---------- console : ~rich.console.Console Console to render to. options : ~rich.console.ConsoleOptions Console rendering options. panel : HelpPanel Help panel to render (commands, parameters, etc). """ ...