Source code for ptr.agm.cache

"""AGM cache module."""

import re
from pathlib import Path
from tempfile import gettempdir

from .hash import md5_hash
from .results import AGMResults


[docs]class Cache: """AGM cache folder. Parameters ---------- cache: str or pathlib.Path Cache folder name. """ def __init__(self, cache): self.cache = Path(cache) self.cache.mkdir(parents=True, exist_ok=True) def __str__(self): return str(self.cache) def __repr__(self): n = len(self) if n == 0: n_files = 'empty' else: n_files = f'{n} entr' + ('ies' if n > 1 else 'y') + ':\n - ' n_files += '\n - '.join([ f.stem for f in self.content ]) return f'<{self.__class__.__name__}> {self} | {n_files}' def __call__(self, metakernel, ptr, endpoint, ext='json'): return self.cache / f'{md5_hash(metakernel, ptr, endpoint)}.{ext}' def __len__(self): return len(self.content) def __iter__(self): return iter(self.content) def __contains__(self, key): return (self.cache / f'{key}.json').exists() def __getitem__(self, key): if key not in self: raise KeyError(key) return self.inspect(key) def __delitem__(self, key): if key not in self: raise KeyError(key) self.remove(key) @property def content(self): """List CK and NPY files in AGM cache""" return sorted( f for f in self.cache.glob('*.json') if re.match(r'^[a-f\d]{32}$', f.stem) )
[docs] def inspect(self, md5): """Inspect cached file.""" return AGMResults(self.cache / f'{md5}.json')
[docs] def remove(self, md5): """Remove the file from the cache.""" (self.cache / f'{md5}.json').unlink(missing_ok=True) (self.cache / f'{md5}.ck').unlink(missing_ok=True)
[docs] def purge(self): """Purge all AGM cache""" for fname in self: self.remove(fname.stem)
AGM_CACHE = Cache(Path(gettempdir()) / 'esa-ptr')