cgcardona / muse public
feat minor main #2 / 100

feat: stat cache — 86x faster snapshot via os.walk + persistent hash cache

muse/core/stat_cache.py (new): - FileCacheEntry TypedDict: {mtime, size, object_hash, dimensions} The dimensions slot is reserved for domain plugins to store semantic hashes (AST symbol hash, note-event hash, etc.) so future muse diff and merge can skip re-parsing unchanged files entirely. - StatCache: load (versioned JSON), save (atomic temp+rename), get_cached (fast pre-stat inner loop), get_object_hash (pathlib wrapper for external callers), set_dimension / get_dimension, prune. - Single canonical _hash_bytes / _hash_str — eliminates the three duplicate _hash_file() copies across code plugin, MIDI plugin, and snapshot.py.

tests/test_core_stat_cache.py (new): - 35 tests: cache hit/miss, stale pruning, dimension round-trip, dimension eviction on object-hash miss, atomic save, version guard, walk_workdir integration.

? unknown · 3h ago Mar 20, 2026 · 71e26490 · parent de2a25b0
oldest
newest 99%

Muse Structured Delta

code 2 files
muse/core/stat_cache.py .py 25 symbols added 25 symbols
FileCacheEntry added class FileCacheEntry
StatCache added class StatCache
StatCache.__init__ added method __init__
StatCache.empty added method empty
StatCache.get_cached added method get_cached
StatCache.get_dimension added method get_dimension
StatCache.get_object_hash added method get_object_hash
StatCache.load added method load
StatCache.prune added method prune
StatCache.save added method save
StatCache.set_dimension added method set_dimension
_CACHE_FILENAME added variable _CACHE_FILENAME
_CACHE_VERSION added variable _CACHE_VERSION
_CHUNK added variable _CHUNK
_CacheDoc added class _CacheDoc
_hash_bytes added function _hash_bytes
_hash_str added function _hash_str
TypedDict added import TypedDict
annotations added import annotations
hashlib added import hashlib
json added import json
logging added import logging
pathlib added import pathlib
load_cache added function load_cache
logger added variable logger
tests/test_core_stat_cache.py .py 52 symbols added 52 symbols
TestDimensionHashes added class TestDimensionHashes
TestDimensionHashes.test_dimension_evicted_on_object_hash_miss added method test_dimension_evicted_on_object_hash_miss
TestDimensionHashes.test_get_dimension_missing_entry_returns_none added method test_get_dimension_missing_entry_returns_none
TestDimensionHashes.test_get_dimension_missing_key_returns_none added method test_get_dimension_missing_key_returns_none
TestDimensionHashes.test_multiple_dimensions added method test_multiple_dimensions
TestDimensionHashes.test_set_and_get_dimension added method test_set_and_get_dimension
TestDimensionHashes.test_set_dimension_noop_for_unknown_file added method test_set_dimension_noop_for_unknown_file
TestGetObjectHash added class TestGetObjectHash
TestGetObjectHash.test_first_call_is_cache_miss added method test_first_call_is_cache_miss
TestGetObjectHash.test_modified_file_triggers_miss added method test_modified_file_triggers_miss
TestGetObjectHash.test_same_content_new_mtime_triggers_miss_but_same_hash added method test_same_content_new_mtime_triggers_miss_but_same_hash
TestGetObjectHash.test_second_call_is_cache_hit_no_dirty added method test_second_call_is_cache_hit_no_dirty
TestHashBytes added class TestHashBytes
TestHashBytes.test_empty_file added method test_empty_file
TestHashBytes.test_large_file_chunked added method test_large_file_chunked
TestHashBytes.test_matches_hashlib added method test_matches_hashlib
TestPersistence added class TestPersistence
TestPersistence.test_dimensions_persisted added method test_dimensions_persisted
TestPersistence.test_empty_cache_save_is_noop added method test_empty_cache_save_is_noop
TestPersistence.test_json_format_is_versioned added method test_json_format_is_versioned
TestPersistence.test_save_and_reload added method test_save_and_reload
TestPersistence.test_save_is_atomic_no_tmp_left added method test_save_is_atomic_no_tmp_left
TestPersistence.test_save_noop_when_not_dirty added method test_save_noop_when_not_dirty
TestPrune added class TestPrune
TestPrune.test_prune_empty_known_set_clears_all added method test_prune_empty_known_set_clears_all
TestPrune.test_prune_noop_when_all_present added method test_prune_noop_when_all_present
TestPrune.test_prune_removes_stale_entries added method test_prune_removes_stale_entries
TestStatCacheConstruction added class TestStatCacheConstruction
TestStatCacheConstruction.test_empty_has_no_muse_dir added method test_empty_has_no_muse_dir
TestStatCacheConstruction.test_load_cache_helper_with_muse_dir added method test_load_cache_helper_with_muse_dir
TestStatCacheConstruction.test_load_cache_helper_without_muse_dir added method test_load_cache_helper_without_muse_dir
TestStatCacheConstruction.test_load_corrupt_json_returns_empty added method test_load_corrupt_json_returns_empty
TestStatCacheConstruction.test_load_missing_file_returns_empty added method test_load_missing_file_returns_empty
TestStatCacheConstruction.test_load_wrong_version_returns_empty added method test_load_wrong_version_returns_empty
TestWalkWorkdirCacheIntegration added class TestWalkWorkdirCacheIntegration
TestWalkWorkdirCacheIntegration.test_walk_creates_cache_file added method test_walk_creates_cache_file
TestWalkWorkdirCacheIntegration.test_walk_excludes_hidden_paths_from_cache added method test_walk_excludes_hidden_paths_from_cache
TestWalkWorkdirCacheIntegration.test_walk_hashes_match_direct_hash added method test_walk_hashes_match_direct_hash
TestWalkWorkdirCacheIntegration.test_walk_second_call_uses_cache added method test_walk_second_call_uses_cache
TestWalkWorkdirCacheIntegration.test_walk_without_muse_dir_still_works added method test_walk_without_muse_dir_still_works
_make_muse_dir added function _make_muse_dir
_write added function _write
FileCacheEntry added import FileCacheEntry
StatCache added import StatCache
_hash_bytes added import _hash_bytes
annotations added import annotations
json added import json
load_cache added import load_cache
pathlib added import pathlib
pytest added import pytest
time added import time
walk_workdir added import walk_workdir

Symbol Graph

code
Click a symbol node to inspect it.

Snapshot Diff

310 files in tree
+2

Comments

0

No comments yet. Be the first to start the discussion.