Skip to content

Commit d2a002a

Browse files
committed
fix: Fix 326, _ioprocessor is the same for the session
1 parent 7de2ad4 commit d2a002a

2 files changed

Lines changed: 36 additions & 74 deletions

File tree

statemachine/io/scxml/processor.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
from dataclasses import dataclass
12
from pathlib import Path
23
from typing import Any
34
from typing import Dict
45
from typing import List
56

67
from ...exceptions import InvalidDefinition
8+
from ...statemachine import StateMachine
79
from .. import StateDefinition
810
from .. import TransitionDict
911
from .. import TransitionsDict
@@ -17,10 +19,32 @@
1719
from .schema import Transition
1820

1921

22+
class IOProcessor:
23+
def __init__(self, processor: "SCXMLProcessor", machine: StateMachine):
24+
self.scxml_processor = processor
25+
self.machine = machine
26+
27+
def __getitem__(self, name: str):
28+
return self
29+
30+
@property
31+
def location(self):
32+
return self.machine.name
33+
34+
35+
@dataclass
36+
class SessionData:
37+
machine: StateMachine
38+
processor: IOProcessor
39+
40+
def __post_init__(self):
41+
self.session_id = f"{self.machine.name}:{id(self.machine)}"
42+
43+
2044
class SCXMLProcessor:
2145
def __init__(self):
2246
self.scs = {}
23-
self.sessions = {}
47+
self.sessions: Dict[str, SessionData] = {}
2448
self._ioprocessors = {
2549
"http://www.w3.org/TR/scxml/#SCXMLEventProcessor": self,
2650
"scxml": self,
@@ -54,15 +78,23 @@ def _prepare_event(self, *args, **kwargs):
5478
machine_weakref = getattr(machine, "__weakref__", None)
5579
if machine_weakref:
5680
machine = machine_weakref()
57-
session_id = f"{machine.name}:{id(machine)}"
81+
82+
session_data = self._get_session(machine)
5883

5984
return {
6085
"_name": machine.name,
61-
"_sessionid": session_id,
62-
"_ioprocessors": self.wrap(**kwargs),
86+
"_sessionid": session_data.session_id,
87+
"_ioprocessors": session_data.processor,
6388
"_event": EventDataWrapper(kwargs["event_data"]),
6489
}
6590

91+
def _get_session(self, machine: StateMachine):
92+
if machine.name not in self.sessions:
93+
self.sessions[machine.name] = SessionData(
94+
processor=IOProcessor(self, machine=machine), machine=machine
95+
)
96+
return self.sessions[machine.name]
97+
6698
def _process_states(self, states: Dict[str, State]) -> Dict[str, StateDefinition]:
6799
states_dict: Dict[str, StateDefinition] = {}
68100
for state_id, state in states.items():
@@ -139,21 +171,4 @@ def start(self, **kwargs):
139171
kwargs["enable_self_transition_entries"] = True
140172
self.root_cls = next(iter(self.scs.values()))
141173
self.root = self.root_cls(**kwargs)
142-
self.sessions[self.root.name] = self.root
143174
return self.root
144-
145-
def wrap(self, **kwargs):
146-
return IOProcessor(self, **kwargs)
147-
148-
149-
class IOProcessor:
150-
def __init__(self, processor: "SCXMLProcessor", **kwargs):
151-
self.scxml_processor = processor
152-
self.machine = kwargs["machine"]
153-
154-
def __getitem__(self, name: str):
155-
return self
156-
157-
@property
158-
def location(self):
159-
return self.machine.name

tests/scxml/w3c/mandatory/test326.fail.md

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)