Coverage for src/dmxfy/cli/cli.py: 51%

55 statements  

« prev     ^ index     » next       coverage.py v7.10.1, created at 2025-08-12 11:38 +0800

1import sys 

2from typing import NoReturn, Any 

3 

4from prompt_toolkit import PromptSession 

5from prompt_toolkit.history import FileHistory 

6from prompt_toolkit.auto_suggest import AutoSuggestFromHistory 

7import os 

8 

9from dmxfy.client.client import TranslationClient 

10from dmxfy.exceptions.exceptions import DMXFYException 

11 

12 

13class CLI: 

14 """Command-line interface for DMXFY""" 

15 

16 def __init__(self) -> None: 

17 self.client = TranslationClient() 

18 self.target_lang = "英语" 

19 self.source_lang = "简体中文" 

20 self.prompt_str = "汉译英> " 

21 

22 # Create history file path in user's home directory 

23 history_file = os.path.expanduser("~/.dmxfy_history") 

24 

25 # Create prompt session with history 

26 self.session: PromptSession[Any] = PromptSession( 

27 history=FileHistory(history_file), 

28 auto_suggest=AutoSuggestFromHistory(), 

29 enable_history_search=True 

30 ) 

31 

32 def run(self) -> NoReturn: 

33 """Run the CLI interface""" 

34 print("Welcome to DMXFY - 大语言模型翻译器") 

35 print("Type '\\e' to switch to English-to-Chinese translation") 

36 print("Type '\\c' to switch to Chinese-to-English translation") 

37 print("Press Ctrl+C or Ctrl+D to exit") 

38 print("Use Up/Down arrow keys to navigate history") 

39 print("Use Ctrl+R for reverse history search") 

40 

41 while True: 

42 try: 

43 text = self.session.prompt(self.prompt_str) 

44 except KeyboardInterrupt: 

45 print("\nGoodbye!") 

46 sys.exit(0) 

47 except EOFError: 

48 print("\nGoodbye!") 

49 sys.exit(0) 

50 

51 if text.startswith("\\e"): 

52 self._switch_to_en_to_ch() 

53 elif text.startswith("\\c"): 

54 self._switch_to_ch_to_en() 

55 else: 

56 self._translate(text) 

57 

58 def _switch_to_en_to_ch(self) -> None: 

59 """Switch to English-to-Chinese translation mode""" 

60 self.target_lang = "简体中文" 

61 self.source_lang = "英语" 

62 self.prompt_str = "En2Ch> " 

63 print("Translate English to Chinese") 

64 

65 def _switch_to_ch_to_en(self) -> None: 

66 """Switch to Chinese-to-English translation mode""" 

67 self.target_lang = "英语" 

68 self.source_lang = "简体中文" 

69 self.prompt_str = "汉译英> " 

70 print("翻译成英文") 

71 

72 def _translate(self, text: str) -> None: 

73 """Translate text and print the result""" 

74 if not text.strip(): 

75 return 

76 

77 try: 

78 result = self.client.translate( 

79 text, source_lang=self.source_lang, target_lang=self.target_lang 

80 ) 

81 print(result) 

82 except DMXFYException as e: 

83 print(f"Error: {e}", file=sys.stderr)