46 lines
1.3 KiB
Python
Executable File
46 lines
1.3 KiB
Python
Executable File
import pathlib
|
|
import time
|
|
|
|
STALE_SECONDS = 60 * 60 * 24 * 1 # one day
|
|
|
|
class DiskCache:
|
|
def __init__(self, root_path):
|
|
self.root_path = pathlib.Path(root_path)
|
|
self.root_path.mkdir(exist_ok=True)
|
|
assert(self.root_path.is_dir())
|
|
|
|
def __contains__(self, key):
|
|
self.clear_stale_files()
|
|
return self.root_path.joinpath(key).exists()
|
|
|
|
def __getitem__(self, key):
|
|
try:
|
|
with self.root_path.joinpath(key).open('rb') as infile:
|
|
return infile.read()
|
|
except FileNotFoundError:
|
|
raise KeyError(key)
|
|
|
|
def __setitem__(self, key, value):
|
|
try:
|
|
with self.root_path.joinpath(key).open('wb') as outfile:
|
|
outfile.write(value)
|
|
except FileNotFoundError:
|
|
raise KeyError(key)
|
|
|
|
def __delitem__(self, key):
|
|
try:
|
|
self.root_path.joinpath(key).unlink()
|
|
except FileNotFoundError:
|
|
raise KeyError(key)
|
|
|
|
def clear_stale_files(self):
|
|
files_to_delete = []
|
|
for path in self.root_path.iterdir():
|
|
if not path.is_file():
|
|
continue
|
|
age = time.time() - path.stat().st_mtime
|
|
if age >= STALE_SECONDS:
|
|
files_to_delete.append(path)
|
|
for path in files_to_delete:
|
|
path.unlink()
|