fix(notion-search): tighten cache type hints + deterministic TTL=0

Code review polish:
- Type hints: List → List[Dict[str, Any]] for cache_get return and
  cache_put results parameter, since rerank produces dict-shaped entries.
- TTL=0 short-circuits to None deterministically. Previously the test
  for ttl_seconds=0 passed only because clock motion between cache_put
  and cache_get made `time.time() - cached_at > 0` true. Now the
  semantics match the docstring intent.

8/8 tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 07:45:44 +09:00
parent 32a1c9d538
commit 6bb8e6ab3c

View File

@@ -6,7 +6,7 @@ import hashlib
import json import json
import time import time
from pathlib import Path from pathlib import Path
from typing import List, Optional from typing import Any, Dict, List, Optional
DEFAULT_CACHE_DIR = Path.home() / ".cache" / "notion-search" DEFAULT_CACHE_DIR = Path.home() / ".cache" / "notion-search"
DEFAULT_TTL_SECONDS = 86400 # 24 hours DEFAULT_TTL_SECONDS = 86400 # 24 hours
@@ -23,11 +23,15 @@ def cache_get(
*, *,
cache_dir: Path = DEFAULT_CACHE_DIR, cache_dir: Path = DEFAULT_CACHE_DIR,
ttl_seconds: int = DEFAULT_TTL_SECONDS, ttl_seconds: int = DEFAULT_TTL_SECONDS,
) -> Optional[List]: ) -> Optional[List[Dict[str, Any]]]:
"""Return cached results if file exists and is fresh, else None. """Return cached results if file exists and is fresh, else None.
Corrupted cache files are silently treated as misses (and removed). Corrupted cache files are silently treated as misses (and removed).
`ttl_seconds <= 0` always returns None (deterministic "always expired").
""" """
if ttl_seconds <= 0:
return None
key = _cache_key(query, candidate_ids) key = _cache_key(query, candidate_ids)
path = cache_dir / f"{key}.json" path = cache_dir / f"{key}.json"
if not path.exists(): if not path.exists():
@@ -52,7 +56,7 @@ def cache_get(
def cache_put( def cache_put(
query: str, query: str,
candidate_ids: List[str], candidate_ids: List[str],
results: List, results: List[Dict[str, Any]],
*, *,
cache_dir: Path = DEFAULT_CACHE_DIR, cache_dir: Path = DEFAULT_CACHE_DIR,
) -> None: ) -> None: