| 88 | pass |
| 89 | |
| 90 | def render(self): |
| 91 | tree = Tree(f"[cyan]{self.title}[/cyan]", guide_style="grey50") |
| 92 | for step in self.steps: |
| 93 | label = step["label"] |
| 94 | detail_text = step["detail"].strip() if step["detail"] else "" |
| 95 | |
| 96 | status = step["status"] |
| 97 | if status == "done": |
| 98 | symbol = "[green]●[/green]" |
| 99 | elif status == "pending": |
| 100 | symbol = "[green dim]○[/green dim]" |
| 101 | elif status == "running": |
| 102 | symbol = "[cyan]○[/cyan]" |
| 103 | elif status == "error": |
| 104 | symbol = "[red]●[/red]" |
| 105 | elif status == "skipped": |
| 106 | symbol = "[yellow]○[/yellow]" |
| 107 | else: |
| 108 | symbol = " " |
| 109 | |
| 110 | if status == "pending": |
| 111 | # Entire line light gray (pending) |
| 112 | if detail_text: |
| 113 | line = f"{symbol} [bright_black]{label} ({detail_text})[/bright_black]" |
| 114 | else: |
| 115 | line = f"{symbol} [bright_black]{label}[/bright_black]" |
| 116 | else: |
| 117 | # Label white, detail (if any) light gray in parentheses |
| 118 | if detail_text: |
| 119 | line = f"{symbol} [white]{label}[/white] [bright_black]({detail_text})[/bright_black]" |
| 120 | else: |
| 121 | line = f"{symbol} [white]{label}[/white]" |
| 122 | |
| 123 | tree.add(line) |
| 124 | return tree |
| 125 | |
| 126 | |
| 127 | def get_key(): |