Skip to content

Commit

Permalink
Merge pull request #303 from sartography/bugfix/execute-tasks-on-ready
Browse files Browse the repository at this point in the history
Bugfix/execute tasks on ready
  • Loading branch information
essweine authored Mar 9, 2023
2 parents bee868d + 2bb08aa commit 42b4830
Show file tree
Hide file tree
Showing 11 changed files with 57 additions and 29 deletions.
1 change: 0 additions & 1 deletion SpiffWorkflow/bpmn/serializer/process_spec.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from ..specs.BpmnProcessSpec import BpmnProcessSpec
from ..specs.MultiInstanceTask import MultiInstanceTask
from ..specs.events.IntermediateEvent import _BoundaryEventParent

from .helpers.spec import WorkflowSpecConverter
Expand Down
4 changes: 2 additions & 2 deletions SpiffWorkflow/bpmn/specs/ScriptTask.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ def _execute(self, task):
"""Please override for specific Implementations, see ScriptTask below for an example"""
pass

def _on_complete_hook(self, task):
def _on_ready_hook(self, task):
try:
self._execute(task)
super(ScriptEngineTask, self)._on_complete_hook(task)
super(ScriptEngineTask, self)._on_ready_hook(task)
except Exception as exc:
task._set_state(TaskState.WAITING)
raise exc
Expand Down
10 changes: 6 additions & 4 deletions SpiffWorkflow/dmn/serializer/task_spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
from ..specs.model import Input, InputEntry, Output, OutputEntry
from ..engine.DMNEngine import DMNEngine

class BusinessRuleTaskConverter(TaskSpecConverter):

def __init__(self, registry):
super().__init__(BusinessRuleTask, registry)
class BaseBusinessRuleTaskConverter(TaskSpecConverter):

def to_dict(self, spec):
dct = self.get_default_attributes(spec)
Expand Down Expand Up @@ -98,3 +95,8 @@ def rule_from_dict(self, dct, inputs, outputs):
rule.outputEntries = [self.output_entry_from_dict(entry, outputs)
for entry in dct['output_entries']]
return rule


class BusinessRuleTaskConverter(BaseBusinessRuleTaskConverter):
def __init__(self, registry):
super().__init__(BusinessRuleTask, registry)
11 changes: 4 additions & 7 deletions SpiffWorkflow/dmn/specs/BusinessRuleTask.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from SpiffWorkflow.exceptions import WorkflowTaskException, WorkflowException, \
SpiffWorkflowException
from SpiffWorkflow.exceptions import WorkflowTaskException, SpiffWorkflowException

from ...specs.Simple import Simple

Expand All @@ -17,19 +16,17 @@ def _on_trigger(self, my_task):

def __init__(self, wf_spec, name, dmnEngine, **kwargs):
super().__init__(wf_spec, name, **kwargs)

self.dmnEngine = dmnEngine
self.resDict = None

@property
def spec_class(self):
return 'Business Rule Task'

def _on_complete_hook(self, my_task):
def _on_ready_hook(self, my_task):
try:
my_task.data = DeepMerge.merge(my_task.data,
self.dmnEngine.result(my_task))
super(BusinessRuleTask, self)._on_complete_hook(my_task)
my_task.data = DeepMerge.merge(my_task.data, self.dmnEngine.result(my_task))
super(BusinessRuleTask, self)._on_ready_hook(my_task)
except SpiffWorkflowException as we:
we.add_note(f"Business Rule Task '{my_task.task_spec.description}'.")
raise we
Expand Down
14 changes: 11 additions & 3 deletions SpiffWorkflow/spiff/parser/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,26 @@
from SpiffWorkflow.bpmn.specs.events.EndEvent import EndEvent
from SpiffWorkflow.bpmn.specs.events.StartEvent import StartEvent
from SpiffWorkflow.bpmn.specs.events.IntermediateEvent import IntermediateThrowEvent, BoundaryEvent, IntermediateCatchEvent

from SpiffWorkflow.spiff.specs.none_task import NoneTask
from SpiffWorkflow.spiff.specs.manual_task import ManualTask
from SpiffWorkflow.spiff.specs.user_task import UserTask
from SpiffWorkflow.spiff.specs.script_task import ScriptTask
from SpiffWorkflow.spiff.specs.subworkflow_task import SubWorkflowTask, TransactionSubprocess, CallActivity
from SpiffWorkflow.spiff.specs.service_task import ServiceTask
from SpiffWorkflow.spiff.specs.events.event_types import SendTask, ReceiveTask
from SpiffWorkflow.spiff.parser.task_spec import SpiffTaskParser, SubWorkflowParser, CallActivityParser, ServiceTaskParser, ScriptTaskParser
from SpiffWorkflow.spiff.specs.business_rule_task import BusinessRuleTask
from SpiffWorkflow.spiff.parser.task_spec import (
SpiffTaskParser,
SubWorkflowParser,
CallActivityParser,
ServiceTaskParser,
ScriptTaskParser,
BusinessRuleTaskParser
)
from SpiffWorkflow.spiff.parser.event_parsers import (SpiffStartEventParser, SpiffEndEventParser, SpiffBoundaryEventParser,
SpiffIntermediateCatchEventParser, SpiffIntermediateThrowEventParser, SpiffSendTaskParser, SpiffReceiveTaskParser)
from SpiffWorkflow.dmn.specs import BusinessRuleTask


from SpiffWorkflow.spiff.parser.task_spec import BusinessRuleTaskParser

Expand Down Expand Up @@ -44,4 +53,3 @@ class SpiffBpmnParser(BpmnDmnParser):
full_tag('receiveTask'): (SpiffReceiveTaskParser, ReceiveTask),
full_tag('businessRuleTask'): (BusinessRuleTaskParser, BusinessRuleTask)
}

22 changes: 14 additions & 8 deletions SpiffWorkflow/spiff/parser/task_spec.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from lxml import etree

from SpiffWorkflow.dmn.specs.BusinessRuleTask import BusinessRuleTask
from SpiffWorkflow.bpmn.parser.TaskParser import TaskParser
from SpiffWorkflow.bpmn.parser.task_parsers import SubprocessParser
from SpiffWorkflow.bpmn.parser.util import xpath_eval

from SpiffWorkflow.spiff.specs.multiinstance_task import StandardLoopTask, ParallelMultiInstanceTask, SequentialMultiInstanceTask
from SpiffWorkflow.spiff.specs.business_rule_task import BusinessRuleTask

SPIFFWORKFLOW_MODEL_NS = 'http://spiffworkflow.org/bpmn/schema/1.0/core'
SPIFFWORKFLOW_MODEL_PREFIX = 'spiffworkflow'
Expand Down Expand Up @@ -169,13 +169,19 @@ class BusinessRuleTaskParser(SpiffTaskParser):

def create_task(self):
decision_ref = self.get_decision_ref(self.node)
return BusinessRuleTask(self.spec,
self.get_task_spec_name(),
dmnEngine=self.process_parser.parser.get_engine(decision_ref, self.node),
lane=self.lane,
position=self.position,
description=self.node.get('name', None)
)
extensions = self.parse_extensions()
prescript = extensions.get('preScript')
postscript = extensions.get('postScript')
return BusinessRuleTask(
self.spec,
self.get_task_spec_name(),
dmnEngine=self.process_parser.parser.get_engine(decision_ref, self.node),
lane=self.lane,
position=self.position,
description=self.node.get('name', None),
prescript=prescript,
postscript=postscript,
)

@staticmethod
def get_decision_ref(node):
Expand Down
2 changes: 2 additions & 0 deletions SpiffWorkflow/spiff/serializer/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
CallActivityTaskConverter,
ParallelMultiInstanceTaskConverter,
SequentialMultiInstanceTaskConverter,
BusinessRuleTaskConverter,
)

from SpiffWorkflow.bpmn.serializer.event_definition import MessageEventDefinitionConverter as DefaultMessageEventDefinitionConverter
Expand Down Expand Up @@ -66,6 +67,7 @@
StandardLoopTaskConverter,
ParallelMultiInstanceTaskConverter,
SequentialMultiInstanceTaskConverter,
BusinessRuleTaskConverter
]
SPIFF_SPEC_CONFIG['event_definitions'].remove(DefaultMessageEventDefinitionConverter)
SPIFF_SPEC_CONFIG['event_definitions'].append(MessageEventDefinitionConverter)
12 changes: 12 additions & 0 deletions SpiffWorkflow/spiff/serializer/task_spec.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from SpiffWorkflow.bpmn.serializer.helpers.spec import TaskSpecConverter
from SpiffWorkflow.bpmn.serializer.task_spec import MultiInstanceTaskConverter
from SpiffWorkflow.dmn.serializer.task_spec import BaseBusinessRuleTaskConverter

from SpiffWorkflow.spiff.specs.none_task import NoneTask
from SpiffWorkflow.spiff.specs.manual_task import ManualTask
Expand All @@ -9,6 +10,7 @@
from SpiffWorkflow.spiff.specs.subworkflow_task import SubWorkflowTask, TransactionSubprocess, CallActivity
from SpiffWorkflow.spiff.specs.events.event_types import SendTask, ReceiveTask
from SpiffWorkflow.spiff.specs.multiinstance_task import StandardLoopTask, ParallelMultiInstanceTask, SequentialMultiInstanceTask
from SpiffWorkflow.spiff.specs.business_rule_task import BusinessRuleTask


class SpiffBpmnTaskConverter(TaskSpecConverter):
Expand Down Expand Up @@ -39,6 +41,16 @@ def __init__(self, registry):
super().__init__(UserTask, registry)


class BusinessRuleTaskConverter(BaseBusinessRuleTaskConverter, SpiffBpmnTaskConverter):
def __init__(self, registry):
super().__init__(BusinessRuleTask, registry)

def to_dict(self, spec):
dct = BaseBusinessRuleTaskConverter.to_dict(self, spec)
dct.update(SpiffBpmnTaskConverter.to_dict(self, spec))
return dct


class SendTaskConverter(SpiffBpmnTaskConverter):

def __init__(self, registry, typename=None):
Expand Down
5 changes: 5 additions & 0 deletions SpiffWorkflow/spiff/specs/business_rule_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from SpiffWorkflow.spiff.specs.spiff_task import SpiffBpmnTask
from SpiffWorkflow.dmn.specs.BusinessRuleTask import BusinessRuleTask as DefaultBusinessRuleTask

class BusinessRuleTask(DefaultBusinessRuleTask, SpiffBpmnTask):
pass
3 changes: 0 additions & 3 deletions tests/SpiffWorkflow/spiff/BaseTestCase.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@

from SpiffWorkflow.spiff.parser.process import SpiffBpmnParser, VALIDATOR
from SpiffWorkflow.spiff.serializer.config import SPIFF_SPEC_CONFIG
from SpiffWorkflow.dmn.serializer.task_spec import BusinessRuleTaskConverter
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer

from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase

SPIFF_SPEC_CONFIG['task_specs'].append(BusinessRuleTaskConverter)

wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter(SPIFF_SPEC_CONFIG)

class BaseTestCase(BpmnWorkflowTestCase):
Expand Down
2 changes: 1 addition & 1 deletion tests/SpiffWorkflow/spiff/BusinessRuleTaskTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ def testBusinessRule(self):
self.workflow = BpmnWorkflow(spec, subprocesses)
self.save_restore()
self.workflow.do_engine_steps()
self.assertTrue(self.workflow.is_completed())
self.assertTrue(self.workflow.is_completed())

0 comments on commit 42b4830

Please sign in to comment.