# ===== CodeLab: Python 练手项目:从想法到作品 =====
# 来源: https://aoerliang.dpdns.org/articles/python-projects
# 以下代码片段按文章出现顺序拼接, 共 5 段

# ----- 片段 1 (python) -----
import json, os

FILE = "todos.json"

def load():
    if not os.path.exists(FILE):
        return []
    with open(FILE, encoding="utf-8") as f:
        return json.load(f)

def save(todos):
    with open(FILE, "w", encoding="utf-8") as f:
        json.dump(todos, f, ensure_ascii=False, indent=2)

def add(text):
    todos = load()
    todos.append({"text": text, "done": False})
    save(todos)
    print(f"已添加: {text}")

# ----- 片段 2 (python) -----
# todo.py —— 主入口,只做命令分发
import sys
from storage import load, save

def main():
    args = sys.argv[1:]
    if not args:
        print("用法: python todo.py add 买牛奶")
        return
    if args[0] == "add":
        add(" ".join(args[1:]))

if __name__ == "__main__":
    main()

# ----- 片段 3 (python) -----
# storage.py —— 单独管数据读写,职责单一
import json, os

def load():
    ...   # 实现同上

def save(todos):
    ...   # 实现同上

# ----- 片段 4 (python) -----
import argparse

parser = argparse.ArgumentParser(description="待办清单")
parser.add_argument("action", choices=["add", "list", "done"])
parser.add_argument("text", nargs="*")
args = parser.parse_args()

if args.action == "list":
    for i, t in enumerate(load(), 1):
        mark = "✓" if t["done"] else "·"
        print(f"{i}. {mark} {t['text']}")

# ----- 片段 5 (python) -----
# test_todo.py
from storage import load, save

def test_save_load_roundtrip(tmp_path, monkeypatch):
    monkeypatch.setattr("storage.FILE", str(tmp_path / "t.json"))
    save([{"text": "买牛奶", "done": False}])
    assert load()[0]["text"] == "买牛奶"
