Google Tasks 資料流¶
回到 資料流索引
層級結構¶
| 層 | 檔案 | 主要類別/函數 |
|---|---|---|
| Raw | models_raw.py | GoogleTaskRaw (18 fields), GoogleTaskListRaw |
| Read | models_read.py | GoogleTaskRead |
| Core | async_core.py | async_get_all_tasks(), async_task_list(), async_tasklists_list(), _to_task_model() |
| TOON | models_read.py | to_toon_tasklist(), to_toon_task(), _build_parent_tree(), _deduplicate_tasks() |
| MCP | task_tools.py | get_all_tasks(), get_task_from_tasklist(), list_tasklists() |
轉換函數詳解¶
GoogleTaskRead.from_dict(data: Dict, parent_title?) → GoogleTaskRead¶
- 輸入:Google Tasks API 原始 JSON dict
- 做了什麼:
- 提取
due/completed並用to_datetime()轉為 datetime - 計算
status:已完成 →"✓ MM-DD",未完成 →"pending" - 處理
parent:有父 ID 時組合為"Title (id=FULL_ID)"字串 - 用
format_for_llm()格式化日期為"YYYY-MM-DD HH:MM" - 全天標記:Tasks 的
due永遠是T00:00:00Z(API 限制),all_day固定為True - Source ID:保留
id欄位以支持後續操作
_to_task_model(raw: Dict) → Dict (在 async_core.py)¶
- 做了什麼:薄包裝,直接呼叫
GoogleTaskRead.from_dict(raw).model_dump()
to_toon_task(task, current_month) → dict¶
- 做了什麼:將單一
GoogleTaskRead轉為{title: {id, notes, done, done_at, due, p}}格式
_deduplicate_tasks(tasks) → List[GoogleTaskRead]¶
- 做了什麼:掃描重複標題,自動加上
#1,#2後綴(如"微積分#1","微積分#2")
_build_parent_tree(tasks) → dict¶
- 做了什麼:解析
parent欄位建立{"父任務": {"子任務": "child"}}的樹狀結構
to_toon_tasklist(tasks, name, id) → dict¶
- 輸入:
List[GoogleTaskRead]+ 清單名稱/ID - 做了什麼:
- 呼叫
_deduplicate_tasks()去重 - 呼叫
_build_parent_tree()建立父子關係 - 按月份分組(
month),每月再按done/pending分類 - 無日期的任務歸入
undated - 回傳
{source: {id, title}, parent_tree, month, undated}結構
list_tasklists 工具¶
list_tasklists 不經過 TOON 轉換函數,直接在 Tool 層組裝:
async_tasklists_list() → {tasklists: [{id, title}]} → safe_encode()
[!NOTE]
async_core.async_tasklists_list()在 Core 層已過濾 API 回傳的kind、etag、selfLink、updated等欄位,僅回傳{id, title}。 回傳的 TOON 結構不包含count欄位(TOON 的key[N]語法已包含數量資訊)。