Source code for pydmt.core.cache
"""
cache.py
"""
import os
import pickle
import glob
from collections.abc import Iterable
from pydmt.utils.filesystem import copy_mkdir, makedirs_for_file
from pydmt.utils.logging import get_logger
NAME_OBJECTS = "objects"
NAME_LISTS = "lists"
FOLDER_NAME = ".pydmt"
[docs]
class Cache:
def __init__(self):
self.name_cache = set(glob.glob(os.path.join(FOLDER_NAME, "*", "*", "*")))
# self.name_cache = set(files_under_folder(FOLDER_NAME))
logger = get_logger()
logger.debug(self.name_cache)
[docs]
def get_list_filename(self, signature: str):
logger = get_logger()
logger.debug(f"get_list_filename [{signature}]")
full_path = os.path.join(FOLDER_NAME, NAME_LISTS, signature[:2], signature[2:])
if full_path in self.name_cache:
logger.debug(f"return [{full_path}]")
return full_path
logger.debug("return None")
return None
[docs]
def get_object_filename(self, signature: str):
logger = get_logger()
logger.debug(f"get_object_filename [{signature}]")
full_path = os.path.join(FOLDER_NAME, NAME_OBJECTS, signature[:2], signature[2:])
if full_path in self.name_cache:
logger.debug(f"return [{full_path}]")
return full_path
logger.debug("return None")
return None
[docs]
def list_sig_ok(self, signature: str):
"""
return if a signature is indeed a list and all objects are intact
:param signature:
:return:
"""
logger = get_logger()
logger.debug(f"list_sig_ok [{signature}]")
list_filename = self.get_list_filename(signature)
if list_filename is None:
logger.debug("return False")
return False
for _filename, sig in Cache.iterate_objects(list_filename):
if self.get_object_filename(sig) is None:
logger.debug(f"return False for {sig}")
return False
logger.debug("return True")
return True
[docs]
def save_list_by_signature(self, signature: str, d: dict):
full_path = os.path.join(FOLDER_NAME, NAME_LISTS, signature[:2], signature[2:])
makedirs_for_file(full_path)
with open(full_path, "wb") as file_handle:
pickle.dump(d, file_handle)
self.name_cache.add(full_path)
[docs]
def save_object_by_signature(self, signature: str, file_name: str):
full_path = os.path.join(FOLDER_NAME, NAME_OBJECTS, signature[:2], signature[2:])
copy_mkdir(file_name, full_path)
self.name_cache.add(full_path)
[docs]
@staticmethod
def iterate_objects(file_name: str) -> Iterable[tuple[str, str]]:
with open(file_name, "rb") as file_handle:
yield from pickle.load(file_handle).items()