From acf34696d31d1c0db53a64283f4f317cf9b5e2fc Mon Sep 17 00:00:00 2001 From: rahul188 Date: Sun, 19 Jul 2026 14:08:04 +0530 Subject: [PATCH] feat(workflow): add LambdaTask builder for TaskType.LAMBDA Closes #427 TaskType.LAMBDA existed in the enum but had no builder class, so LAMBDA tasks could only be constructed from raw dicts via the Python SDK. Add a LambdaTask builder that mirrors InlineTask: it sets scriptExpression from the script argument and merges any bindings into input_parameters. Signed-off-by: rahul188 --- .../client/workflow/task/lambda_task.py | 19 ++++++++++++++ tests/unit/workflow/test_lambda_task.py | 26 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/conductor/client/workflow/task/lambda_task.py create mode 100644 tests/unit/workflow/test_lambda_task.py diff --git a/src/conductor/client/workflow/task/lambda_task.py b/src/conductor/client/workflow/task/lambda_task.py new file mode 100644 index 000000000..e27343b06 --- /dev/null +++ b/src/conductor/client/workflow/task/lambda_task.py @@ -0,0 +1,19 @@ +from __future__ import annotations +from typing import Dict, Optional +from typing_extensions import Self + +from conductor.client.workflow.task.task import TaskInterface +from conductor.client.workflow.task.task_type import TaskType + + +class LambdaTask(TaskInterface): + def __init__(self, task_ref_name: str, script: str, bindings: Optional[Dict[str, str]] = None) -> Self: + super().__init__( + task_reference_name=task_ref_name, + task_type=TaskType.LAMBDA, + input_parameters={ + "scriptExpression": script, + } + ) + if bindings is not None: + self.input_parameters.update(bindings) diff --git a/tests/unit/workflow/test_lambda_task.py b/tests/unit/workflow/test_lambda_task.py new file mode 100644 index 000000000..e69f8e3fe --- /dev/null +++ b/tests/unit/workflow/test_lambda_task.py @@ -0,0 +1,26 @@ +from conductor.client.workflow.task.lambda_task import LambdaTask +from conductor.client.workflow.task.task_type import TaskType + +SCRIPT = "(function(){ return {out: $.x + 1}; })()" + + +def test_lambda_task_builds_script_expression(): + task = LambdaTask(task_ref_name="lambda_ref", script=SCRIPT) + assert task.task_reference_name == "lambda_ref" + assert task.input_parameters == {"scriptExpression": SCRIPT} + + workflow_task = task.to_workflow_task() + assert workflow_task.type == TaskType.LAMBDA.value + assert workflow_task.input_parameters["scriptExpression"] == SCRIPT + + +def test_lambda_task_merges_bindings(): + task = LambdaTask( + task_ref_name="lambda_ref", + script=SCRIPT, + bindings={"x": "${workflow.input.x}"}, + ) + assert task.input_parameters == { + "scriptExpression": SCRIPT, + "x": "${workflow.input.x}", + }