""" 命令行界面模块 """ 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} 个已完成的待办事项")