Autogenerated type safety parameterisation of all methods

This commit is contained in:
Ian Renton
2026-09-20 20:02:19 +01:00
parent 6037e742cc
commit 324dd1414b
132 changed files with 1228 additions and 706 deletions
+11 -6
View File
@@ -1,18 +1,23 @@
from __future__ import annotations
import logging
import threading
from typing import Generic, TypeVar
import diskcache
logger = logging.getLogger(__name__)
T = TypeVar("T")
class SingleObjectDataCache:
class SingleObjectDataCache(Generic[T]):
"""Cache for status and solar conditions. This uses DiskCache, but unlike the standard DiskCache users like
activity ref and callsign lookup handlers, status and solar conditions are persisted as a single object. If we
just load the object from DiskCache and modify it, DiskCache doesn't know that it's been updated and needs
re-caching, so we provide a store() method that any functions updating the object can call afterwards."""
def __init__(self, cache_dir, object_if_empty):
def __init__(self, cache_dir: str, object_if_empty: T) -> None:
"""Initialize a SingleObjectDataCache. Provide the directory to load the cache from and save it to. If the cache
is empty, the provided object_if_empty parameter will be used to initialise it."""
@@ -22,24 +27,24 @@ class SingleObjectDataCache:
if "object" not in self._cache:
self._cache.add("object", object_if_empty)
try:
self._obj = self._cache.get("object")
self._obj: T = self._cache.get("object")
except Exception: # noqa: BLE001 (If any exceptions we treat the data as junk and start from scratch, it's probably due to a version upgrade having incompatible data structures, fine to not log the exception in this case)
logger.warning(f"Failed to load cache from {cache_dir}, clearing it.")
self._cache.clear()
self._cache.add("object", object_if_empty)
self._obj = object_if_empty
def get(self):
def get(self) -> T:
"""Get the data object. This can then be manipulated as necessary across multiple threads. Any function
modifying the object must remember to call store() afterwards."""
return self._obj
def store(self):
def store(self) -> None:
"""Store the updated object in the cache. Any function modifying the object must remember to call this
afterwards."""
with self._lock:
self._cache.set("object", self._obj)
def close(self):
def close(self) -> None:
self.store()
self._cache.close()