From 2ced8b93ae2b43bf52570cd3e97f8de91e39ee75 Mon Sep 17 00:00:00 2001 From: Scott Gasch Date: Sun, 19 Sep 2021 17:45:04 -0700 Subject: Persistent state --- persistent_state.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 persistent_state.py (limited to 'persistent_state.py') diff --git a/persistent_state.py b/persistent_state.py new file mode 100644 index 0000000..1607b5e --- /dev/null +++ b/persistent_state.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +import pickle +from typing import Any, Mapping + +import file_utils + + +class PersistentState(object): + """ + An object that behaves like a persistent hash map; it can be + accessed to store key-value pairs but also saved to disk and read + back from disk easily. + + """ + def __init__(self, filename: str, *, max_age_sec: int = None): + self.filename = filename + if file_utils.does_file_exist(self.filename): + if max_age_sec is not None: + age = file_utils.get_file_mtime_age_seconds(self.filename) + if age < max_age_sec: + self.state = self.load() + else: + self.state = {} + else: + self.state = self.load() + else: + self.state = {} + + def __getitem__(self, key: str) -> Any: + return self.state.get(key, "") + + def __setitem__(self, key: str, value: Any): + self.state[key] = value + + def __delitem__(self, key: str): + del self.state[key] + + def __iter__(self): + return iter(self.state) + + def __len__(self): + return len(self.state) + + def save(self) -> None: + with open(self.filename, 'wb') as f: + pickle.dump(self.state, f, pickle.HIGHEST_PROTOCOL) + + def load(self) -> Mapping[str, Any]: + with open(self.filename, 'rb') as f: + return(pickle.load(f)) -- cgit v1.3