diff --git a/src/retasc/models/rule.py b/src/retasc/models/rule.py index 39a2fb8..7d968dc 100644 --- a/src/retasc/models/rule.py +++ b/src/retasc/models/rule.py @@ -1,5 +1,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later +from copy import deepcopy + import jinja2.exceptions from pydantic import BaseModel, ConfigDict, Field @@ -50,20 +52,15 @@ def update_state(self, context) -> ReleaseRuleState: - In-progress, if some prerequisites are in In-progress but none are Pending - Completed, if all prerequisites are Completed """ - state = context.rules_states.get(self.name) - if state is not None: - return state - - context.rules_states[self.name] = ReleaseRuleState.Pending + params = context.rule_template_params.get(self.name) + if params is not None: + context.template.params.update(params) + return params["state"] rule_state = ReleaseRuleState.Completed + context.template.params["state"] = rule_state for prereq in self.prerequisites: - if rule_state == ReleaseRuleState.Pending: - break - - context.template.params["state"] = rule_state - with context.report.section(prereq.section_name(context)): try: state = prereq.update_state(context) @@ -76,7 +73,13 @@ def update_state(self, context) -> ReleaseRuleState: if state != ReleaseRuleState.Completed: context.report.set("state", state.name) - rule_state = min(rule_state, state) - context.rules_states[self.name] = rule_state + rule_state = min(rule_state, state) + context.template.params["state"] = rule_state + + if rule_state == ReleaseRuleState.Pending: + break + + context.rule_template_params[self.name] = deepcopy(context.template.params) + return rule_state diff --git a/src/retasc/run.py b/src/retasc/run.py index b45ec71..9da4928 100644 --- a/src/retasc/run.py +++ b/src/retasc/run.py @@ -49,7 +49,7 @@ def update_state(rule: Rule, context: RuntimeContext): def iterate_rules(context: RuntimeContext) -> Iterator[tuple[dict, list[Rule]]]: input_rules = rules_by_input(context) for input, values, rules in input_rules: - context.rules_states = {} + context.rule_template_params = {} with context.report.section(input.section_name(values)): yield values, rules diff --git a/src/retasc/runtime_context.py b/src/retasc/runtime_context.py index 2a1d4a5..e56bf8d 100644 --- a/src/retasc/runtime_context.py +++ b/src/retasc/runtime_context.py @@ -5,7 +5,6 @@ from retasc.jira_client import JiraClient from retasc.models.config import Config -from retasc.models.release_rule_state import ReleaseRuleState from retasc.models.rule import Rule from retasc.product_pages_api import ProductPagesApi from retasc.report import Report @@ -22,4 +21,4 @@ class RuntimeContext: report: Report config: Config - rules_states: dict[str, ReleaseRuleState] = field(default_factory=dict) + rule_template_params: dict[str, dict] = field(default_factory=dict) diff --git a/tests/test_run.py b/tests/test_run.py index a986935..be01b7c 100644 --- a/tests/test_run.py +++ b/tests/test_run.py @@ -952,3 +952,71 @@ def test_run_rule_prerequsite_variable_string(factory): } } } + + +def test_run_rule_inherit_params(factory): + """Template parameters are inherited from dependent rules""" + rule_data_list = [ + { + "version": 1, + "name": "rule-1", + "prerequisites": [ + {"variable": "test_var", "string": "rule-1"}, + {"condition": "test_var"}, + ], + }, + { + "version": 1, + "name": "rule-2", + "prerequisites": [ + {"rule": "rule-1"}, + {"condition": "test_var"}, + ], + }, + { + "version": 1, + "name": "rule-3", + "prerequisites": [ + {"variable": "test_var", "string": "rule-2"}, + {"rule": "rule-1"}, + {"condition": "test_var"}, + ], + }, + { + "version": 1, + "name": "rule-4", + "prerequisites": [ + {"condition": "test_var|default"}, + ], + }, + ] + for rule_data in rule_data_list: + factory.add_rule(Rule(**rule_data)) + report = call_run() + assert report.data == { + INPUT: { + "rule-1": { + "VariableString('test_var')": {"value": "rule-1"}, + "Condition('test_var')": {"result": "rule-1"}, + "state": "Completed", + }, + "rule-2": { + "Rule('rule-1')": {}, + "Condition('test_var')": {"result": "rule-1"}, + "state": "Completed", + }, + "rule-3": { + "VariableString('test_var')": {"value": "rule-2"}, + "Rule('rule-1')": {}, + "Condition('test_var')": {"result": "rule-1"}, + "state": "Completed", + }, + "rule-4": { + "Condition('test_var|default')": { + "result": "", + "state": "Pending", + }, + "state": "Pending", + }, + } + }