From aaf09309bbbe86578f58b248d1a45101ebb729bf Mon Sep 17 00:00:00 2001 From: SvenWiltink Date: Thu, 7 Jan 2016 20:12:46 +0100 Subject: [PATCH 1/3] changed the behavior of when a variable is not set in the recursive variable check --- src/CodeFlow/workflow.py | 7 ++-- ...gger_recursive_variable_none_workflow.json | 36 +++++++++++++++++++ tests/test_workflow.py | 23 ++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 tests/resources/trigger_recursive_variable_none_workflow.json diff --git a/src/CodeFlow/workflow.py b/src/CodeFlow/workflow.py index f6f7cd7..63e70d8 100644 --- a/src/CodeFlow/workflow.py +++ b/src/CodeFlow/workflow.py @@ -77,12 +77,15 @@ def handleState(self, state): varNames = varNames.split(';') value = self.variables[varNames.pop(0)] + ignoreValue = False for varName in varNames: - value = value[varName] if value is None: + ignoreValue = True break - if value == requiredValue: + value = value[varName] + + if ignoreValue == False and value == requiredValue: if nextState is not None and nextState != trigger['next']: raise RuntimeError("A workflow could transition to multiple states") nextState = trigger['next'] diff --git a/tests/resources/trigger_recursive_variable_none_workflow.json b/tests/resources/trigger_recursive_variable_none_workflow.json new file mode 100644 index 0000000..8e7746d --- /dev/null +++ b/tests/resources/trigger_recursive_variable_none_workflow.json @@ -0,0 +1,36 @@ +{ + "name":"trigger", + "states": { + + "start": { + "type": "empty", + "next": "triggerTest" + }, + + "triggerTest": { + "type": "trigger", + "next": "triggerfalse", + "triggers": [ + { + "variableName": "recursive;variable;check", + "value": null, + "next": "triggertrue" + } + ] + }, + + "triggertrue": { + "type": "run", + "package":"test_workflow", + "class":"TriggerTrueState", + "next": "finish" + }, + + "triggerfalse": { + "type": "run", + "package":"test_workflow", + "class":"TriggerFalseState", + "next": "finish" + } + } +} \ No newline at end of file diff --git a/tests/test_workflow.py b/tests/test_workflow.py index 9702748..c0cb79f 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -140,3 +140,26 @@ def test_trigger_recursive_variable(self): assert TriggerTrueState.called is True assert TriggerFalseState.called is False + + def test_trigger_recursive_unset(self): + workflow = Workflow.loadFromFile('tests/resources/trigger_recursive_variable_workflow.json') + workflow.variables['success'] = True + + TriggerTrueState.called = False + TriggerFalseState.called = False + workflow.run() + + assert TriggerTrueState.called is False + assert TriggerFalseState.called is True + + def test_trigger_recursive_empty(self): + workflow = Workflow.loadFromFile('tests/resources/trigger_recursive_variable_none_workflow.json') + workflow.variables['recursive'] = {'variable': {'check': None}} + + assert workflow.variables['recursive']['variable']['check'] is None + TriggerTrueState.called = False + TriggerFalseState.called = False + workflow.run() + + assert TriggerTrueState.called is True + assert TriggerFalseState.called is False From 6be09765d28f0e12233e7de4561c9b97fdea5a8e Mon Sep 17 00:00:00 2001 From: SvenWiltink Date: Thu, 7 Jan 2016 20:16:53 +0100 Subject: [PATCH 2/3] removed a useless assert --- tests/test_workflow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_workflow.py b/tests/test_workflow.py index c0cb79f..3ea0857 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -156,7 +156,6 @@ def test_trigger_recursive_empty(self): workflow = Workflow.loadFromFile('tests/resources/trigger_recursive_variable_none_workflow.json') workflow.variables['recursive'] = {'variable': {'check': None}} - assert workflow.variables['recursive']['variable']['check'] is None TriggerTrueState.called = False TriggerFalseState.called = False workflow.run() From 448a1ee1b39f2813fca8ea35102f10eda3a9f3fc Mon Sep 17 00:00:00 2001 From: SvenWiltink Date: Thu, 7 Jan 2016 20:36:11 +0100 Subject: [PATCH 3/3] fixed a bug in the recursive variable lookup variabled defaulting to None --- src/CodeFlow/workflow.py | 10 ++++++---- tests/test_workflow.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/CodeFlow/workflow.py b/src/CodeFlow/workflow.py index 63e70d8..7d6213e 100644 --- a/src/CodeFlow/workflow.py +++ b/src/CodeFlow/workflow.py @@ -27,6 +27,7 @@ def loadFromJson(json): instance = Workflow() instance.name = name instance.states = states + instance.variables = {} return instance @@ -76,15 +77,16 @@ def handleState(self, state): varNames = trigger['variableName'] varNames = varNames.split(';') - value = self.variables[varNames.pop(0)] + value = self.variables ignoreValue = False + for varName in varNames: - if value is None: + if varName in value: + value = value.get(varName) + else: ignoreValue = True break - value = value[varName] - if ignoreValue == False and value == requiredValue: if nextState is not None and nextState != trigger['next']: raise RuntimeError("A workflow could transition to multiple states") diff --git a/tests/test_workflow.py b/tests/test_workflow.py index 3ea0857..52a8118 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -143,7 +143,7 @@ def test_trigger_recursive_variable(self): def test_trigger_recursive_unset(self): workflow = Workflow.loadFromFile('tests/resources/trigger_recursive_variable_workflow.json') - workflow.variables['success'] = True + workflow.variables['recursive'] = {'variable': {}} TriggerTrueState.called = False TriggerFalseState.called = False