Source code for blissoda.persistent.ordereddict
import json
import logging
import pickle
from typing import Any
from typing import Union
try:
from blissdata.settings import OrderedHashObjSetting
except ImportError:
try:
from bliss.config.settings import OrderedHashObjSetting
except ImportError as ex:
from .mock_redis import LocalOrderedHashObjSetting as OrderedHashObjSetting
OrderedHashObjSetting._LOCAL_REASON = ex
logger = logging.getLogger(__name__)
[docs]
class PersistentOrderedDict(OrderedHashObjSetting):
def __init__(self, redis_key: str, serializer: str = "json"):
dumps, loads = _SERIALIZERS[serializer]
super().__init__(
redis_key, read_type_conversion=loads, write_type_conversion=dumps
)
def _json_loads(serialized_value: Union[bytes, Any]) -> Any:
# Called twice on the same data for bliss<2
if isinstance(serialized_value, bytes):
try:
return json.loads(serialized_value)
except Exception:
pass
return serialized_value
def _pickle_loads(serialized_value: Union[bytes, Any]) -> Any:
# Called twice on the same data for bliss<2
if isinstance(serialized_value, bytes):
try:
return pickle.loads(serialized_value)
except Exception:
pass
return serialized_value
def _json_dumps(python_value: Any) -> str:
return json.dumps(python_value)
def _pickle_dumps(python_value: Any) -> bytes:
return pickle.dumps(python_value)
_SERIALIZERS = {
"json": (_json_dumps, _json_loads),
"pickle": (_pickle_dumps, _pickle_loads),
}