| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import tempfile
- import os
- import time
- import hashlib
- import shutil
- cache_dir = os.path.join(tempfile.gettempdir(), "cache")
- os.makedirs(cache_dir, exist_ok=True)
- time_filename = "update_time"
- max_cache = 5
- def deterministic_hash(obj):
- hash_object = hashlib.sha256()
- hash_object.update(str(obj).encode())
- return hash_object.hexdigest()[0:20]
- def get_dirs():
- dirs = [
- os.path.join(cache_dir, dir)
- for dir in os.listdir(cache_dir)
- if os.path.isdir(os.path.join(cache_dir, dir))
- ]
- return dirs
- def get_time(dir):
- try:
- timefile = os.path.join(dir, time_filename)
- t = float(open(timefile, encoding="utf-8").read())
- return t
- except FileNotFoundError:
- # handle the error as needed, for now we'll just return a default value
- return float(
- "inf"
- ) # This ensures that this directory will be the first to be removed if required
- def write_time(dir):
- timefile = os.path.join(dir, time_filename)
- t = time.time()
- print(t, file=open(timefile, "w", encoding="utf-8"), end="")
- def argmin(iterable):
- return min(enumerate(iterable), key=lambda x: x[1])[0]
- def remove_extra():
- dirs = get_dirs()
- for dir in dirs:
- if not os.path.isdir(
- dir
- ): # This line might be redundant now, as get_dirs() ensures only directories are returned
- os.remove(dir)
- try:
- get_time(dir)
- except BaseException:
- shutil.rmtree(dir)
- while True:
- dirs = get_dirs()
- if len(dirs) <= max_cache:
- break
- times = [get_time(dir) for dir in dirs]
- arg = argmin(times)
- shutil.rmtree(dirs[arg])
- def is_cached(hash_key):
- dir = os.path.join(cache_dir, hash_key)
- return os.path.exists(dir)
- def create_cache(hash_key):
- dir = os.path.join(cache_dir, hash_key)
- os.makedirs(dir, exist_ok=True)
- write_time(dir)
- def load_paragraph(hash_key, hash_key_paragraph):
- filename = os.path.join(cache_dir, hash_key, hash_key_paragraph)
- if os.path.exists(filename):
- return open(filename, encoding="utf-8").read()
- else:
- return None
- def write_paragraph(hash_key, hash_key_paragraph, paragraph):
- filename = os.path.join(cache_dir, hash_key, hash_key_paragraph)
- print(paragraph, file=open(filename, "w", encoding="utf-8"), end="")
|