| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- """
- 命令行界面模块
- """
- import argparse
- import sys
- from typing import List
- from .todo import Todo
- from .storage import Storage
- class CLI:
- """命令行界面类"""
-
- def __init__(self, storage_path: str = "todos.json"):
- self.storage = Storage(storage_path)
- self.todo = self.storage.load()
-
- def run(self, args: List[str] = None):
- """运行命令行界面"""
- parser = argparse.ArgumentParser(
- description="Todo List - 简单的待办事项管理工具",
- formatter_class=argparse.RawDescriptionHelpFormatter,
- epilog="""
- 示例:
- %(prog)s add "买菜" # 添加待办事项
- %(prog)s list # 查看所有待办事项
- %(prog)s complete 1 # 标记ID为1的事项为完成
- %(prog)s delete 1 # 删除ID为1的事项
- """
- )
-
- subparsers = parser.add_subparsers(dest="command", help="可用命令")
-
- # add 命令
- parser_add = subparsers.add_parser("add", help="添加待办事项")
- parser_add.add_argument("title", help="待办事项标题")
-
- # list 命令
- parser_list = subparsers.add_parser("list", help="查看待办事项")
- parser_list.add_argument(
- "--filter",
- choices=["all", "pending", "completed"],
- default="all",
- help="筛选条件 (默认: all)"
- )
-
- # complete 命令
- parser_complete = subparsers.add_parser("complete", help="标记为完成")
- parser_complete.add_argument("id", type=int, help="待办事项ID")
-
- # uncomplete 命令
- parser_uncomplete = subparsers.add_parser("uncomplete", help="标记为未完成")
- parser_uncomplete.add_argument("id", type=int, help="待办事项ID")
-
- # delete 命令
- parser_delete = subparsers.add_parser("delete", help="删除待办事项")
- parser_delete.add_argument("id", type=int, help="待办事项ID")
-
- # clear 命令
- parser_clear = subparsers.add_parser("clear", help="清除所有已完成的事项")
-
- # 解析参数
- parsed_args = parser.parse_args(args)
-
- if not parsed_args.command:
- parser.print_help()
- return
-
- # 执行命令
- try:
- if parsed_args.command == "add":
- self.cmd_add(parsed_args.title)
- elif parsed_args.command == "list":
- self.cmd_list(parsed_args.filter)
- elif parsed_args.command == "complete":
- self.cmd_complete(parsed_args.id)
- elif parsed_args.command == "uncomplete":
- self.cmd_uncomplete(parsed_args.id)
- elif parsed_args.command == "delete":
- self.cmd_delete(parsed_args.id)
- elif parsed_args.command == "clear":
- self.cmd_clear()
- except Exception as e:
- print(f"错误: {e}", file=sys.stderr)
- sys.exit(1)
-
- def cmd_add(self, title: str):
- """添加待办事项"""
- item = self.todo.add(title)
- self.storage.save(self.todo)
- print(f"✓ 已添加: {item.title} (ID: {item.id})")
-
- def cmd_list(self, filter_type: str = "all"):
- """列出待办事项"""
- if filter_type == "pending":
- items = self.todo.get_pending()
- title = "未完成的待办事项"
- elif filter_type == "completed":
- items = self.todo.get_completed()
- title = "已完成的待办事项"
- else:
- items = self.todo.get_all()
- title = "所有待办事项"
-
- if not items:
- print(f"{title}: 无")
- return
-
- print(f"\n{title}:")
- print("-" * 50)
- for item in items:
- status = "✓" if item.completed else " "
- print(f"[{status}] {item.id}. {item.title}")
- print(f" 创建时间: {item.created_at}")
- print("-" * 50)
-
- # 统计信息
- total = len(self.todo.get_all())
- completed = len(self.todo.get_completed())
- pending = len(self.todo.get_pending())
- print(f"总计: {total} | 已完成: {completed} | 未完成: {pending}")
-
- def cmd_complete(self, item_id: int):
- """标记为完成"""
- if self.todo.complete(item_id):
- self.storage.save(self.todo)
- item = self.todo.get_by_id(item_id)
- print(f"✓ 已完成: {item.title}")
- else:
- print(f"错误: 找不到ID为 {item_id} 的待办事项", file=sys.stderr)
- sys.exit(1)
-
- def cmd_uncomplete(self, item_id: int):
- """标记为未完成"""
- if self.todo.uncomplete(item_id):
- self.storage.save(self.todo)
- item = self.todo.get_by_id(item_id)
- print(f"○ 已标记为未完成: {item.title}")
- else:
- print(f"错误: 找不到ID为 {item_id} 的待办事项", file=sys.stderr)
- sys.exit(1)
-
- def cmd_delete(self, item_id: int):
- """删除待办事项"""
- item = self.todo.get_by_id(item_id)
- if item and self.todo.delete(item_id):
- self.storage.save(self.todo)
- print(f"✓ 已删除: {item.title}")
- else:
- print(f"错误: 找不到ID为 {item_id} 的待办事项", file=sys.stderr)
- sys.exit(1)
-
- def cmd_clear(self):
- """清除所有已完成的事项"""
- count = self.todo.clear_completed()
- self.storage.save(self.todo)
- print(f"✓ 已清除 {count} 个已完成的待办事项")
|