Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 7 additions & 9 deletions python_camunda_sdk/connectors/connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from python_camunda_sdk.types import SimpleTypes
from python_camunda_sdk.connectors.config import ConnectorConfig

RESPONSE_FIELD = "response"

class ConnectorMetaclass(ModelMetaclass):
"""Connector metaclass.
Expand Down Expand Up @@ -140,17 +141,14 @@ async def _execute(
f" {type(ret_value)}"
)

return_variable_name = job.custom_headers.get("resultVariable", None)
return_value = None

if return_variable_name is not None:
return_value = None

if isinstance(ret_value, BaseModel):
return_value = ret_value.model_dump()
else:
return_value = ret_value
if isinstance(ret_value, BaseModel):
return_value = ret_value.model_dump()
else:
return_value = ret_value

return {return_variable_name: return_value}
return {RESPONSE_FIELD: return_value}

@abstractmethod
async def run(self) -> None:
Expand Down
20 changes: 5 additions & 15 deletions python_camunda_sdk/templates/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from pydantic import BaseModel, Field

from python_camunda_sdk.connectors import Connector, InboundConnector

from python_camunda_sdk.connectors.connector import RESPONSE_FIELD

class Binding(BaseModel):
type: str
Expand All @@ -24,7 +24,6 @@ class CamundaProperty(BaseModel):
group: Optional[str] = None
feel: Optional[str] = None


class Group(BaseModel):
id: Optional[str] = None
label: Optional[str] = None
Expand Down Expand Up @@ -106,7 +105,7 @@ def generate_output_prop(cls: Connector) -> Optional[CamundaProperty]:
if return_annotation != signature.empty:
prop = CamundaProperty(
label="Result variable",
binding=Binding(type="zeebe:taskHeader", key="resultVariable"),
binding=Binding(type="zeebe:output", source=f"={RESPONSE_FIELD}"),
type="String",
group="output",
)
Expand Down Expand Up @@ -143,18 +142,9 @@ class ConnectorConfig:
"""
props = generate_input_props(cls)

signature = inspect.signature(cls.run)

return_annotation = signature.return_annotation

if return_annotation != signature.empty:
prop = CamundaProperty(
label="Result variable",
binding=Binding(type="zeebe:taskHeader", key="resultVariable"),
type="String",
group="output",
)
props.append(prop)
output_prop = generate_output_prop(cls)
if output_prop is not None:
props.append(output_prop)

task_type_prop = CamundaProperty(
value=cls.config.type,
Expand Down
11 changes: 6 additions & 5 deletions tests/test_inbound.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from unittest import TestCase

from python_camunda_sdk import InboundConnector
from python_camunda_sdk.connectors.connector import RESPONSE_FIELD

from util import async_test, DummyJob, DummyClient

Expand All @@ -23,7 +24,7 @@ class ConnectorConfig:
class TestInboundConnector(TestCase):
@async_test
async def test_valid(self):
job = DummyJob(result_variable="ret")
job = DummyJob()
client = DummyClient()

connector = ValidInbound(counter=1)
Expand All @@ -36,12 +37,12 @@ async def test_valid(self):
self.assertIsNone(ret)
self.assertEqual(client.message_name, "test_message")
self.assertEqual(client.correlation_key, "key_x")
self.assertEqual(client.variables, {"ret": 2})
self.assertEqual(client.variables, {RESPONSE_FIELD: 2})

@async_test
async def test_to_task_conversion(self):
client = DummyClient()
job = DummyJob(result_variable="ret")
job = DummyJob()

task = ValidInbound.to_task(client=client)

Expand All @@ -57,12 +58,12 @@ async def test_to_task_conversion(self):
self.assertIsNone(ret)
self.assertEqual(client.message_name, "test_message")
self.assertEqual(client.correlation_key, "key_x")
self.assertEqual(client.variables, {"ret": 2})
self.assertEqual(client.variables, {RESPONSE_FIELD: 2})

@async_test
async def test_task_validation_failure(self):
task = ValidInbound.to_task(client=None)
job = DummyJob(result_variable="ret")
job = DummyJob()
with self.assertRaises(ValidationError):
await task(
job=job,
Expand Down
41 changes: 21 additions & 20 deletions tests/test_outbound.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from pydantic import ValidationError, BaseModel

from python_camunda_sdk import OutboundConnector
from python_camunda_sdk.connectors.connector import RESPONSE_FIELD

from util import true_body, none_body, dict_body, async_test, DummyJob

Expand Down Expand Up @@ -65,25 +66,25 @@ class ConnectorConfig:

connector = DummyOutboundConnector()

job = DummyJob(result_variable="ret")
job = DummyJob()
ret = await connector._execute(job=job)

self.assertIsInstance(ret, dict)
self.assertIn("ret", ret)
self.assertTrue(ret["ret"])
self.assertIn(RESPONSE_FIELD, ret)
self.assertTrue(ret[RESPONSE_FIELD])

@async_test
async def test_sync_run(self):
cls = self.generate_outbound_connector(true_body, bool)

connector = cls()

job = DummyJob(result_variable="ret")
job = DummyJob()
ret = await connector._execute(job=job)

self.assertIsInstance(ret, dict)
self.assertIn("ret", ret)
self.assertTrue(ret["ret"])
self.assertIn(RESPONSE_FIELD, ret)
self.assertTrue(ret[RESPONSE_FIELD])

@async_test
async def test_return_none(self):
Expand All @@ -93,12 +94,12 @@ async def test_return_none(self):

self.assertIsNotNone(connector)

job = DummyJob(result_variable="ret")
job = DummyJob()
ret = await connector._execute(job=job)

self.assertIsInstance(ret, dict)
self.assertIn("ret", ret)
self.assertIsNone(ret["ret"])
self.assertIn(RESPONSE_FIELD, ret)
self.assertIsNone(ret[RESPONSE_FIELD])

@async_test
async def test_return_dict(self):
Expand All @@ -108,12 +109,12 @@ async def test_return_dict(self):

self.assertIsNotNone(connector)

job = DummyJob(result_variable="ret")
job = DummyJob()
ret = await connector._execute(job=job)

self.assertIsInstance(ret, dict)
self.assertIn("ret", ret)
self.assertIsInstance(ret["ret"], dict)
self.assertIn(RESPONSE_FIELD, ret)
self.assertIsInstance(ret[RESPONSE_FIELD], dict)

@async_test
async def test_return_model(self):
Expand All @@ -123,12 +124,12 @@ async def test_return_model(self):

self.assertIsNotNone(connector)

job = DummyJob(result_variable="ret")
job = DummyJob()
ret = await connector._execute(job=job)

self.assertIsInstance(ret, dict)
self.assertIn("ret", ret)
self.assertIsInstance(ret["ret"], dict)
self.assertIn(RESPONSE_FIELD, ret)
self.assertIsInstance(ret[RESPONSE_FIELD], dict)

@async_test
async def test_return_wrong_type(self):
Expand All @@ -138,7 +139,7 @@ async def test_return_wrong_type(self):

self.assertIsNotNone(connector)
with self.assertRaises(ValueError):
job = DummyJob(result_variable="ret")
job = DummyJob()
await connector._execute(job=job)

def test_no_run_method(self):
Expand Down Expand Up @@ -181,15 +182,15 @@ class ConnectorConfig:
async def test_to_task_conversion(self):
cls = self.generate_outbound_connector(true_body, bool)

job = DummyJob(result_variable="ret")
job = DummyJob()

task = cls.to_task(client=None)

ret = await task(job=job)

self.assertIsInstance(ret, dict)
self.assertIn("ret", ret)
self.assertTrue(ret["ret"])
self.assertIn("response", ret)
self.assertTrue(ret["response"])

@async_test
async def test_task_validation_failure(self):
Expand All @@ -205,6 +206,6 @@ class ConnectorConfig:
timeout = 10

task = DummyOutboundConnector.to_task(client=None)
job = DummyJob(result_variable="ret")
job = DummyJob()
with self.assertRaises(ValidationError):
await task(job=job, input_field="foo")
4 changes: 2 additions & 2 deletions tests/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@


class DummyJob:
def __init__(self, result_variable: str = None):
self.custom_headers = {"resultVariable": result_variable}
pass



class DummyClient:
Expand Down