|
1 | | -from typing import Any, Optional # noqa: F401, I001 |
| 1 | +from typing import Any |
| 2 | +from typing import TypeAlias |
2 | 3 | from copy import deepcopy |
3 | 4 |
|
4 | 5 | from .callbacks import Callbacks |
|
9 | 10 |
|
10 | 11 |
|
11 | 12 | class NestedStateFactory(type): |
12 | | - def __new__(cls, classname, bases, attrs, name=None, initial=False, parallel=False): |
| 13 | + def __new__( # type: ignore [misc] |
| 14 | + cls, classname, bases, attrs, name=None, initial=False, parallel=False |
| 15 | + ) -> "State": |
13 | 16 |
|
14 | 17 | if not bases: |
15 | | - return super().__new__(cls, classname, bases, attrs) |
| 18 | + return super().__new__(cls, classname, bases, attrs) # type: ignore [return-value] |
16 | 19 |
|
17 | 20 | substates = [] |
18 | 21 | for key, value in attrs.items(): |
19 | | - if not isinstance(value, State): |
20 | | - continue |
21 | | - value._set_id(key) |
22 | | - substates.append(value) |
| 22 | + if isinstance(value, State): |
| 23 | + value._set_id(key) |
| 24 | + substates.append(value) |
| 25 | + if isinstance(value, TransitionList): |
| 26 | + value.add_event(key) |
23 | 27 |
|
24 | | - return State(name, initial=initial, parallel=parallel, substates=substates) |
| 28 | + return State(name=name, initial=initial, parallel=parallel, substates=substates) |
25 | 29 |
|
26 | 30 |
|
27 | 31 | class NestedStateBuilder(metaclass=NestedStateFactory): |
@@ -102,37 +106,37 @@ class State: |
102 | 106 |
|
103 | 107 | """ |
104 | 108 |
|
105 | | - Builder = NestedStateBuilder |
| 109 | + Builder: TypeAlias = NestedStateBuilder |
106 | 110 |
|
107 | 111 | def __init__( |
108 | 112 | self, |
109 | | - name, |
110 | | - value=None, |
111 | | - initial=False, |
112 | | - final=False, |
113 | | - parallel=False, |
114 | | - substates=None, |
115 | | - enter=None, |
116 | | - exit=None, |
| 113 | + name: str = "", |
| 114 | + value: Any = None, |
| 115 | + initial: bool = False, |
| 116 | + final: bool = False, |
| 117 | + parallel: bool = False, |
| 118 | + substates: Any = None, |
| 119 | + enter: Any = None, |
| 120 | + exit: Any = None, |
117 | 121 | ): |
118 | | - # type: (str, Optional[Any], bool, bool, bool, Optional[Any], Optional[Any], Optional[Any]) -> None # noqa |
119 | 122 | self.name = name |
120 | 123 | self.value = value |
121 | 124 | self.parallel = parallel |
122 | | - self.parent: "State" = None |
123 | 125 | self.substates = substates or [] |
124 | | - self._id = None # type: Optional[str] |
125 | | - self._storage = "" |
126 | 126 | self._initial = initial |
127 | | - self.transitions = TransitionList() |
128 | 127 | self._final = final |
| 128 | + self._id: str = "" |
| 129 | + self._storage: str = "" |
| 130 | + self.parent: "State" = None |
| 131 | + self.transitions = TransitionList() |
129 | 132 | self.enter = Callbacks().add(enter) |
130 | 133 | self.exit = Callbacks().add(exit) |
131 | 134 | self._init_substates() |
132 | 135 |
|
133 | 136 | def _init_substates(self): |
134 | 137 | for substate in self.substates: |
135 | 138 | substate.parent = self |
| 139 | + setattr(self, substate.id, substate) |
136 | 140 |
|
137 | 141 | def __eq__(self, other): |
138 | 142 | return ( |
@@ -190,6 +194,8 @@ def _set_id(self, id): |
190 | 194 | self._storage = f"_{id}" |
191 | 195 | if self.value is None: |
192 | 196 | self.value = id |
| 197 | + if not self.name: |
| 198 | + self.name = self._id.replace("_", " ").capitalize() |
193 | 199 |
|
194 | 200 | def _to_(self, *states, **kwargs): |
195 | 201 | transitions = TransitionList( |
|
0 commit comments