AzLearn

تمرين إعادة البناء

قائمة مهام بسيطة JSON

ابنِ قائمة مهام CLI تحفظ البيانات في ملف JSON محلي.

python ~20 دقيقة مبتدئ
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
import argparse
import json
from datetime import datetime
from pathlib import Path


def load_tasks(path: Path) -> list[dict[str, object]]:
    if not path.exists():
        return []
    return json.loads(path.read_text(encoding="utf-8"))


def save_tasks(path: Path, tasks: list[dict[str, object]]) -> None:
    path.write_text(json.dumps(tasks, indent=2, ensure_ascii=False), encoding="utf-8")


def add_task(tasks: list[dict[str, object]], text: str) -> None:
    next_id = max((int(task["id"]) for task in tasks), default=0) + 1
    tasks.append({"id": next_id, "text": text, "done": False, "created": datetime.now().isoformat(timespec="seconds")})


def mark_done(tasks: list[dict[str, object]], task_id: int) -> bool:
    for task in tasks:
        if task["id"] == task_id:
            task["done"] = True
            return True
    return False


def remove_task(tasks: list[dict[str, object]], task_id: int) -> bool:
    before = len(tasks)
    tasks[:] = [task for task in tasks if task["id"] != task_id]
    return len(tasks) != before


def print_tasks(tasks: list[dict[str, object]]) -> None:
    for task in tasks:
        mark = "✓" if task["done"] else " "
        print(f"[{mark}] {task['id']}: {task['text']}")


def main() -> None:
    parser = argparse.ArgumentParser(description="Small JSON-backed todo list.")
    parser.add_argument("command", choices=["add", "done", "remove", "list"])
    parser.add_argument("value", nargs="?")
    parser.add_argument("--file", type=Path, default=Path("todos.json"))
    args = parser.parse_args()

    tasks = load_tasks(args.file)
    if args.command == "add" and args.value:
        add_task(tasks, args.value)
    elif args.command == "done" and args.value:
        mark_done(tasks, int(args.value))
    elif args.command == "remove" and args.value:
        remove_task(tasks, int(args.value))

    save_tasks(args.file, tasks)
    print_tasks(tasks)


if __name__ == "__main__":
    main()
اكتب هنا