From fc676295ee550b0ddbf659884eb8224dfee6c5ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Saugat=20Pachhai=20=28=E0=A4=B8=E0=A5=8C=E0=A4=97=E0=A4=BE?= =?UTF-8?q?=E0=A4=A4=29?= Date: Wed, 19 Aug 2020 22:25:48 +0545 Subject: [PATCH 1/2] add json serialization utils --- dvc/utils/serialize/__init__.py | 5 +++-- dvc/utils/serialize/_json.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 dvc/utils/serialize/_json.py diff --git a/dvc/utils/serialize/__init__.py b/dvc/utils/serialize/__init__.py index 1dd1e92778..8b0b5490b4 100644 --- a/dvc/utils/serialize/__init__.py +++ b/dvc/utils/serialize/__init__.py @@ -1,11 +1,12 @@ from collections import defaultdict from ._common import * # noqa, pylint: disable=wildcard-import +from ._json import * # noqa, pylint: disable=wildcard-import from ._toml import * # noqa, pylint: disable=wildcard-import from ._yaml import * # noqa, pylint: disable=wildcard-import LOADERS = defaultdict(lambda: load_yaml) # noqa: F405 -LOADERS.update({".toml": load_toml}) # noqa: F405 +LOADERS.update({".toml": load_toml, ".json": load_json}) # noqa: F405 MODIFIERS = defaultdict(lambda: modify_yaml) # noqa: F405 -MODIFIERS.update({".toml": modify_toml}) # noqa: F405 +MODIFIERS.update({".toml": modify_toml, ".json": modify_json}) # noqa: F405 diff --git a/dvc/utils/serialize/_json.py b/dvc/utils/serialize/_json.py new file mode 100644 index 0000000000..9295a94f66 --- /dev/null +++ b/dvc/utils/serialize/_json.py @@ -0,0 +1,29 @@ +import json + +from funcy import contextmanager, reraise + +from ._common import ParseError, _dump_data, _load_data, _modify_data + + +class JSONFileCorruptedError(ParseError): + def __init__(self, path): + super().__init__(path, "YAML file structure is corrupted") + + +def load_json(path, tree=None): + return _load_data(path, parser=parse_json, tree=tree) + + +def parse_json(text, path): + with reraise(json.JSONDecodeError, JSONFileCorruptedError(path)): + return json.loads(text) or {} + + +def dump_json(path, data, tree=None): + return _dump_data(path, data, dumper=json.dump, tree=tree) + + +@contextmanager +def modify_json(path, tree=None): + with _modify_data(path, parse_json, dump_json, tree=tree) as d: + yield d From b3b351d1762995c7364c8cc7375bd55e46ec1100 Mon Sep 17 00:00:00 2001 From: Saugat Pachhai Date: Fri, 21 Aug 2020 07:17:56 +0000 Subject: [PATCH 2/2] Update dvc/utils/serialize/_json.py --- dvc/utils/serialize/_json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvc/utils/serialize/_json.py b/dvc/utils/serialize/_json.py index 9295a94f66..3c247e85af 100644 --- a/dvc/utils/serialize/_json.py +++ b/dvc/utils/serialize/_json.py @@ -7,7 +7,7 @@ class JSONFileCorruptedError(ParseError): def __init__(self, path): - super().__init__(path, "YAML file structure is corrupted") + super().__init__(path, "JSON file structure is corrupted") def load_json(path, tree=None):