From 4b9e3867ce017d2aec26ba78a11ae1df33f77f9d Mon Sep 17 00:00:00 2001 From: Bert Besser Date: Sun, 21 Feb 2021 15:50:08 +0100 Subject: [PATCH 1/2] feat: substitution recurses into nested dicts --- src/popper/parser.py | 5 +---- src/test/test_parser.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/popper/parser.py b/src/popper/parser.py index 710128930..d22f74af5 100644 --- a/src/popper/parser.py +++ b/src/popper/parser.py @@ -141,10 +141,7 @@ def __apply_substitution(wf_element, k, v, used_registry): for ek in wf_element: if k in ek: log.fail("Substitutions not allowed on dictionary keys") - if k in wf_element[ek]: - log.debug(f"Applying substitution to value associated to key {k}") - wf_element[ek] = wf_element[ek].replace(k, v) - used_registry[k] = 1 + wf_element[ek] = WorkflowParser.__apply_substitution(wf_element[ek], k, v, used_registry) return wf_element diff --git a/src/test/test_parser.py b/src/test/test_parser.py index afe1c028e..8ed533a9e 100644 --- a/src/test/test_parser.py +++ b/src/test/test_parser.py @@ -163,6 +163,37 @@ def test_substitutions(self): **{"wf_data": wf_data, "substitutions": substitutions} ) + # substitute nested + wf_data = { + "steps": [ + { + "uses": "some_$_SUB1", + "id": "some other $_SUB2", + "env": {"FOO": "env_$_SUB3"}, + "secrets": ["secret_$_SUB4"], + "options": { + "labels": {"timestamp": "$_TIMESTAMP"} + }, + } + ] + } + substitutions = [ + "_TIMESTAMP=1613916937", + "_SUB1=ONE", + "_SUB2=TWO", + "_SUB3=THREE", + "_SUB4=4", + ] + wf = WorkflowParser.parse( + wf_data=wf_data, substitutions=substitutions, + ) + step = wf.steps[0] + self.assertEqual("some_ONE", step.uses) + self.assertEqual("some other TWO", step.id) + self.assertEqual("env_THREE", step.env["FOO"]) + self.assertEqual(("secret_4",), step.secrets) + self.assertEqual({"timestamp": "1613916937"}, step.options.labels) + # allow loose substitutions wf = WorkflowParser.parse( wf_data=wf_data, substitutions=substitutions, allow_loose=True From 30b010503421c2ca8e88dc89284f5095fba04fce Mon Sep 17 00:00:00 2001 From: Bert Besser Date: Sun, 21 Feb 2021 16:20:05 +0100 Subject: [PATCH 2/2] fix: formatting --- src/popper/parser.py | 4 +++- src/test/test_parser.py | 8 ++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/popper/parser.py b/src/popper/parser.py index d22f74af5..d0f44c9f3 100644 --- a/src/popper/parser.py +++ b/src/popper/parser.py @@ -141,7 +141,9 @@ def __apply_substitution(wf_element, k, v, used_registry): for ek in wf_element: if k in ek: log.fail("Substitutions not allowed on dictionary keys") - wf_element[ek] = WorkflowParser.__apply_substitution(wf_element[ek], k, v, used_registry) + wf_element[ek] = WorkflowParser.__apply_substitution( + wf_element[ek], k, v, used_registry + ) return wf_element diff --git a/src/test/test_parser.py b/src/test/test_parser.py index 8ed533a9e..ebae6600a 100644 --- a/src/test/test_parser.py +++ b/src/test/test_parser.py @@ -171,9 +171,7 @@ def test_substitutions(self): "id": "some other $_SUB2", "env": {"FOO": "env_$_SUB3"}, "secrets": ["secret_$_SUB4"], - "options": { - "labels": {"timestamp": "$_TIMESTAMP"} - }, + "options": {"labels": {"timestamp": "$_TIMESTAMP"}}, } ] } @@ -184,9 +182,7 @@ def test_substitutions(self): "_SUB3=THREE", "_SUB4=4", ] - wf = WorkflowParser.parse( - wf_data=wf_data, substitutions=substitutions, - ) + wf = WorkflowParser.parse(wf_data=wf_data, substitutions=substitutions) step = wf.steps[0] self.assertEqual("some_ONE", step.uses) self.assertEqual("some other TWO", step.id)