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

1"""Console utilities with rich formatting.""" 

2 

3from __future__ import annotations 

4 

5from rich.console import Console 

6from rich.prompt import Confirm, Prompt 

7from rich.table import Table 

8 

9# Global console instance 

10console = Console() 

11 

12 

13def print_success(message: str) -> None: 

14 """Print success message in green.""" 

15 console.print(f"{message}", style="bold green") 

16 

17 

18def print_error(message: str) -> None: 

19 """Print error message in red.""" 

20 console.print(f"{message}", style="bold red") 

21 

22 

23def print_warning(message: str) -> None: 

24 """Print warning message in yellow.""" 

25 console.print(f"⚠️ {message}", style="bold yellow") 

26 

27 

28def print_info(message: str) -> None: 

29 """Print info message in blue.""" 

30 console.print(f"ℹ️ {message}", style="bold cyan") 

31 

32 

33def print_header(title: str) -> None: 

34 """Print section header.""" 

35 console.print(f"\n[bold cyan]{title}[/bold cyan]\n") 

36 

37 

38def ask_choice(prompt: str, choices: list[str], default: str | None = None) -> str: 

39 """Ask user to select from choices. 

40 

41 Args: 

42 prompt: Question to ask 

43 choices: List of valid choices 

44 default: Default choice (optional) 

45 

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}]" 

54 

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 ) 

62 

63 

64def ask_confirm(prompt: str, default: bool = False) -> bool: 

65 """Ask yes/no question. 

66 

67 Args: 

68 prompt: Question to ask 

69 default: Default answer 

70 

71 Returns: 

72 True if yes, False if no 

73 """ 

74 return Confirm.ask(prompt, default=default) 

75 

76 

77def ask_text(prompt: str, default: str = "") -> str: 

78 """Ask for text input. 

79 

80 Args: 

81 prompt: Question to ask 

82 default: Default value 

83 

84 Returns: 

85 User input 

86 """ 

87 return Prompt.ask(prompt, default=default) 

88 

89 

90def create_table(title: str, columns: list[str]) -> Table: 

91 """Create a formatted table. 

92 

93 Args: 

94 title: Table title 

95 columns: Column names 

96 

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