diff --git a/src/wxflow/jinja.py b/src/wxflow/jinja.py index cffea62..2ce7690 100644 --- a/src/wxflow/jinja.py +++ b/src/wxflow/jinja.py @@ -225,7 +225,7 @@ def _render_template(self, template: jinja2.Template) -> str: try: rendered = template.render(**self.data) except jinja2.UndefinedError as ee: - raise Exception(f"Undefined variable in Jinja2 template\n{ee}") + raise NameError(f"Undefined variable in Jinja2 template\n{ee}") return rendered diff --git a/src/wxflow/yaml_file.py b/src/wxflow/yaml_file.py index 251e733..874c13b 100644 --- a/src/wxflow/yaml_file.py +++ b/src/wxflow/yaml_file.py @@ -156,7 +156,7 @@ def vanilla_yaml(ctx): return ctx -def parse_j2yaml(path: str, data: Dict, searchpath: Union[str, List] = '/') -> Dict[str, Any]: +def parse_j2yaml(path: str, data: Dict, searchpath: Union[str, List] = '/', allow_missing: bool = True) -> Dict[str, Any]: """ Description ----------- @@ -171,6 +171,8 @@ def parse_j2yaml(path: str, data: Dict, searchpath: Union[str, List] = '/') -> D the context for jinja2 templating searchpath: str | List additional search paths for included jinja2 templates + allow_missing: bool + whether to allow missing variables in a jinja2 template or not Returns ------- Dict[str, Any] @@ -180,4 +182,4 @@ def parse_j2yaml(path: str, data: Dict, searchpath: Union[str, List] = '/') -> D if not os.path.exists(path): raise FileNotFoundError(f"Input j2yaml file {path} does not exist!") - return YAMLFile(data=Jinja(path, data, searchpath=searchpath).render) + return YAMLFile(data=Jinja(path, data, searchpath=searchpath, allow_missing=allow_missing).render) diff --git a/tests/test_yaml_file.py b/tests/test_yaml_file.py index af6fb5c..898a77d 100644 --- a/tests/test_yaml_file.py +++ b/tests/test_yaml_file.py @@ -53,6 +53,15 @@ def test_yaml_file(tmp_path, create_template): assert yaml_in == conf +def test_j2template_missing_var(tmp_path, create_template): + + # Try to parse a j2yaml with an undefined variable (user) + os.environ['TMP_PATH'] = str(tmp_path) + with pytest.raises(NameError) as e_info: + data = {'current_cycle': datetime.now()} + conf = parse_j2yaml(path=str(tmp_path / 'j2tmpl.yaml'), data=data, allow_missing=False) + + def test_yaml_file_with_j2templates(tmp_path, create_template): # Set env. variable