This is an automated email from the ASF dual-hosted git repository. tvb pushed a commit to branch validation in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 2f545d57b982d97638951bca7facb45f43f63169 Author: Tristan Maat <[email protected]> AuthorDate: Wed Sep 6 16:52:26 2017 +0100 Add _yaml.validate_node --- buildstream/_yaml.py | 18 ++++++++++++++++++ tests/yaml/data/invalid.yaml | 8 ++++++++ tests/yaml/yaml.py | 22 ++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py index 527f537..c07996b 100644 --- a/buildstream/_yaml.py +++ b/buildstream/_yaml.py @@ -587,6 +587,24 @@ def node_sanitize(node): return node +def validate_node(node, valid_keys): + + # Probably the fastest way to do this: https://stackoverflow.com/a/23062482 + valid_keys = set(valid_keys) + valid_keys.add(PROVENANCE_KEY) + invalid_keys = [key for key in node if key not in valid_keys] + + if invalid_keys: + provenance = node_get_provenance(node) + error_prefix = "" + if provenance: + error_prefix = "[%s]: " % str(provenance) + + key_list = ', '.join(invalid_keys) + raise LoadError(LoadErrorReason.INVALID_YAML, + "{}Unexpected keys: {}".format(error_prefix, key_list)) + + def node_chain_copy(source): copy = collections.ChainMap({}, source) for key, value in source.items(): diff --git a/tests/yaml/data/invalid.yaml b/tests/yaml/data/invalid.yaml new file mode 100644 index 0000000..bc7f1ae --- /dev/null +++ b/tests/yaml/data/invalid.yaml @@ -0,0 +1,8 @@ +kind: pony +description: The vehicle of choice for rainbow travel +mods: + - happy + - sad +children: + - naam: dopey + mood: silly diff --git a/tests/yaml/yaml.py b/tests/yaml/yaml.py index ec63267..a6e6f49 100644 --- a/tests/yaml/yaml.py +++ b/tests/yaml/yaml.py @@ -163,6 +163,28 @@ def test_composited_array_append_provenance(datafiles): @pytest.mark.datafiles(os.path.join(DATA_DIR)) +def test_validate_node(datafiles): + + valid = os.path.join(datafiles.dirname, + datafiles.basename, + 'basics.yaml') + invalid = os.path.join(datafiles.dirname, + datafiles.basename, + 'invalid.yaml') + + base = _yaml.load(valid) + + _yaml.validate_node(base, ['kind', 'description', 'moods', 'children', 'extra']) + + base = _yaml.load(invalid) + + with pytest.raises(LoadError) as exc: + _yaml.validate_node(base, ['kind', 'description', 'moods', 'children', 'extra']) + + assert (exc.value.reason == LoadErrorReason.INVALID_YAML) + + [email protected](os.path.join(DATA_DIR)) def test_node_get(datafiles): filename = os.path.join(datafiles.dirname,
