Skip to content

Commit

Permalink
Better hook to override
Browse files Browse the repository at this point in the history
  • Loading branch information
jbirddog committed Sep 6, 2022
1 parent a6a30c1 commit 32ce3d9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
26 changes: 20 additions & 6 deletions SpiffWorkflow/bpmn/PythonScriptEngine.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,21 +270,35 @@ def execute(self, task, script, data, external_methods=None):
raise WorkflowTaskExecException(task, detail, err, line_number,
error_line)

def service_task_external_methods(self):
def available_service_task_external_methods(self):
"""Allows consumers a hook to specify external methods that can be
called from service tasks."""
return None

def execute_service_task_script(self, task, script, data,
def external_methods_for_operation_name(self, operation_name):
"""Returns a subset of available_service_task_external_methods
that can be called from a service task with the given
operation_name."""

external_methods = self.available_service_task_external_methods()
if external_methods is None or operation_name not in external_methods:
return {}

return { operation_name: external_methods[operation_name] }

def execute_service_task_script(self, task, operation_name, script, data,
external_methods=None):
"""Execute the script, within the context of the specified task. Task
is assumed to be a service task. service_task_external_methods are
merged with the supplied external_methods before execution."""
filtered by the given operation name and merged with the supplied
external_methods before execution."""

additions = self.external_methods_for_operation_name(operation_name)

if external_methods is None:
external_methods = self.service_task_external_methods()
else:
external_methods.update(self.service_task_external_methods())
external_methods = {}

external_methods.update(additions)

self.execute(task, script, data, external_methods=external_methods)

Expand Down
3 changes: 2 additions & 1 deletion SpiffWorkflow/spiff/specs/service_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ def evaluate(expression):
evaluated_params = {k: evaluate(v) for k, v in self.operation_params.items()}
script = f'{self.operation_name}(**{operation_params_var_name}).execute()'

task.workflow.script_engine.execute_service_task_script(task, script, task.data,
task.workflow.script_engine.execute_service_task_script(task,
self.operation_name, script, task.data,
external_methods={ operation_params_var_name: evaluated_params })
2 changes: 1 addition & 1 deletion tests/SpiffWorkflow/spiff/ServiceTaskTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def execute(self):
operatorExecuted = True

class ExampleCustomScriptEngine(PythonScriptEngine):
def service_task_external_methods(self):
def available_service_task_external_methods(self):
return { 'SlackWebhookOperator': SlackWebhookOperator }

class ServiceTaskTest(BaseTestCase):
Expand Down

0 comments on commit 32ce3d9

Please sign in to comment.