Skip to content

Commit 166bd12

Browse files
authored
Merge pull request #38 from ATNoG/bug/action_events_metadata
Adding metadata to events
2 parents fdec6ba + 8cd1e53 commit 166bd12

File tree

2 files changed

+90
-11
lines changed

2 files changed

+90
-11
lines changed

serverlessworkflow/sdk/state_machine_generator.py

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from serverlessworkflow.sdk.transition_data_condition import TransitionDataCondition
2424
from serverlessworkflow.sdk.end_data_condition import EndDataCondition
2525

26-
from transitions.extensions import HierarchicalMachine, GraphMachine
2726
from transitions.extensions.nesting import NestedState
2827
import warnings
2928

@@ -260,7 +259,67 @@ def sleep_state_details(self):
260259

261260
def event_state_details(self):
262261
if isinstance(self.current_state, EventState):
263-
self.state_to_machine_state(["event_state", "state"])
262+
state = self.state_to_machine_state(["event_state", "state"])
263+
if self.get_actions:
264+
if on_events := self.current_state.onEvents:
265+
state.initial = [] if len(on_events) > 1 else on_events[0]
266+
for i, oe in enumerate(on_events):
267+
state.add_substate(
268+
oe_state := self.state_machine.state_cls(
269+
oe_name := f"onEvent {i}"
270+
)
271+
)
272+
273+
# define initial state
274+
if i == 0 and len(on_events) > 1:
275+
state.initial = [oe_state.name]
276+
elif i == 0 and len(on_events) == 1:
277+
state.initial = oe_state.name
278+
else:
279+
state.initial.append(oe_state.name)
280+
281+
event_names = []
282+
for ie, event in enumerate(oe.eventRefs):
283+
oe_state.add_substate(
284+
ns := self.state_machine.state_cls(event)
285+
)
286+
ns.tags = ["event"]
287+
self.get_action_event(state=ns, e_name=event)
288+
event_names.append(event)
289+
290+
# define initial state
291+
if ie == 0 and len(oe.eventRefs) > 1:
292+
oe_state.initial = [event]
293+
elif ie == 0 and len(oe.eventRefs) == 1:
294+
oe_state.initial = event
295+
else:
296+
oe_state.initial.append(event)
297+
298+
if self.current_state.exclusive:
299+
oe_state.add_substate(
300+
ns := self.state_machine.state_cls(
301+
action_name := f"action {ie}"
302+
)
303+
)
304+
self.state_machine.add_transition(
305+
trigger="",
306+
source=f"{self.current_state.name}.{oe_name}.{event}",
307+
dest=f"{self.current_state.name}.{oe_name}.{action_name}",
308+
)
309+
self.generate_actions_info(
310+
machine_state=ns,
311+
state_name=f"{self.current_state.name}.{oe_name}.{action_name}",
312+
actions=oe.actions,
313+
action_mode=oe.actionMode,
314+
)
315+
if not self.current_state.exclusive and oe.actions:
316+
self.generate_actions_info(
317+
machine_state=oe_state,
318+
state_name=f"{self.current_state.name}.{oe_name}",
319+
actions=oe.actions,
320+
action_mode=oe.actionMode,
321+
initial_states=event_names,
322+
)
264323

265324
def foreach_state_details(self):
266325
if isinstance(self.current_state, ForEachState):
@@ -353,6 +412,7 @@ def generate_actions_info(
353412
state_name: str,
354413
actions: List[Dict[str, Action]],
355414
action_mode: str = "sequential",
415+
initial_states: List[str] = [],
356416
):
357417
if self.get_actions:
358418
parallel_states = []
@@ -387,7 +447,11 @@ def generate_actions_info(
387447
ns := self.state_machine.state_cls(name)
388448
)
389449
ns.tags = ["event"]
390-
self.get_action_event(state=ns, e_name=name)
450+
self.get_action_event(
451+
state=ns,
452+
e_name=action.eventRef.triggerEventRef,
453+
er_name=action.eventRef.resultEventRef,
454+
)
391455
if name:
392456
if action_mode == "sequential":
393457
if i < len(actions) - 1:
@@ -439,19 +503,36 @@ def generate_actions_info(
439503
)
440504
ns.tags = ["event"]
441505
self.get_action_event(
442-
state=ns, e_name=next_name
506+
state=ns,
507+
e_name=action.eventRef.triggerEventRef,
508+
er_name=action.eventRef.resultEventRef,
443509
)
444510
self.state_machine.add_transition(
445511
trigger="",
446512
source=f"{state_name}.{name}",
447513
dest=f"{state_name}.{next_name}",
448514
)
449-
if i == 0:
515+
if i == 0 and not initial_states:
450516
machine_state.initial = name
517+
elif i == 0 and initial_states:
518+
for init_s in initial_states:
519+
self.state_machine.add_transition(
520+
trigger="",
521+
source=f"{state_name}.{init_s}",
522+
dest=f"{state_name}.{name}",
523+
)
451524
elif action_mode == "parallel":
452525
parallel_states.append(name)
453-
if action_mode == "parallel":
526+
if action_mode == "parallel" and not initial_states:
454527
machine_state.initial = parallel_states
528+
elif action_mode == "parallel" and initial_states:
529+
for init_s in initial_states:
530+
for ps in parallel_states:
531+
self.state_machine.add_transition(
532+
trigger="",
533+
source=f"{state_name}.{init_s}",
534+
dest=f"{state_name}.{ps}",
535+
)
455536

456537
def get_action_function(self, state: NestedState, f_name: str):
457538
if self.workflow.functions:
@@ -461,13 +542,14 @@ def get_action_function(self, state: NestedState, f_name: str):
461542
state.metadata = {"function": current_function}
462543
break
463544

464-
def get_action_event(self, state: NestedState, e_name: str):
545+
def get_action_event(self, state: NestedState, e_name: str, er_name: str = ""):
465546
if self.workflow.events:
466547
for event in self.workflow.events:
467548
current_event = event.serialize().__dict__
468549
if current_event["name"] == e_name:
469550
state.metadata = {"event": current_event}
470-
break
551+
if current_event["name"] == er_name:
552+
state.metadata = {"result_event": current_event}
471553

472554
def subflow_state_name(self, action: Action, subflow: Workflow):
473555
return (

serverlessworkflow/sdk/state_machine_helper.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
from typing import List
22
from serverlessworkflow.sdk.workflow import Workflow
33
from serverlessworkflow.sdk.state_machine_generator import StateMachineGenerator
4-
from transitions.extensions.diagrams import HierarchicalGraphMachine, GraphMachine
54
from serverlessworkflow.sdk.state_machine_extensions import (
65
CustomGraphMachine,
76
CustomHierarchicalGraphMachine,
87
)
9-
from transitions.extensions.nesting import NestedState
10-
from transitions.extensions.diagrams_base import BaseGraph
118

129

1310
class StateMachineHelper:

0 commit comments

Comments
 (0)