Source code for blissoda.persistent.mock_redis

import logging
from collections import OrderedDict
from collections.abc import MutableMapping
from copy import deepcopy
from typing import Any
from typing import Dict
from typing import Mapping

logger = logging.getLogger(__name__)

# Global in-memory Redis-like store
_REDIS_STORE: Dict[str, dict] = {}


[docs] class Connection: """Minimal stand-in for redis connection."""
[docs] def exists(self, key: str) -> bool: return key in _REDIS_STORE
[docs] class LocalHashObjSetting(MutableMapping): """In-memory drop-in replacement for HashObjSetting.""" connection = Connection() _LOCAL_REASON = None _LOCAL_WARNING_EMITTED = False def __init__(self, key: str): self.key = key if ( not LocalHashObjSetting._LOCAL_WARNING_EMITTED and LocalHashObjSetting._LOCAL_REASON ): logger.warning( "Persistency is disabled and local in-memory storage is being used (%s)", LocalHashObjSetting._LOCAL_REASON, ) LocalHashObjSetting._LOCAL_WARNING_EMITTED = True @property def _store(self) -> dict: return _REDIS_STORE.setdefault(self.key, {}) def __repr__(self): return repr(self._store) def __getitem__(self, k: str) -> Any: return self._store[k] def __setitem__(self, k: str, value: Any) -> None: if value is None: self._store.pop(k, None) else: self._store[k] = deepcopy(value) if isinstance(value, Mapping) else value def __delitem__(self, k: str) -> None: del self._store[k] def __iter__(self): return iter(self._store) def __len__(self): return len(self._store)
[docs] def get_all(self) -> dict: return deepcopy(self._store)
[docs] def clear(self) -> None: _REDIS_STORE.pop(self.key, None)
[docs] class LocalOrderedHashObjSetting(LocalHashObjSetting): """ Same as LocalHashObjSetting, but stores values in an OrderedDict so that insertion order is preserved. Behaves like a Redis hash that returns fields in insertion order. """ @property def _store(self) -> OrderedDict: # Upgrade to OrderedDict if necessary store = _REDIS_STORE.get(self.key) if store is None: store = OrderedDict() _REDIS_STORE[self.key] = store else: if not isinstance(store, OrderedDict): _REDIS_STORE[self.key] = OrderedDict(store) store = _REDIS_STORE[self.key] return store