Source code for doitoml.utils.json

"""JSON utilities for ``doitoml``."""
import json
import pathlib
from typing import Any

from doitoml.sources._source import Source


[docs] class DoitomlEncoder(json.JSONEncoder): """JSON Encoder aware of ``doitoml`` conventions. * always encode :class:`pathlib.Path` as a POSIX-style path (even on Windows). """
[docs] def default(self, obj: Any) -> Any: """Handle a single object.""" if isinstance(obj, pathlib.Path): return obj.as_posix() if isinstance(obj, Source): return obj.path.as_posix() if obj.path else None return json.JSONEncoder.default(self, obj) # pragma: no cover
[docs] def to_json(obj: Any) -> Any: """Do an expensive roundtrip through JSON, just to be sure.""" return json.loads(json.dumps(obj, cls=DoitomlEncoder, sort_keys=True))