from typing import Optional import os import logging log = logging.getLogger("rc.lststor") class DiskStoredList: __file: Optional[str] = None __items: Optional[list] = None def __init__(self, file: str): # file does not have to exist, but parent directory does if not os.path.exists(file): if not os.path.isdir(os.path.dirname(file)): raise NotADirectoryError(f"Parent directory for file {file} does not exist!") self.__file = file self.__items = [] if os.path.exists(file): self._load_from_file() def _load_from_file(self): log.debug(f"DiskStoredList: loading") with open(self.__file, 'r') as f: for line in f.readlines(): line = line.strip() if len(line): self.__items.append(line) log.debug(f"DiskStoredList: loaded {len(self.__items)}") def append(self, line: str): with open(self.__file, 'a') as f: log.debug(f"DiskStoredList: append {line}") self.__items.append(line) f.write(f"{line}\n") def count(self): return len(self.__items) def __contains__(self, line: str) -> bool: log.debug(f"DiskStoredList: contains? {line}") return line in self.__items def __iter__(self): return self.__items.__iter__() def __len__(self): return len(self.__items)