Skip to content

Commit 8d29cbd

Browse files
committed
parse task metadata values extension
1 parent 7b7af3e commit 8d29cbd

File tree

4 files changed

+96
-1
lines changed

4 files changed

+96
-1
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ tests-par:
3333
echo " pip install unittest-parallel"; \
3434
exit 1; \
3535
fi
36-
unittest-parallel --module-fixtures -qbs tests/SpiffWorkflow -p \*Test.py -t .
36+
unittest-parallel -qbs tests/SpiffWorkflow -p \*Test.py -t .
3737

3838
.PHONY : tests-cov
3939
tests-cov:

SpiffWorkflow/spiff/parser/task_spec.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ def _parse_extensions(node):
6060
extensions['unitTests'] = SpiffTaskParser._parse_script_unit_tests(node)
6161
elif name == 'serviceTaskOperator':
6262
extensions['serviceTaskOperator'] = SpiffTaskParser._parse_servicetask_operator(node)
63+
elif name == 'taskMetadataValues':
64+
extensions['taskMetadataValues'] = SpiffTaskParser._parse_task_metadata_values(node)
6365
else:
6466
extensions[name] = node.text
6567
return extensions
@@ -77,6 +79,14 @@ def _parse_properties(cls, node):
7779
properties[prop_node.attrib['name']] = prop_node.attrib['value']
7880
return properties
7981

82+
@classmethod
83+
def _parse_task_metadata_values(cls, node):
84+
metadata_value_nodes = cls._node_children_by_tag_name(node, 'taskMetadataValue')
85+
metadata_values = {}
86+
for metadata_node in metadata_value_nodes:
87+
metadata_values[metadata_node.attrib['name']] = metadata_node.attrib['value']
88+
return metadata_values
89+
8090
@staticmethod
8191
def _spiffworkflow_ready_xpath_for_node(node):
8292
return xpath_eval(node, SPIFFWORKFLOW_NSMAP)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from SpiffWorkflow.util.task import TaskState
2+
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
3+
from .BaseTestCase import BaseTestCase
4+
5+
6+
class HumanTaskMetadataTest(BaseTestCase):
7+
8+
def testTaskMetadataValues(self):
9+
"""Test that taskMetadataValues are parsed as a list of elements, not as XML string"""
10+
spec, subprocesses = self.load_workflow_spec('human_task_metadata.bpmn', 'Process_human_task_metadata')
11+
workflow = BpmnWorkflow(spec, subprocesses)
12+
workflow.do_engine_steps()
13+
14+
# Get the user task
15+
task = workflow.get_next_task(state=TaskState.READY)
16+
17+
# Check that the task has the taskMetadataValues extension
18+
self.assertIn('taskMetadataValues', task.task_spec.extensions)
19+
20+
# The taskMetadataValues should be a dict, not a string
21+
task_metadata_values = task.task_spec.extensions['taskMetadataValues']
22+
self.assertIsInstance(task_metadata_values, dict,
23+
"taskMetadataValues should be parsed as a dict, not a string")
24+
25+
# Check that the metadata values are correctly parsed
26+
self.assertEqual(task_metadata_values['dynamic_key'], 'my_var')
27+
self.assertEqual(task_metadata_values['static_key'], "'static_value'")
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:spiffworkflow="http://spiffworkflow.org/bpmn/schema/1.0/core" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_96f6665" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0-dev">
3+
<bpmn:process id="Process_human_task_metadata" isExecutable="true">
4+
<bpmn:startEvent id="StartEvent_1">
5+
<bpmn:outgoing>Flow_1my9ag5</bpmn:outgoing>
6+
</bpmn:startEvent>
7+
<bpmn:sequenceFlow id="Flow_1my9ag5" sourceRef="StartEvent_1" targetRef="Activity_1qtnye8" />
8+
<bpmn:sequenceFlow id="Flow_0b04rbg" sourceRef="Activity_1qtnye8" targetRef="Activity_1gqykqt" />
9+
<bpmn:endEvent id="Event_0pchbgr">
10+
<bpmn:incoming>Flow_13mlau2</bpmn:incoming>
11+
</bpmn:endEvent>
12+
<bpmn:sequenceFlow id="Flow_13mlau2" sourceRef="Activity_1gqykqt" targetRef="Event_0pchbgr" />
13+
<bpmn:scriptTask id="Activity_1qtnye8" name="set variables" scriptFormat="python">
14+
<bpmn:incoming>Flow_1my9ag5</bpmn:incoming>
15+
<bpmn:outgoing>Flow_0b04rbg</bpmn:outgoing>
16+
<bpmn:script>my_var = "dynamic_value"</bpmn:script>
17+
</bpmn:scriptTask>
18+
<bpmn:userTask id="Activity_1gqykqt" name="User Task with Metadata">
19+
<bpmn:extensionElements>
20+
<spiffworkflow:taskMetadataValues>
21+
<spiffworkflow:taskMetadataValue name="dynamic_key" value="my_var" />
22+
<spiffworkflow:taskMetadataValue name="static_key" value="'static_value'" />
23+
</spiffworkflow:taskMetadataValues>
24+
</bpmn:extensionElements>
25+
<bpmn:incoming>Flow_0b04rbg</bpmn:incoming>
26+
<bpmn:outgoing>Flow_13mlau2</bpmn:outgoing>
27+
</bpmn:userTask>
28+
</bpmn:process>
29+
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
30+
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_human_task_metadata">
31+
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
32+
<dc:Bounds x="179" y="159" width="36" height="36" />
33+
</bpmndi:BPMNShape>
34+
<bpmndi:BPMNShape id="Event_0pchbgr_di" bpmnElement="Event_0pchbgr">
35+
<dc:Bounds x="592" y="159" width="36" height="36" />
36+
</bpmndi:BPMNShape>
37+
<bpmndi:BPMNShape id="Activity_1x1c7bj_di" bpmnElement="Activity_1qtnye8">
38+
<dc:Bounds x="270" y="137" width="100" height="80" />
39+
<bpmndi:BPMNLabel />
40+
</bpmndi:BPMNShape>
41+
<bpmndi:BPMNShape id="Activity_0w50892_di" bpmnElement="Activity_1gqykqt">
42+
<dc:Bounds x="430" y="137" width="100" height="80" />
43+
</bpmndi:BPMNShape>
44+
<bpmndi:BPMNEdge id="Flow_1my9ag5_di" bpmnElement="Flow_1my9ag5">
45+
<di:waypoint x="215" y="177" />
46+
<di:waypoint x="270" y="177" />
47+
</bpmndi:BPMNEdge>
48+
<bpmndi:BPMNEdge id="Flow_0b04rbg_di" bpmnElement="Flow_0b04rbg">
49+
<di:waypoint x="370" y="177" />
50+
<di:waypoint x="430" y="177" />
51+
</bpmndi:BPMNEdge>
52+
<bpmndi:BPMNEdge id="Flow_13mlau2_di" bpmnElement="Flow_13mlau2">
53+
<di:waypoint x="530" y="177" />
54+
<di:waypoint x="592" y="177" />
55+
</bpmndi:BPMNEdge>
56+
</bpmndi:BPMNPlane>
57+
</bpmndi:BPMNDiagram>
58+
</bpmn:definitions>

0 commit comments

Comments
 (0)