Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 15 additions & 12 deletions src/retasc/models/rule.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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)
Expand All @@ -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
2 changes: 1 addition & 1 deletion src/retasc/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
3 changes: 1 addition & 2 deletions src/retasc/runtime_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
68 changes: 68 additions & 0 deletions tests/test_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
},
}
}