fix: key the casefold index on its source dict

This commit is contained in:
Abdessamad Derraz committed 2026-10-06 04:30:11 +02:00
1 parent 1373964746
commit 2cafeb1d33
2 files changed
+40 -6

No files matched your search

+10 -6
View File
@@ -35,19 +35,23 @@ def load_database(db_path: str) -> dict:
_casefold_index_cache: dict[int, dict[str, list[str]]] = {}
# One slot: the dict it was built from, its size then, and the folded view.
# Keyed by id() alone, a database freed and replaced by another at the same
# address got the old index back, and the case-insensitive step answered from
# a collection that no longer existed.
_casefold_index_cache: list[tuple[dict, int, dict[str, list[str]]]] = []
def _casefold_name_index(by_name: dict) -> dict[str, list[str]]:
"""Build (and cache) a casefolded view of the by_name index."""
key = id(by_name)
cached = _casefold_index_cache.get(key)
if cached is not None:
return cached
if _casefold_index_cache:
source, size, folded = _casefold_index_cache[0]
if source is by_name and size == len(by_name):
return folded
folded: dict[str, list[str]] = {}
for name, sha1s in by_name.items():
folded.setdefault(name.casefold(), []).extend(sha1s)
_casefold_index_cache[key] = folded
_casefold_index_cache[:] = [(by_name, len(by_name), folded)]
return folded
+30
View File
@@ -0,0 +1,30 @@
"""The case-insensitive name index answers for the database it was asked about."""
from __future__ import annotations
import sys
import unittest
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
from common import _casefold_name_index # noqa: E402
class CasefoldIndexFollowsItsSource(unittest.TestCase):
def test_a_new_dict_gets_its_own_index(self):
first = {"BIOS.ROM": ["a"]}
self.assertEqual(_casefold_name_index(first)["bios.rom"], ["a"])
second = {"Bios.Rom": ["b"]}
self.assertEqual(_casefold_name_index(second)["bios.rom"], ["b"])
def test_a_grown_dict_is_reindexed(self):
index = {"A.BIN": ["a"]}
_casefold_name_index(index)
index["B.BIN"] = ["b"]
self.assertIn("b.bin", _casefold_name_index(index))
if __name__ == "__main__":
unittest.main()