Skip to content

Commit 82d1dd7

Browse files
committed
fix-hydration
Signed-off-by: Antonio Mendoza Pérez <antmendoza@gmail.com>
1 parent 64379d1 commit 82d1dd7

File tree

8 files changed

+104
-49
lines changed

8 files changed

+104
-49
lines changed

README.md

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Provides the Python API/SPI for the [Serverless Workflow Specification](https://
55
> This is a WIP implementation
66
77
With the SDK you can:
8-
* **WIP** Programmatically build workflow definitions
8+
* Programmatically build workflow definitions
99
* Parse workflow JSON and YAML definitions
1010
* Validate workflow definitions
1111

@@ -24,19 +24,43 @@ pipenv shell
2424
python setup.py pytest
2525
```
2626

27-
## **WIP** Programmatically build workflow definitions
27+
## Programmatically build workflow definitions
2828

2929
```
30-
workflow = Workflow(id_="greeting",
31-
name="Greeting Workflow",
32-
description="Greet Someone",
33-
version='1.0',
34-
specVersion='0.8',
35-
start="Greet",
36-
states=[],
37-
functions=[]
38-
)
30+
workflow = Workflow(
31+
id_="greeting",
32+
name="Greeting Workflow",
33+
description="Greet Someone",
34+
version='1.0',
35+
specVersion='0.8',
36+
start="Greet",
37+
states=[
38+
OperationState(
39+
name="Greet",
40+
type="operation",
41+
actions=[
42+
Action(
43+
functionRef=FunctionRef(
44+
refName="greetingFunction",
45+
arguments={
46+
"name": "${ .person.name }"
47+
}
48+
),
49+
actionDataFilter=ActionDataFilter(
50+
results="${ .greeting }"
51+
)
52+
)
53+
],
54+
end=True
55+
)
56+
],
57+
functions=[
58+
Function(name="greetingFunction",
59+
operation="file://myapis/greetingapis.json#greeting")
60+
]
61+
)
3962
```
63+
You can see a full example in the [test_workflow.py](tests/serverlessworkflow/sdk/test_workflow.py) file
4064

4165
## Parse workflow JSON and YAML definitions
4266

serverlessworkflow/sdk/databased_switch_state.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from serverlessworkflow.sdk.default_condition_def import DefaultConditionDef
77
from serverlessworkflow.sdk.end_data_condition import EndDataCondition
88
from serverlessworkflow.sdk.error import Error
9-
from serverlessworkflow.sdk.hydration import HydratableParameter, UnionTypeOf, ComplexTypeOf, ArrayTypeOf, \
9+
from serverlessworkflow.sdk.hydration import HydratableParameter, ComplexTypeOf, ArrayTypeOf, \
1010
Fields
1111
from serverlessworkflow.sdk.metadata import Metadata
1212
from serverlessworkflow.sdk.state import State
@@ -52,7 +52,8 @@ def f_hydration(p_key, p_value):
5252
return HydratableParameter(value=p_value).hydrateAs(ComplexTypeOf(DataBasedSwitchStateTime0ut))
5353

5454
if p_key == 'dataConditions':
55-
return [DataBasedSwitchState.hydrate_state(v) if type(v) is not (TransitionDataCondition or EndDataCondition) else v for v in p_value]
55+
return [DataBasedSwitchState.hydrate_state(v) if not (
56+
isinstance(v, TransitionDataCondition or EndDataCondition)) else v for v in p_value]
5657

5758
if p_key == 'onErrors':
5859
return HydratableParameter(value=p_value).hydrateAs(ArrayTypeOf(Error))

serverlessworkflow/sdk/event_based_switch_state.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from serverlessworkflow.sdk.end_event_condition import EndEventCondition
77
from serverlessworkflow.sdk.error import Error
88
from serverlessworkflow.sdk.event_based_switch_state_timeout import EventBasedSwitchStateTimeOut
9-
from serverlessworkflow.sdk.hydration import HydratableParameter, ComplexTypeOf, UnionTypeOf, ArrayTypeOf, \
9+
from serverlessworkflow.sdk.hydration import HydratableParameter, ComplexTypeOf, ArrayTypeOf, \
1010
Fields
1111
from serverlessworkflow.sdk.metadata import Metadata
1212
from serverlessworkflow.sdk.state import State
@@ -52,7 +52,8 @@ def f_hydration(p_key, p_value):
5252
return HydratableParameter(value=p_value).hydrateAs(ComplexTypeOf(EventBasedSwitchStateTimeOut))
5353

5454
if p_key == 'eventConditions':
55-
return [EventBasedSwitchState.hydrate_state(v) if type(v) is not (TransitionEventCondition or EndEventCondition) else v for v in p_value]
55+
return [EventBasedSwitchState.hydrate_state(v) if not (
56+
isinstance(v, TransitionEventCondition or EndEventCondition)) else v for v in p_value]
5657

5758
if p_key == 'onErrors':
5859
return HydratableParameter(value=p_value).hydrateAs(ArrayTypeOf(Error))

serverlessworkflow/sdk/function_ref.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class FunctionRef:
1111

1212
def __init__(self,
1313
refName: str = None,
14-
arguments: dict[str, dict] = None,
14+
arguments: dict[str, any] = None,
1515
selectionSet: str = None,
1616
invoke: str = None,
1717
**kwargs):

serverlessworkflow/sdk/hydration.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from __future__ import annotations
22

33
import dataclasses
4+
from abc import ABC, abstractmethod
45
from typing import Any
56

67

7-
class HydratableType:
8+
class HydratableType(ABC):
9+
@abstractmethod
810
def hydrate(self, value):
911
pass
1012

serverlessworkflow/sdk/workflow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def f_hydration(p_key, p_value):
142142
ArrayTypeOf(AuthDef)]))
143143

144144
if p_key == 'states':
145-
return [Workflow.hydrate_state(v) if type(v) is not State else v for v in p_value]
145+
return [Workflow.hydrate_state(v) if not isinstance(v,State) else v for v in p_value]
146146

147147
if p_key == 'functions':
148148
return HydratableParameter(value=p_value).hydrateAs(UnionTypeOf([SimpleTypeOf(str),
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import unittest
2+
3+
from serverlessworkflow.sdk.event_based_switch_state import EventBasedSwitchState
4+
from serverlessworkflow.sdk.transition_event_condition import TransitionEventCondition
5+
6+
7+
class TestEventBasedSwitchState(unittest.TestCase):
8+
def test_programmatically_create_object(self):
9+
event_based_switch_state = EventBasedSwitchState(eventConditions=[TransitionEventCondition(
10+
name="Hold Book",
11+
eventRef="Hold Book Event",
12+
transition="Request Hold"
13+
14+
)])
15+
16+
self.assertTrue(isinstance(event_based_switch_state.eventConditions[0], TransitionEventCondition))

tests/serverlessworkflow/sdk/test_workflow.py

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,46 @@
44
from os import listdir
55

66
from serverlessworkflow.sdk.action import Action
7+
from serverlessworkflow.sdk.action_data_filter import ActionDataFilter
78
from serverlessworkflow.sdk.function import Function
89
from serverlessworkflow.sdk.function_ref import FunctionRef
10+
from serverlessworkflow.sdk.operation_state import OperationState
911
from serverlessworkflow.sdk.workflow import Workflow
1012

1113

1214
class TestWorkflow(unittest.TestCase):
13-
workflow = Workflow(id_="greeting",
14-
name="Greeting Workflow",
15-
description="Greet Someone",
16-
version='1.0',
17-
specVersion='0.8',
18-
start="Greet",
19-
states=[
20-
{
21-
"name": "Greet",
22-
"type": "operation",
23-
"actions": [
24-
{
25-
"functionRef": {
26-
"refName": "greetingFunction",
27-
"arguments": {
28-
"name": "${ .person.name }"
29-
}
30-
},
31-
"actionDataFilter": {
32-
"results": "${ .greeting }"
33-
}
34-
}
35-
],
36-
"end": True
15+
workflow = Workflow(
16+
id_="greeting",
17+
name="Greeting Workflow",
18+
description="Greet Someone",
19+
version='1.0',
20+
specVersion='0.8',
21+
start="Greet",
22+
states=[
23+
OperationState(
24+
name="Greet",
25+
type="operation",
26+
actions=[
27+
Action(
28+
functionRef=FunctionRef(
29+
refName="greetingFunction",
30+
arguments={
31+
"name": "${ .person.name }"
3732
}
38-
],
39-
functions=[
40-
{
41-
"name": "greetingFunction",
42-
"operation": "file://myapis/greetingapis.json#greeting"
43-
}
44-
]
33+
),
34+
actionDataFilter=ActionDataFilter(
35+
results="${ .greeting }"
4536
)
37+
)
38+
],
39+
end=True
40+
)
41+
],
42+
functions=[
43+
Function(name="greetingFunction",
44+
operation="file://myapis/greetingapis.json#greeting")
45+
]
46+
)
4647

4748
def test_workflow_to_json(self):
4849
expected = """{
@@ -106,6 +107,16 @@ def test_workflow_to_yaml(self):
106107
"""
107108
self.assertEqual(expected, self.workflow.to_yaml())
108109

110+
def test_programmatically_create_workflow(self):
111+
112+
self.assertEqual("greeting", self.workflow.id)
113+
self.assertEqual("operation", self.workflow.states[0].type)
114+
self.assertTrue(isinstance(self.workflow.states[0], OperationState))
115+
self.assertEqual(True, self.workflow.states[0].end)
116+
self.assertTrue(isinstance(self.workflow.states[0].actions[0], Action))
117+
self.assertTrue(isinstance(self.workflow.states[0].actions[0].functionRef, FunctionRef))
118+
self.assertTrue(isinstance(self.workflow.functions[0], Function))
119+
109120
def test_workflow_from_source_json(self):
110121
examples_dir = os.path.join(os.path.dirname(__file__), '../../examples')
111122
examples = listdir(examples_dir)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy