Coverage for src / mysingle / cli / utils / console.py: 35%
34 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1"""Console utilities with rich formatting."""
3from __future__ import annotations
5from rich.console import Console
6from rich.prompt import Confirm, Prompt
7from rich.table import Table
9# Global console instance
10console = Console()
13def print_success(message: str) -> None:
14 """Print success message in green."""
15 console.print(f"✅ {message}", style="bold green")
18def print_error(message: str) -> None:
19 """Print error message in red."""
20 console.print(f"❌ {message}", style="bold red")
23def print_warning(message: str) -> None:
24 """Print warning message in yellow."""
25 console.print(f"⚠️ {message}", style="bold yellow")
28def print_info(message: str) -> None:
29 """Print info message in blue."""
30 console.print(f"ℹ️ {message}", style="bold cyan")
33def print_header(title: str) -> None:
34 """Print section header."""
35 console.print(f"\n[bold cyan]{title}[/bold cyan]\n")
38def ask_choice(prompt: str, choices: list[str], default: str | None = None) -> str:
39 """Ask user to select from choices.
41 Args:
42 prompt: Question to ask
43 choices: List of valid choices
44 default: Default choice (optional)
46 Returns:
47 Selected choice
48 """
49 choices_str = "/".join(choices)
50 if default:
51 prompt_text = f"{prompt} [{choices_str}] (기본: {default})"
52 else:
53 prompt_text = f"{prompt} [{choices_str}]"
55 while True:
56 answer = Prompt.ask(prompt_text, default=default or "")
57 if answer in choices:
58 return answer
59 print_error(
60 f"'{answer}'은(는) 유효하지 않은 선택입니다. {choices_str} 중 하나를 선택하세요."
61 )
64def ask_confirm(prompt: str, default: bool = False) -> bool:
65 """Ask yes/no question.
67 Args:
68 prompt: Question to ask
69 default: Default answer
71 Returns:
72 True if yes, False if no
73 """
74 return Confirm.ask(prompt, default=default)
77def ask_text(prompt: str, default: str = "") -> str:
78 """Ask for text input.
80 Args:
81 prompt: Question to ask
82 default: Default value
84 Returns:
85 User input
86 """
87 return Prompt.ask(prompt, default=default)
90def create_table(title: str, columns: list[str]) -> Table:
91 """Create a formatted table.
93 Args:
94 title: Table title
95 columns: Column names
97 Returns:
98 Rich Table instance
99 """
100 table = Table(title=title, show_header=True, header_style="bold magenta")
101 for col in columns:
102 table.add_column(col)
103 return table