diff --git a/src/caoscrawler/macros/macro_yaml_object.py b/src/caoscrawler/macros/macro_yaml_object.py index 2849986e6deb5cb2cba9e45516e6ce8e1a93dfa0..c6b5de27d7f498d9b1db6b6a90d986487340a880 100644 --- a/src/caoscrawler/macros/macro_yaml_object.py +++ b/src/caoscrawler/macros/macro_yaml_object.py @@ -135,6 +135,7 @@ def macro_constructor(loader, node): raise RuntimeError("params type not supported") else: raise RuntimeError("params type must not be None") + params = substitute_dict(params, params) definition = substitute_dict(macro.definition, params) res.update(definition) else: @@ -146,6 +147,7 @@ def macro_constructor(loader, node): params.update(params_setter) else: raise RuntimeError("params type not supported") + params = substitute_dict(params, params) definition = substitute_dict(macro.definition, params) res.update(definition) else: diff --git a/unittests/test_macros.py b/unittests/test_macros.py index 4e27e42f8d1e633cf97fa142e2c0ec8aa013af05..33252d384ba83e5a35ecf5135c6b0db0bdb7dc29 100644 --- a/unittests/test_macros.py +++ b/unittests/test_macros.py @@ -250,7 +250,6 @@ testnode: assert dat["testnode"]["obl"]["replaced1"]["d"][0] == "a" assert dat["testnode"]["obl"]["replaced1"]["d"][1] == "25" - def test_circular_macro_definition(register_macros, macro_store_reset): """Test the (ab-)use of macros to create an infinite loop.""" cfood = _temp_file_load(""" @@ -456,3 +455,60 @@ extroot: !macro assert cfood["extroot"]["default_name"]["a"] == "default_name" assert cfood["extroot"]["default_name"]["v"] == "default_name" assert cfood["extroot"]["default_name"]["macro_name"] == "default_name" + +def test_list_macro_application(register_macros, macro_store_reset): + dat = yaml.load(""" +defs: +- !defmacro + name: test + params: + a: 2 + definition: + expanded_$a: + param: $a +- !defmacro + name: test2 + params: + a: 2 + definition: + expanded_${a}_test2: + param: $a + +testnode: + obl: !macro + test: + - a: 4 + - a: 2 + test2: + a: 4 +""", Loader=yaml.SafeLoader) + assert dat["testnode"]["obl"]["expanded_4"]["param"] == "4" + assert dat["testnode"]["obl"]["expanded_2"]["param"] == "2" + assert dat["testnode"]["obl"]["expanded_4_test2"]["param"] == "4" + + +def test_variable_in_macro_definition(register_macros, macro_store_reset): + dat = yaml.load(""" +defs: +- !defmacro + name: test + params: + a: 2 + b: $a + definition: + expanded_$a: + param: $a + param_b: $b + +testnode: + obl: !macro + test: + - a: 4 + - a: 2 + b: 4 +""", Loader=yaml.SafeLoader) + assert dat["testnode"]["obl"]["expanded_4"]["param"] == "4" + assert dat["testnode"]["obl"]["expanded_4"]["param_b"] == "4" + assert dat["testnode"]["obl"]["expanded_2"]["param"] == "2" + assert dat["testnode"]["obl"]["expanded_2"]["param_b"] == "4" +