|
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): |
@@ -94,37 +98,37 @@ class State: |
94 | 98 |
|
95 | 99 | """ |
96 | 100 |
|
97 | | - Builder = NestedStateBuilder |
| 101 | + Builder: TypeAlias = NestedStateBuilder |
98 | 102 |
|
99 | 103 | def __init__( |
100 | 104 | self, |
101 | | - name, |
102 | | - value=None, |
103 | | - initial=False, |
104 | | - final=False, |
105 | | - parallel=False, |
106 | | - substates=None, |
107 | | - enter=None, |
108 | | - exit=None, |
| 105 | + name: str = "", |
| 106 | + value: Any = None, |
| 107 | + initial: bool = False, |
| 108 | + final: bool = False, |
| 109 | + parallel: bool = False, |
| 110 | + substates: Any = None, |
| 111 | + enter: Any = None, |
| 112 | + exit: Any = None, |
109 | 113 | ): |
110 | | - # type: (str, Optional[Any], bool, bool, bool, Optional[Any], Optional[Any], Optional[Any]) -> None # noqa |
111 | 114 | self.name = name |
112 | 115 | self.value = value |
113 | 116 | self.parallel = parallel |
114 | | - self.parent: "State" = None |
115 | 117 | self.substates = substates or [] |
116 | | - self._id = None # type: Optional[str] |
117 | | - self._storage = "" |
118 | 118 | self._initial = initial |
119 | | - self.transitions = TransitionList() |
120 | 119 | self._final = final |
| 120 | + self._id: str = "" |
| 121 | + self._storage: str = "" |
| 122 | + self.parent: "State" = None |
| 123 | + self.transitions = TransitionList() |
121 | 124 | self.enter = Callbacks().add(enter) |
122 | 125 | self.exit = Callbacks().add(exit) |
123 | 126 | self._init_substates() |
124 | 127 |
|
125 | 128 | def _init_substates(self): |
126 | 129 | for substate in self.substates: |
127 | 130 | substate.parent = self |
| 131 | + setattr(self, substate.id, substate) |
128 | 132 |
|
129 | 133 | def __eq__(self, other): |
130 | 134 | return ( |
@@ -182,6 +186,8 @@ def _set_id(self, id): |
182 | 186 | self._storage = f"_{id}" |
183 | 187 | if self.value is None: |
184 | 188 | self.value = id |
| 189 | + if not self.name: |
| 190 | + self.name = self._id.replace("_", " ").capitalize() |
185 | 191 |
|
186 | 192 | def _to_(self, *states, **kwargs): |
187 | 193 | transitions = TransitionList( |
|
0 commit comments