Source code for ewokscore.persistence.json
from pathlib import Path
from typing import Any
from typing import Mapping
from typing import MutableMapping
from typing import Optional
from typing import Union
from .._serialization import json
from .._serialization.common import types
from . import atomic
from .file import FileProxy
[docs]
def modify_dict(target: Mapping, source: MutableMapping):
for name, value in source.items():
if isinstance(value, dict):
new_target = target.setdefault(name, dict())
modify_dict(new_target, value)
else:
target[name] = value
[docs]
class JsonProxy(FileProxy):
SCHEME = "json"
EXTENSIONS = [".json"]
ALLOW_PATH_IN_FILE = False
def _dump(
self,
path: Path,
data: Any,
serializer: Optional[
Union[types.GraphSerializer, str]
] = types.GraphSerializer.json_pickle,
**kwargs,
):
with atomic.atomic_write(path, mode="w") as f:
json.dump(
data,
f,
serializer=serializer,
insert_serialize_info=_insert_serialize_info,
**kwargs,
)
def _load(self, path: Path):
with open(path, mode="r") as f:
content = json.load(f, pop_serialize_info=_pop_serialize_info)
return content["data"]
def _insert_serialize_info(
data: Any, key: str, serialize_info: types.SerializeInfo
) -> dict:
return {"data": data, key: serialize_info.serialize()}
def _pop_serialize_info(data: dict, key: str) -> Optional[types.SerializeInfo]:
serialize_info = data.pop(key, None)
if serialize_info:
return types.SerializeInfo.deserialize(serialize_info)