mirror of
https://github.com/sartography/spiff-arena.git
synced 2025-01-26 09:20:16 +00:00
e53d860b40
8d820dce1f Track spiff step details more granularly (#17) 426da26d8f Clear the remaining __init__.py imports in SpiffWorkflow (#14) 9a1d1c484a Fix FutureWarning in SpiffWorkflow (#16) git-subtree-dir: SpiffWorkflow git-subtree-split: 8d820dce1f439bb76bc07e39629832d998d6f634
135 lines
4.2 KiB
Python
135 lines
4.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from SpiffWorkflow.specs.ExclusiveChoice import ExclusiveChoice
|
|
from SpiffWorkflow.specs.Join import Join
|
|
from SpiffWorkflow.specs.MultiChoice import MultiChoice
|
|
from SpiffWorkflow.specs.MultiInstance import MultiInstance
|
|
from SpiffWorkflow.specs.Simple import Simple
|
|
from SpiffWorkflow.specs.WorkflowSpec import WorkflowSpec
|
|
from SpiffWorkflow.operators import Attrib, Equal, NotEqual
|
|
|
|
|
|
class TestWorkflowSpec(WorkflowSpec):
|
|
|
|
def __init__(self):
|
|
WorkflowSpec.__init__(self)
|
|
# Build one branch.
|
|
a1 = Simple(self, 'task_a1')
|
|
self.start.connect(a1)
|
|
|
|
a2 = Simple(self, 'task_a2')
|
|
a1.connect(a2)
|
|
|
|
# Build another branch.
|
|
b1 = Simple(self, 'task_b1')
|
|
self.start.connect(b1)
|
|
|
|
b2 = Simple(self, 'task_b2')
|
|
b1.connect(b2)
|
|
|
|
# Merge both branches (synchronized).
|
|
synch_1 = Join(self, 'synch_1')
|
|
a2.connect(synch_1)
|
|
b2.connect(synch_1)
|
|
|
|
# If-condition that does not match.
|
|
excl_choice_1 = ExclusiveChoice(self, 'excl_choice_1')
|
|
synch_1.connect(excl_choice_1)
|
|
|
|
c1 = Simple(self, 'task_c1')
|
|
excl_choice_1.connect(c1)
|
|
|
|
c2 = Simple(self, 'task_c2')
|
|
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute2'))
|
|
excl_choice_1.connect_if(cond, c2)
|
|
|
|
c3 = Simple(self, 'task_c3')
|
|
excl_choice_1.connect_if(cond, c3)
|
|
|
|
# If-condition that matches.
|
|
excl_choice_2 = ExclusiveChoice(self, 'excl_choice_2')
|
|
c1.connect(excl_choice_2)
|
|
c2.connect(excl_choice_2)
|
|
c3.connect(excl_choice_2)
|
|
|
|
d1 = Simple(self, 'task_d1')
|
|
excl_choice_2.connect(d1)
|
|
|
|
d2 = Simple(self, 'task_d2')
|
|
excl_choice_2.connect_if(cond, d2)
|
|
|
|
d3 = Simple(self, 'task_d3')
|
|
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute1'))
|
|
excl_choice_2.connect_if(cond, d3)
|
|
|
|
# If-condition that does not match.
|
|
multichoice = MultiChoice(self, 'multi_choice_1')
|
|
d1.connect(multichoice)
|
|
d2.connect(multichoice)
|
|
d3.connect(multichoice)
|
|
|
|
e1 = Simple(self, 'task_e1')
|
|
multichoice.connect_if(cond, e1)
|
|
|
|
e2 = Simple(self, 'task_e2')
|
|
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute2'))
|
|
multichoice.connect_if(cond, e2)
|
|
|
|
e3 = Simple(self, 'task_e3')
|
|
cond = Equal(Attrib('test_attribute2'), Attrib('test_attribute2'))
|
|
multichoice.connect_if(cond, e3)
|
|
|
|
# StructuredSynchronizingMerge
|
|
syncmerge = Join(self, 'struct_synch_merge_1', 'multi_choice_1')
|
|
e1.connect(syncmerge)
|
|
e2.connect(syncmerge)
|
|
e3.connect(syncmerge)
|
|
|
|
# Implicit parallel split.
|
|
f1 = Simple(self, 'task_f1')
|
|
syncmerge.connect(f1)
|
|
|
|
f2 = Simple(self, 'task_f2')
|
|
syncmerge.connect(f2)
|
|
|
|
f3 = Simple(self, 'task_f3')
|
|
syncmerge.connect(f3)
|
|
|
|
# Discriminator
|
|
discrim_1 = Join(self,
|
|
'struct_discriminator_1',
|
|
'struct_synch_merge_1',
|
|
threshold=1)
|
|
f1.connect(discrim_1)
|
|
f2.connect(discrim_1)
|
|
f3.connect(discrim_1)
|
|
|
|
# Loop back to the first exclusive choice.
|
|
excl_choice_3 = ExclusiveChoice(self, 'excl_choice_3')
|
|
discrim_1.connect(excl_choice_3)
|
|
cond = NotEqual(Attrib('excl_choice_3_reached'), Attrib('two'))
|
|
excl_choice_3.connect_if(cond, excl_choice_1)
|
|
|
|
# Split into 3 branches, and implicitly split twice in addition.
|
|
multi_instance_1 = MultiInstance(self, 'multi_instance_1', times=3)
|
|
excl_choice_3.connect(multi_instance_1)
|
|
|
|
# Parallel tasks.
|
|
g1 = Simple(self, 'task_g1')
|
|
g2 = Simple(self, 'task_g2')
|
|
multi_instance_1.connect(g1)
|
|
multi_instance_1.connect(g2)
|
|
|
|
# StructuredSynchronizingMerge
|
|
syncmerge2 = Join(self, 'struct_synch_merge_2', 'multi_instance_1')
|
|
g1.connect(syncmerge2)
|
|
g2.connect(syncmerge2)
|
|
|
|
# Add a final task.
|
|
last = Simple(self, 'last')
|
|
syncmerge2.connect(last)
|
|
|
|
# Add another final task :-).
|
|
end = Simple(self, 'End')
|
|
last.connect(end)
|