Skip to content

Commit a9b91a4

Browse files
authored
Merge pull request #446 from sartography/parse-task-metadata-values-extension
Parse task metadata values extension
2 parents 7b7af3e + 4e9a783 commit a9b91a4

File tree

4 files changed

+91
-1
lines changed

4 files changed

+91
-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.get('value', None)
88+
return metadata_values
89+
8090
@staticmethod
8191
def _spiffworkflow_ready_xpath_for_node(node):
8292
return xpath_eval(node, SPIFFWORKFLOW_NSMAP)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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+
def testTaskMetadataValues(self):
8+
spec, subprocesses = self.load_workflow_spec("human_task_metadata.bpmn", "Process_human_task_metadata")
9+
workflow = BpmnWorkflow(spec, subprocesses)
10+
workflow.do_engine_steps()
11+
12+
task = workflow.get_next_task(state=TaskState.READY)
13+
self.assertIn("taskMetadataValues", task.task_spec.extensions)
14+
task_metadata_values = task.task_spec.extensions["taskMetadataValues"]
15+
self.assertIsInstance(task_metadata_values, dict, "taskMetadataValues should be parsed as a dict, not a string")
16+
self.assertEqual(task_metadata_values["dynamic_key"], "my_var")
17+
self.assertEqual(task_metadata_values["static_key"], "'static_value'")
18+
19+
self.assertIsNone(
20+
task_metadata_values["key_with_no_value_property_in_xml"], "Metadata value without value attribute should be None"
21+
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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:taskMetadataValue name="key_with_no_value_property_in_xml" />
24+
</spiffworkflow:taskMetadataValues>
25+
</bpmn:extensionElements>
26+
<bpmn:incoming>Flow_0b04rbg</bpmn:incoming>
27+
<bpmn:outgoing>Flow_13mlau2</bpmn:outgoing>
28+
</bpmn:userTask>
29+
</bpmn:process>
30+
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
31+
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_human_task_metadata">
32+
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
33+
<dc:Bounds x="179" y="159" width="36" height="36" />
34+
</bpmndi:BPMNShape>
35+
<bpmndi:BPMNShape id="Event_0pchbgr_di" bpmnElement="Event_0pchbgr">
36+
<dc:Bounds x="592" y="159" width="36" height="36" />
37+
</bpmndi:BPMNShape>
38+
<bpmndi:BPMNShape id="Activity_1x1c7bj_di" bpmnElement="Activity_1qtnye8">
39+
<dc:Bounds x="270" y="137" width="100" height="80" />
40+
<bpmndi:BPMNLabel />
41+
</bpmndi:BPMNShape>
42+
<bpmndi:BPMNShape id="Activity_0w50892_di" bpmnElement="Activity_1gqykqt">
43+
<dc:Bounds x="430" y="137" width="100" height="80" />
44+
</bpmndi:BPMNShape>
45+
<bpmndi:BPMNEdge id="Flow_1my9ag5_di" bpmnElement="Flow_1my9ag5">
46+
<di:waypoint x="215" y="177" />
47+
<di:waypoint x="270" y="177" />
48+
</bpmndi:BPMNEdge>
49+
<bpmndi:BPMNEdge id="Flow_0b04rbg_di" bpmnElement="Flow_0b04rbg">
50+
<di:waypoint x="370" y="177" />
51+
<di:waypoint x="430" y="177" />
52+
</bpmndi:BPMNEdge>
53+
<bpmndi:BPMNEdge id="Flow_13mlau2_di" bpmnElement="Flow_13mlau2">
54+
<di:waypoint x="530" y="177" />
55+
<di:waypoint x="592" y="177" />
56+
</bpmndi:BPMNEdge>
57+
</bpmndi:BPMNPlane>
58+
</bpmndi:BPMNDiagram>
59+
</bpmn:definitions>

0 commit comments

Comments
 (0)