Source code for ralph.display.phase_entry_model

"""Immutable view-model for phase-start banner data."""

from __future__ import annotations

from dataclasses import dataclass

from ralph.display.phase_status import (
    PhaseIterationContext,
    format_analysis_cycle,
    format_dev_cycle,
)


[docs] @dataclass(frozen=True) class PhaseEntryModel: """Immutable view-model for phase-start banner data.""" phase_name: str phase_role: str | None = None agent_name: str | None = None outer_dev_iteration: int | None = None outer_dev_cap: int | None = None inner_analysis: int | None = None inner_analysis_cap: int | None = None
[docs] def to_iteration_context(self) -> PhaseIterationContext: """Return a PhaseIterationContext for canonical label rendering.""" return PhaseIterationContext( outer_dev=self.outer_dev_iteration, outer_dev_cap=self.outer_dev_cap, inner_analysis=self.inner_analysis, inner_analysis_cap=self.inner_analysis_cap, )
[docs] def human_label(self) -> str: """Return the human-readable phase label.""" return self.phase_name.replace("_", " ").title()
[docs] def iteration_label_parts(self) -> list[str]: """Return ordered canonical label strings for the iteration context.""" parts: list[str] = [] if self.outer_dev_iteration is not None: parts.append(format_dev_cycle(self.outer_dev_iteration)) if self.inner_analysis is not None: parts.append(format_analysis_cycle(self.inner_analysis, self.inner_analysis_cap)) return parts