LG1 Demo App: Mini Task Board
Windows 11で動くPython標準ライブラリのみの小規模デスクトップアプリを作成する。
UI
- Tkinter GUI
- タスク追加
- タスク削除
- status変更: todo / doing / done
- 一覧表示
- 一覧には ID / Title / Status を表示する
- タスク選択後にボタン操作で削除・status変更する
- 操作エラーは tkinter.messagebox でユーザーへ通知する
Domain
- titleはstrのみ
- titleはstripして保存
- strip後空ならValueError
- statusは todo / doing / done のみ
- 不正statusは、unhashable値を含めValueError
- unknown task idはKeyError
- boolをinteger IDとして扱わない
- listはID昇順
- listの返り値は内部listそのものではない
Persistence
- JSON
- 保存先は data/tasks.json
- UTF-8
- 日本語タイトルを保持
- 再起動後も状態保持
- IDは1から開始
- 削除済みIDを再利用しない
- next_idは永続化する
- 既存の空JSONファイルはStoreError
- malformed JSONはStoreError
- invalid UTF-8はStoreError
- strict schema validation
- duplicate IDを拒否
- next_idは全既存IDより大きい
Atomic save
- 保存先と同一ディレクトリにtemporary file
- flush
- os.fsync
- os.replace
- mkstemp/write/fsync/replace失敗を適切に扱う
- replace前の失敗では既存destinationを破壊しない
- temporary fileをcleanupする
Transaction contract
add_task / set_status / delete_task の永続化処理中に例外が発生した場合:
- TaskServiceのin-memory stateを操作前へ完全rollbackする
- add_taskではtasksとnext_idの両方を戻す
- set_statusでは元statusへ戻す
- delete_taskでは削除したtaskを戻す
- persistence層から発生した元例外を別の例外へ変更せず、そのまま再raiseする
- rollback後もTaskServiceが公開する状態と次回save対象状態が一致する
Structure
最低限:
- task_model.py
- task_store.py
- task_service.py
- app.py
- test_task_manager.py
TaskStoreは永続化を主責務とし、domainのmutable stateをTaskServiceと二重所有しないこと。
Constraints
- Python標準ライブラリのみ
- アプリ本体はネットワーク通信しない
- アプリ本体はsubprocessを実行しない
- テスト専用の特殊分岐を実装しない