From f26d9dedfa2befac694a30bf94230cd9af277eac Mon Sep 17 00:00:00 2001 From: idow09 Date: Sun, 2 Oct 2022 17:27:51 +0300 Subject: [PATCH 1/4] support jsonnet --- pyrallis/options.py | 3 ++- pyrallis/parsers/config_parsers.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pyrallis/options.py b/pyrallis/options.py index 958faf7..aa78511 100644 --- a/pyrallis/options.py +++ b/pyrallis/options.py @@ -1,12 +1,13 @@ import contextlib from typing import Union -from pyrallis.parsers.config_parsers import ParserEnum, YAMLParser, JSONParser, TOMLParser +from pyrallis.parsers.config_parsers import ParserEnum, YAMLParser, JSONParser, JSONETParser, TOMLParser class ConfigType(ParserEnum): YAML = YAMLParser JSON = JSONParser + JSONNET = JSONETParser TOML = TOMLParser diff --git a/pyrallis/parsers/config_parsers.py b/pyrallis/parsers/config_parsers.py index d790d3d..3181928 100644 --- a/pyrallis/parsers/config_parsers.py +++ b/pyrallis/parsers/config_parsers.py @@ -69,6 +69,24 @@ def save_config(d, stream=None, **kwargs): return json.dump(d, stream, **kwargs) +class JSONNETParser(Parser): + + @staticmethod + def parse_string(s): + import json + import _jsonnet + try: + s = _jsonnet.evaluate_snippet("snippet", s) # "snippet" is a dummy filename parameter + return json.loads(s) + except json.decoder.JSONDecodeError: + return s # No parsing to be done, simply return value + + @staticmethod + def load_config(stream): + s = stream.read() # Jsonnet doesn't provide stream API + return self.parse_string(s) + + class TOMLParser(Parser): @staticmethod From 5b995d2c8d02d2b0960988530e666c9602fdd38b Mon Sep 17 00:00:00 2001 From: idow09 Date: Sun, 2 Oct 2022 17:37:52 +0300 Subject: [PATCH 2/4] Fix typo --- pyrallis/options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrallis/options.py b/pyrallis/options.py index aa78511..67895f6 100644 --- a/pyrallis/options.py +++ b/pyrallis/options.py @@ -1,7 +1,7 @@ import contextlib from typing import Union -from pyrallis.parsers.config_parsers import ParserEnum, YAMLParser, JSONParser, JSONETParser, TOMLParser +from pyrallis.parsers.config_parsers import ParserEnum, YAMLParser, JSONParser, JSONNETParser, TOMLParser class ConfigType(ParserEnum): From 90f97bc07883f2bea3fc4005fb01d8f634052b11 Mon Sep 17 00:00:00 2001 From: idow09 Date: Sun, 2 Oct 2022 17:40:13 +0300 Subject: [PATCH 3/4] Fix typo --- pyrallis/options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrallis/options.py b/pyrallis/options.py index 67895f6..3510a6d 100644 --- a/pyrallis/options.py +++ b/pyrallis/options.py @@ -7,7 +7,7 @@ class ConfigType(ParserEnum): YAML = YAMLParser JSON = JSONParser - JSONNET = JSONETParser + JSONNET = JSONNETParser TOML = TOMLParser From 09bcbb2e572fbe1163144bcfd60e56340789df7f Mon Sep 17 00:00:00 2001 From: Ido Weiss Date: Mon, 3 Oct 2022 15:48:38 +0300 Subject: [PATCH 4/4] Add jsonnet to parameterized format test, fix usage of self in staticmethod --- pyrallis/parsers/config_parsers.py | 4 ++-- tests/test_decoding.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyrallis/parsers/config_parsers.py b/pyrallis/parsers/config_parsers.py index 3181928..c5eadf6 100644 --- a/pyrallis/parsers/config_parsers.py +++ b/pyrallis/parsers/config_parsers.py @@ -69,7 +69,7 @@ def save_config(d, stream=None, **kwargs): return json.dump(d, stream, **kwargs) -class JSONNETParser(Parser): +class JSONNETParser(JSONParser): @staticmethod def parse_string(s): @@ -84,7 +84,7 @@ def parse_string(s): @staticmethod def load_config(stream): s = stream.read() # Jsonnet doesn't provide stream API - return self.parse_string(s) + return JSONNETParser.parse_string(s) class TOMLParser(Parser): diff --git a/tests/test_decoding.py b/tests/test_decoding.py index f52564b..98f3fd3 100644 --- a/tests/test_decoding.py +++ b/tests/test_decoding.py @@ -30,7 +30,7 @@ class SomeClass: assert pyrallis.decode(SomeClass, pyrallis.encode(b)) == b -@parametrize('config_type', ['', 'yaml', 'json', 'toml']) +@parametrize('config_type', ['', 'yaml', 'json', 'jsonnet', 'toml']) def test_dump_load(simple_attribute, config_type, tmp_path): some_type, _, expected_value = simple_attribute