Coverage for jinja2_async_environment / compiler_modules / cache.py: 100%
18 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-26 21:26 -0800
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-26 21:26 -0800
1"""Compilation cache for template code optimization."""
3import hashlib
6class CompilationCache:
7 """Cache for compiled template code to avoid recompilation."""
9 def __init__(self, max_size: int = 1000):
10 self.max_size = max_size
11 self._cache: dict[str, str] = {}
13 def get_cache_key(self, source: str, environment_id: str) -> str:
14 """Generate a cache key for template source and environment."""
15 content = f"{source}:{environment_id}"
16 return hashlib.sha256(content.encode()).hexdigest()[:16]
18 def get(self, cache_key: str) -> str | None:
19 """Get compiled code from cache."""
20 return self._cache.get(cache_key)
22 def set(self, cache_key: str, compiled_code: str) -> None:
23 """Store compiled code in cache with size limit."""
24 if len(self._cache) >= self.max_size:
25 # Remove oldest entries (simple FIFO)
26 oldest_keys = list(self._cache.keys())[: self.max_size // 4]
27 for key in oldest_keys:
28 del self._cache[key]
30 self._cache[cache_key] = compiled_code
32 def clear(self) -> None:
33 """Clear the cache."""
34 self._cache.clear()