Classes
CacheStore
Generic cache storage for types implementing the Cacheable protocol.
Provides type-safe save/load …
CacheStore
Generic cache storage for types implementing the Cacheable protocol.
Provides type-safe save/load operations with version management, Zstandard compression, and tolerant loading (returns empty list on version mismatch or missing file).
Attributes
| Name | Type | Description |
|---|---|---|
cache_path |
— | Path to cache file (e.g., .bengal/taxonomy_index.json) |
compress |
— | Whether to use Zstandard compression (default: True) Cache File Format: |
Compressed |
— | Zstd-compressed JSON with same structure as below 92-93% smaller, 12-14x compression ratio |
Uncompressed |
— | { "version": 1, "entries": [ {...}, // Serialized Cacheable objects {...} ] } Version Management: - Each cache file has a top-level "version" field - On version mismatch, load() returns empty list and logs warning - On missing file, load() returns empty list (no warning) - On malformed data, load() returns empty list and logs error This "tolerant loading" approach ensures that stale or incompatible caches don't crash the build - they just rebuild from scratch. |
Compression |
— |
|
Methods 4
save
Save entries to cache file.
Serializes all entries to JSON and writes to cache…
save
def save(self, entries: list[Cacheable], version: int = 1, indent: int = 2) -> None
Save entries to cache file.
Serializes all entries to JSON and writes to cache file. Creates parent directory if missing. Uses Zstandard compression by default.
Parameters 3
entries |
list[Cacheable] |
List of Cacheable objects to save |
version |
int |
Cache version number (default: 1). Increment when format changes (new fields, removed fields, etc.) |
indent |
int |
JSON indentation (default: 2). Only used when compression is disabled; compressed files always use compact JSON. |
load
Load entries from cache file (tolerant).
Deserializes entries and validates ve…
load
def load(self, entry_type: type[T], expected_version: int = 1) -> list[T]
Load entries from cache file (tolerant).
Deserializes entries and validates version. Automatically detects format (compressed .json.zst or uncompressed .json). If version mismatch or file missing, returns empty list (doesn't crash).
This "tolerant loading" approach ensures that builds never fail due to stale or incompatible caches - they just rebuild from scratch.
Parameters 2
entry_type |
type[T] |
Type to deserialize (must implement Cacheable protocol). Used to call from_cache_dict() classmethod. |
expected_version |
int |
Expected cache version (default: 1). If file version doesn't match, returns empty list. |
Returns
List of deserialized entries, or [] if:list[T]
—
exists
Check if cache file exists (compressed or uncompressed).
exists
def exists(self) -> bool
Check if cache file exists (compressed or uncompressed).
Returns
True if cache file exists in either format, False otherwisebool
—
clear
Delete cache file if it exists (both compressed and uncompressed).
Used to for…
clear
def clear(self) -> None
Delete cache file if it exists (both compressed and uncompressed).
Used to force cache rebuild (e.g., after format changes).
Internal Methods 2
__init__
Initialize cache store.
__init__
def __init__(self, cache_path: Path, compress: bool = True)
Initialize cache store.
Parameters 2
cache_path |
Path |
Path to cache file (e.g., .bengal/taxonomy_index.json). Parent directory will be created if missing. With compression enabled, actual file will be .json.zst |
compress |
bool |
Whether to use Zstandard compression (default: True). Set to False for debugging or compatibility. |
_load_data
Load raw data from cache file with auto-detection.
Tries compressed format fir…
_load_data
def _load_data(self) -> dict[Any, Any] | None
Load raw data from cache file with auto-detection.
Tries compressed format first (.json.zst), falls back to uncompressed (.json). This enables seamless migration from old uncompressed caches.
Returns
Parsed data dict, or None if file not found or load faileddict[Any, Any] | None
—