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)
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