diff --git a/CHANGELOG.md b/CHANGELOG.md index 9eb927fd561912a1a31a2c4083570232281b4adf..f24f8f299b0af2cf04688194e0766fd2c6b5d8fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed ### +* A bit better error handling in the yaml model parser. + ### Deprecated ### ### Removed ### diff --git a/manual_tests/test_labfolder_import.py b/manual_tests/test_labfolder_import.py index e1e9d3266478900b7fae02b3493fbc3d41ea2bd5..c767feb55cdf3958343d8d9780d01fa10c70f6ec 100644 --- a/manual_tests/test_labfolder_import.py +++ b/manual_tests/test_labfolder_import.py @@ -32,7 +32,7 @@ from caosadvancedtools.converter import labfolder_export as labfolder def main(args): """The main function.""" - model = parse_model_from_yaml("./model.yml") + model = parse_model_from_yaml("./models/model.yml") model.sync_data_model() labfolder.import_data(args.folder) diff --git a/manual_tests/test_labfolder_retrieve.py b/manual_tests/test_labfolder_retrieve.py index 8c3f12d84a8990412d0d19cd6026a3452677f943..5bbaf91d0221a402e3a39246a129413adfa5f871 100644 --- a/manual_tests/test_labfolder_retrieve.py +++ b/manual_tests/test_labfolder_retrieve.py @@ -31,7 +31,7 @@ from caosadvancedtools.converter.labfolder_api import Importer def main(args): """The main function.""" - model = parse_model_from_yaml("./model.yml") + model = parse_model_from_yaml("./models/model.yml") # model.sync_data_model() importer = Importer() diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py index b77b37669b27ee0d2ddf749eeae54915714e54ec..434535d5b25d5d806fdc05e9edede705fc86b5a1 100644 --- a/src/caosadvancedtools/models/parser.py +++ b/src/caosadvancedtools/models/parser.py @@ -294,7 +294,12 @@ class Parser(object): self._check_and_convert_datatypes() for name, entity in ymlmodel.items(): - self._treat_entity(name, entity, line=ymlmodel["__line__"]) + try: + self._treat_entity(name, entity, line=ymlmodel["__line__"]) + except ValueError as err: + err_str = err.args[0].replace("invalid keyword:", + f"invalid keyword in line {entity['__line__']}:", 1) + raise ValueError(err_str, *err.args[1:]) from err return DataModel(self.model.values()) diff --git a/unittests/model.yml b/unittests/models/model.yml similarity index 100% rename from unittests/model.yml rename to unittests/models/model.yml diff --git a/unittests/models/model_invalid.yml b/unittests/models/model_invalid.yml new file mode 100644 index 0000000000000000000000000000000000000000..c8368b9701db9b3461b7e0f1f3514c2411f56b56 --- /dev/null +++ b/unittests/models/model_invalid.yml @@ -0,0 +1,2 @@ +Project: + ObligatoryProperties: diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py index 6cdea7922a8503be082e8947edecd7e8c849730b..b1177a46a90d51feb9aea0fa7c3d3d5d95cc2a7a 100644 --- a/unittests/test_yaml_model_parser.py +++ b/unittests/test_yaml_model_parser.py @@ -511,3 +511,11 @@ R3: # Until removal, both do the same assert has_parent(r3, par) assert r3.get_parent(par)._flags["inheritance"] == db.OBLIGATORY + + +def test_yaml_error(): + """Testing error while parsing a yaml. + """ + + with raises(ValueError, match=r"line 2: .*"): + parse_model_from_yaml("unittests/models/model_invalid.yml")