Source code for sphinx_terminhtml.cache
from hashlib import md5
from pathlib import Path
from typing import Sequence, List, Optional
import appdirs
from pydantic import BaseModel
from .logger import log
from .options import RunTerminalOptions
TERMINAL_CACHE_DIR = Path(appdirs.user_cache_dir("sphinx-terminhtml"))
TERMINAL_CACHE_DIR.mkdir(exist_ok=True, parents=True)
[docs]class CacheOutput(BaseModel):
content: str
input: CacheInputs
@property
def file_name(self) -> str:
return self.input.file_name
[docs]class TerminalCache:
[docs] def __init__(self, cache_dir: Path = TERMINAL_CACHE_DIR):
self.cache_dir = cache_dir
[docs] def get(
self, content: Sequence[str], options: RunTerminalOptions
) -> Optional[CacheOutput]:
inputs = CacheInputs(content=content, options=options)
path = self.cache_dir / inputs.file_name
if not path.exists():
log.info(f"Cache miss for terminhtml directive: {inputs}")
return None
else:
log.info(
f"Cache hit for terminhtml directive: {inputs}. Loading from {path}"
)
out_content = path.read_text()
return CacheOutput(content=out_content, input=inputs)
[docs] def set(
self,
directive_content: Sequence[str],
options: RunTerminalOptions,
output_content: str,
) -> CacheOutput:
inputs = CacheInputs(content=directive_content, options=options)
output = CacheOutput(content=output_content, input=inputs)
path = self.cache_dir / output.file_name
path.write_text(output.content)
return output