From a326a6a555f21bc6967b2c011ff7b66ed227bd40 Mon Sep 17 00:00:00 2001 From: red person Date: Mon, 29 Jun 2026 06:26:46 -0700 Subject: [PATCH] Skip invalid notes CLI item rows (#2005) --- scripts/odysseus-notes | 4 +++- tests/cli/test_notes_cli_items.py | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/scripts/odysseus-notes b/scripts/odysseus-notes index 8b9a374f2..6e8cee635 100755 --- a/scripts/odysseus-notes +++ b/scripts/odysseus-notes @@ -36,7 +36,9 @@ def _load_items(raw) -> list: items = json.loads(raw) except (TypeError, json.JSONDecodeError): return [] - return items if isinstance(items, list) else [] + if not isinstance(items, list): + return [] + return [item for item in items if isinstance(item, dict)] def _serialize(n: "Note") -> dict: diff --git a/tests/cli/test_notes_cli_items.py b/tests/cli/test_notes_cli_items.py index 450c1eacd..32513f19d 100644 --- a/tests/cli/test_notes_cli_items.py +++ b/tests/cli/test_notes_cli_items.py @@ -46,3 +46,25 @@ def test_serialize_keeps_list_note_items(monkeypatch): ) assert cli._serialize(note)["items"] == [{"text": "done"}] + + +def test_serialize_skips_invalid_note_item_rows(monkeypatch): + make_core_db_stub(monkeypatch, models=["Note"]) + cli = load_script("odysseus-notes") + note = SimpleNamespace( + id="n1", + title="Checklist", + content="", + items='[{"text": "done"}, "bad", null, 3]', + note_type="checklist", + color=None, + label=None, + pinned=False, + archived=False, + due_date=None, + source=None, + created_at=None, + updated_at=None, + ) + + assert cli._serialize(note)["items"] == [{"text": "done"}]