1607b5edbfe7d8f14b19ab7e08f9356d94668eab
[python_utils.git] / persistent_state.py
1 #!/usr/bin/env python3
2
3 import pickle
4 from typing import Any, Mapping
5
6 import file_utils
7
8
9 class PersistentState(object):
10     """
11     An object that behaves like a persistent hash map; it can be
12     accessed to store key-value pairs but also saved to disk and read
13     back from disk easily.
14
15     """
16     def __init__(self, filename: str, *, max_age_sec: int = None):
17         self.filename = filename
18         if file_utils.does_file_exist(self.filename):
19             if max_age_sec is not None:
20                 age = file_utils.get_file_mtime_age_seconds(self.filename)
21                 if age < max_age_sec:
22                     self.state = self.load()
23                 else:
24                     self.state = {}
25             else:
26                 self.state = self.load()
27         else:
28             self.state = {}
29
30     def __getitem__(self, key: str) -> Any:
31         return self.state.get(key, "")
32
33     def __setitem__(self, key: str, value: Any):
34         self.state[key] = value
35
36     def __delitem__(self, key: str):
37         del self.state[key]
38
39     def __iter__(self):
40         return iter(self.state)
41
42     def __len__(self):
43         return len(self.state)
44
45     def save(self) -> None:
46         with open(self.filename, 'wb') as f:
47             pickle.dump(self.state, f, pickle.HIGHEST_PROTOCOL)
48
49     def load(self) -> Mapping[str, Any]:
50         with open(self.filename, 'rb') as f:
51             return(pickle.load(f))