cli.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. """
  2. 命令行界面模块
  3. """
  4. import argparse
  5. import sys
  6. from typing import List
  7. from .todo import Todo
  8. from .storage import Storage
  9. class CLI:
  10. """命令行界面类"""
  11. def __init__(self, storage_path: str = "todos.json"):
  12. self.storage = Storage(storage_path)
  13. self.todo = self.storage.load()
  14. def run(self, args: List[str] = None):
  15. """运行命令行界面"""
  16. parser = argparse.ArgumentParser(
  17. description="Todo List - 简单的待办事项管理工具",
  18. formatter_class=argparse.RawDescriptionHelpFormatter,
  19. epilog="""
  20. 示例:
  21. %(prog)s add "买菜" # 添加待办事项
  22. %(prog)s list # 查看所有待办事项
  23. %(prog)s complete 1 # 标记ID为1的事项为完成
  24. %(prog)s delete 1 # 删除ID为1的事项
  25. """
  26. )
  27. subparsers = parser.add_subparsers(dest="command", help="可用命令")
  28. # add 命令
  29. parser_add = subparsers.add_parser("add", help="添加待办事项")
  30. parser_add.add_argument("title", help="待办事项标题")
  31. # list 命令
  32. parser_list = subparsers.add_parser("list", help="查看待办事项")
  33. parser_list.add_argument(
  34. "--filter",
  35. choices=["all", "pending", "completed"],
  36. default="all",
  37. help="筛选条件 (默认: all)"
  38. )
  39. # complete 命令
  40. parser_complete = subparsers.add_parser("complete", help="标记为完成")
  41. parser_complete.add_argument("id", type=int, help="待办事项ID")
  42. # uncomplete 命令
  43. parser_uncomplete = subparsers.add_parser("uncomplete", help="标记为未完成")
  44. parser_uncomplete.add_argument("id", type=int, help="待办事项ID")
  45. # delete 命令
  46. parser_delete = subparsers.add_parser("delete", help="删除待办事项")
  47. parser_delete.add_argument("id", type=int, help="待办事项ID")
  48. # clear 命令
  49. parser_clear = subparsers.add_parser("clear", help="清除所有已完成的事项")
  50. # 解析参数
  51. parsed_args = parser.parse_args(args)
  52. if not parsed_args.command:
  53. parser.print_help()
  54. return
  55. # 执行命令
  56. try:
  57. if parsed_args.command == "add":
  58. self.cmd_add(parsed_args.title)
  59. elif parsed_args.command == "list":
  60. self.cmd_list(parsed_args.filter)
  61. elif parsed_args.command == "complete":
  62. self.cmd_complete(parsed_args.id)
  63. elif parsed_args.command == "uncomplete":
  64. self.cmd_uncomplete(parsed_args.id)
  65. elif parsed_args.command == "delete":
  66. self.cmd_delete(parsed_args.id)
  67. elif parsed_args.command == "clear":
  68. self.cmd_clear()
  69. except Exception as e:
  70. print(f"错误: {e}", file=sys.stderr)
  71. sys.exit(1)
  72. def cmd_add(self, title: str):
  73. """添加待办事项"""
  74. item = self.todo.add(title)
  75. self.storage.save(self.todo)
  76. print(f"✓ 已添加: {item.title} (ID: {item.id})")
  77. def cmd_list(self, filter_type: str = "all"):
  78. """列出待办事项"""
  79. if filter_type == "pending":
  80. items = self.todo.get_pending()
  81. title = "未完成的待办事项"
  82. elif filter_type == "completed":
  83. items = self.todo.get_completed()
  84. title = "已完成的待办事项"
  85. else:
  86. items = self.todo.get_all()
  87. title = "所有待办事项"
  88. if not items:
  89. print(f"{title}: 无")
  90. return
  91. print(f"\n{title}:")
  92. print("-" * 50)
  93. for item in items:
  94. status = "✓" if item.completed else " "
  95. print(f"[{status}] {item.id}. {item.title}")
  96. print(f" 创建时间: {item.created_at}")
  97. print("-" * 50)
  98. # 统计信息
  99. total = len(self.todo.get_all())
  100. completed = len(self.todo.get_completed())
  101. pending = len(self.todo.get_pending())
  102. print(f"总计: {total} | 已完成: {completed} | 未完成: {pending}")
  103. def cmd_complete(self, item_id: int):
  104. """标记为完成"""
  105. if self.todo.complete(item_id):
  106. self.storage.save(self.todo)
  107. item = self.todo.get_by_id(item_id)
  108. print(f"✓ 已完成: {item.title}")
  109. else:
  110. print(f"错误: 找不到ID为 {item_id} 的待办事项", file=sys.stderr)
  111. sys.exit(1)
  112. def cmd_uncomplete(self, item_id: int):
  113. """标记为未完成"""
  114. if self.todo.uncomplete(item_id):
  115. self.storage.save(self.todo)
  116. item = self.todo.get_by_id(item_id)
  117. print(f"○ 已标记为未完成: {item.title}")
  118. else:
  119. print(f"错误: 找不到ID为 {item_id} 的待办事项", file=sys.stderr)
  120. sys.exit(1)
  121. def cmd_delete(self, item_id: int):
  122. """删除待办事项"""
  123. item = self.todo.get_by_id(item_id)
  124. if item and self.todo.delete(item_id):
  125. self.storage.save(self.todo)
  126. print(f"✓ 已删除: {item.title}")
  127. else:
  128. print(f"错误: 找不到ID为 {item_id} 的待办事项", file=sys.stderr)
  129. sys.exit(1)
  130. def cmd_clear(self):
  131. """清除所有已完成的事项"""
  132. count = self.todo.clear_completed()
  133. self.storage.save(self.todo)
  134. print(f"✓ 已清除 {count} 个已完成的待办事项")