Skip to content

Commit

Permalink
enforce some consistency in the script engine
Browse files Browse the repository at this point in the history
  • Loading branch information
essweine committed Nov 27, 2024
1 parent af2f8ca commit b83e521
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 42 deletions.
15 changes: 6 additions & 9 deletions SpiffWorkflow/bpmn/script_engine/python_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import ast
import sys
import traceback
import warnings

from SpiffWorkflow.exceptions import SpiffWorkflowException
from SpiffWorkflow.bpmn.exceptions import WorkflowTaskException
Expand Down Expand Up @@ -65,15 +64,13 @@ def execute(self, task, script, external_context=None):
wte = self.create_task_exec_exception(task, script, err)
raise wte

def call_service(self, operation_name, operation_params, task_data):
def call_service(self, task, **kwargs):
"""Override to control how external services are called from service tasks."""
warnings.warn(
'In the next release, implementation of this method will be moved to the scripting environment',
DeprecationWarning,
stacklevel=2,
)
# Ideally, this method would look like call_service(self, task, operation_name, operation_params)
return self.environment.call_service(operation_name, operation_params, task_data)
try:
return self.environment.call_service(task.data, **kwargs)
except Exception as err:
wte = self.create_task_exec_exception(task, script, err)
raise wte

def create_task_exec_exception(self, task, script, err):
line_number, error_line = self.get_error_line_number_and_content(script, err)
Expand Down
2 changes: 1 addition & 1 deletion SpiffWorkflow/bpmn/script_engine/python_environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def evaluate(self, expression, context, external_context=None):
def execute(self, script, context, external_context=None):
raise NotImplementedError("Subclass must implement this method")

def call_service(self, operation_name, operation_params, task_data):
def call_service(self, operation_name, operation_params, context):
raise NotImplementedError("To call external services override the script engine and implement `call_service`.")


Expand Down
45 changes: 19 additions & 26 deletions SpiffWorkflow/spiff/specs/mixins/service_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,32 +29,25 @@ def __init__(self, wf_spec, name, operation_name, operation_params, result_varia
super().__init__(wf_spec, name, **kwargs)
self.operation_name = operation_name
self.operation_params = operation_params
self.result_variable = result_variable

def _result_variable(self, task):
if self.result_variable is not None and len(self.result_variable) > 0:
return self.result_variable

escaped_spec_name = task.task_spec.name.replace('-', '_')

return f'spiff__{escaped_spec_name}_result'
if result_variable is None or result_variable == '':
self.result_variable = f'spiff__{name.replace("-", "_")}_result'
else:
self.result_variable = result_variable

def evalutate_params(self, task):
evaluated_params = {}
for name, param in self.operation_params.items():
evaluated_params[name] = {
'value': task.workflow.script_engine.evaluate(task, param['value']),
'type': param['type'],
}
return evaluated_params

def _execute(self, task):
def evaluate(param):
param['value'] = task.workflow.script_engine.evaluate(task, param['value'])
return param

operation_params_copy = deepcopy(self.operation_params)
evaluated_params = {k: evaluate(v) for k, v in operation_params_copy.items()}

try:
result = task.workflow.script_engine.call_service(self.operation_name,
evaluated_params, task.data)
except Exception as e:
wte = WorkflowTaskException("Error executing Service Task",
task=task, exception=e)
wte.add_note(str(e))
raise wte
parsed_result = json.loads(result)
task.data[self._result_variable(task)] = parsed_result
result = task.workflow.script_engine.call_service(
task,
self.operation_name,
self.evalutate_params(task),
)
task.data[self.result_variable] = json.loads(result)
return True
5 changes: 2 additions & 3 deletions tests/SpiffWorkflow/spiff/ServiceTaskTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ def call_connector(name, params, task_data):
return json.dumps(sample_response)

class ExampleCustomScriptEngine(PythonScriptEngine):
def call_service(self, operation_name, operation_params, task_data):
return ServiceTaskDelegate.call_connector(operation_name, operation_params,
task_data)
def call_service(self, task, operation_name, operation_params):
return ServiceTaskDelegate.call_connector(operation_name, operation_params, task.data)

class ServiceTaskTest(BaseTestCase):

Expand Down
5 changes: 2 additions & 3 deletions tests/SpiffWorkflow/spiff/ServiceTaskVariableTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,8 @@ def call_connector(name, params, task_data):
return json.dumps(sample_response)

class ExampleCustomScriptEngine(PythonScriptEngine):
def call_service(self, operation_name, operation_params, task_data):
return ServiceTaskDelegate.call_connector(operation_name, operation_params,
task_data)
def call_service(self, task, operation_name, operation_params):
return ServiceTaskDelegate.call_connector(operation_name, operation_params, task.data)

class ServiceTaskVariableTest(BaseTestCase):

Expand Down

0 comments on commit b83e521

Please sign in to comment.