From fd37ccebaea52777a88e8eab3457c2db2aac7184 Mon Sep 17 00:00:00 2001 From: red person Date: Tue, 2 Jun 2026 22:02:16 +0300 Subject: [PATCH] Ignore invalid personal docs state (#1401) --- src/personal_docs.py | 10 ++++++++-- tests/test_personal_docs_state_store.py | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/test_personal_docs_state_store.py diff --git a/src/personal_docs.py b/src/personal_docs.py index 3eebdd6..66290ad 100644 --- a/src/personal_docs.py +++ b/src/personal_docs.py @@ -199,7 +199,10 @@ class PersonalDocsManager: try: if os.path.exists(self.directories_file): with open(self.directories_file, 'r', encoding="utf-8") as f: - self.indexed_directories = json.load(f) + directories = json.load(f) + if not isinstance(directories, list): + raise ValueError("indexed directories must be a list") + self.indexed_directories = [d for d in directories if isinstance(d, str)] logger.info(f"Loaded {len(self.indexed_directories)} indexed directories") else: self.indexed_directories = [] @@ -221,7 +224,10 @@ class PersonalDocsManager: try: if os.path.exists(self._excluded_file): with open(self._excluded_file, 'r', encoding="utf-8") as f: - self.excluded_files = set(json.load(f)) + excluded = json.load(f) + if not isinstance(excluded, list): + raise ValueError("excluded files must be a list") + self.excluded_files = {p for p in excluded if isinstance(p, str)} else: self.excluded_files = set() except Exception as e: diff --git a/tests/test_personal_docs_state_store.py b/tests/test_personal_docs_state_store.py new file mode 100644 index 0000000..40befe3 --- /dev/null +++ b/tests/test_personal_docs_state_store.py @@ -0,0 +1,23 @@ +import json + +from src.personal_docs import PersonalDocsManager + + +def test_manager_ignores_invalid_persisted_state_shapes(tmp_path): + (tmp_path / "indexed_directories.json").write_text(json.dumps({"bad": "shape"})) + (tmp_path / "excluded_files.json").write_text(json.dumps({"bad": "shape"})) + + manager = PersonalDocsManager(str(tmp_path)) + + assert manager.indexed_directories == [] + assert manager.excluded_files == set() + + +def test_manager_filters_invalid_persisted_state_rows(tmp_path): + (tmp_path / "indexed_directories.json").write_text(json.dumps(["/tmp/docs", 123])) + (tmp_path / "excluded_files.json").write_text(json.dumps(["/tmp/docs/a.txt", None])) + + manager = PersonalDocsManager(str(tmp_path)) + + assert manager.indexed_directories == ["/tmp/docs"] + assert manager.excluded_files == {"/tmp/docs/a.txt"}