diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aed1071a8909a68dfbb625d6fcce1098581dc9d..68583486202354aae54304d7972bc5ea47bef48b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 definition. - JSON schema validation can also be used in the DictElementConverter - YAMLFileConverter class; to parse YAML files +- Variables can now be substituted within the definition of yaml macros ### Changed ### @@ -30,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### + - The DictXYElements are now depricated and are now synonyms for the XYElements. 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..b5ea5d84846f5f33853910c292132d7b5026600e 100644 --- a/unittests/test_macros.py +++ b/unittests/test_macros.py @@ -456,3 +456,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"