Skip to content

Commit a9d0caf

Browse files
committed
fix types for layout
1 parent 54d05df commit a9d0caf

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

idom/core/events.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,18 @@
1010
Union,
1111
)
1212

13+
from mypy_extensions import TypedDict
14+
1315

1416
EventsMapping = Union[Dict[str, Union["Callable[..., Any]", "EventHandler"]], "Events"]
1517

1618

19+
class EventTarget(TypedDict):
20+
target: str
21+
preventDefault: bool # noqa
22+
stopPropagation: bool # noqa
23+
24+
1725
def event(
1826
function: Optional[Callable[..., Any]] = None,
1927
stop_propagation: bool = False,
@@ -195,7 +203,7 @@ def remove(self, function: Callable[..., Any]) -> None:
195203
else:
196204
raise ValueError(f"{self} does not contain {function}")
197205

198-
def serialize(self) -> Dict[str, Any]:
206+
def serialize(self) -> EventTarget:
199207
"""Serialize the event handler."""
200208
return {
201209
"target": self._target_id,

idom/core/layout.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
List,
66
Dict,
77
Tuple,
8-
Mapping,
98
NamedTuple,
109
Any,
1110
Set,
@@ -19,7 +18,7 @@
1918
from jsonpatch import make_patch
2019

2120
from .element import AbstractElement
22-
from .events import EventHandler
21+
from .events import EventHandler, EventTarget
2322
from .utils import HasAsyncResources, async_resource, CannotAccessResource
2423
from .hooks import LifeCycleHook
2524

@@ -40,7 +39,7 @@ class LayoutEvent(NamedTuple):
4039

4140
class ElementState(NamedTuple):
4241
model: Dict[str, Any]
43-
path: List[int]
42+
path: str
4443
element_obj: AbstractElement
4544
event_handler_ids: Set[str]
4645
child_elements_ids: List[str]
@@ -78,7 +77,7 @@ async def dispatch(self, event: LayoutEvent) -> None:
7877
if handler is not None:
7978
await handler(event.data)
8079

81-
async def render(self) -> Dict[str, Any]:
80+
async def render(self) -> LayoutUpdate:
8281
while True:
8382
element = await self._rendering_queue.get()
8483
if element.id in self._element_states:
@@ -91,7 +90,7 @@ async def _rendering_queue(self) -> AsyncIterator["_ElementQueue"]:
9190
yield queue
9291

9392
@async_resource
94-
async def _element_states(self) -> AsyncIterator[ElementState]:
93+
async def _element_states(self) -> AsyncIterator[Dict[str, ElementState]]:
9594
root_element_state = self._create_element_state(self.root, "")
9695
try:
9796
yield {self.root.id: root_element_state}
@@ -144,19 +143,15 @@ async def _render_element(self, element_state: ElementState) -> Dict[str, Any]:
144143
return element_state.model
145144

146145
async def _render_model(
147-
self, element_state: ElementState, model: Mapping[str, Any]
146+
self, element_state: ElementState, model: Dict[str, Any]
148147
) -> Dict[str, Any]:
149-
model: Dict[str, Any] = dict(model)
150-
151-
event_handlers = self._render_model_event_handlers(element_state, model)
148+
event_handlers = self._render_model_event_targets(element_state, model)
152149
if event_handlers:
153150
model["eventHandlers"] = event_handlers
154-
155151
if "children" in model:
156152
model["children"] = await self._render_model_children(
157153
element_state, model["children"]
158154
)
159-
160155
return model
161156

162157
async def _render_model_children(
@@ -166,7 +161,7 @@ async def _render_model_children(
166161
for index, child in enumerate(
167162
children if isinstance(children, (list, tuple)) else [children]
168163
):
169-
if isinstance(child, Mapping):
164+
if isinstance(child, dict):
170165
resolved_children.append(await self._render_model(element_state, child))
171166
elif isinstance(child, AbstractElement):
172167
child_path = f"{element_state.path}/children/{index}"
@@ -178,9 +173,9 @@ async def _render_model_children(
178173
resolved_children.append(str(child))
179174
return resolved_children
180175

181-
def _render_model_event_handlers(
182-
self, element_state: ElementState, model: Mapping[str, Any]
183-
) -> Dict[str, str]:
176+
def _render_model_event_targets(
177+
self, element_state: ElementState, model: Dict[str, Any]
178+
) -> Dict[str, EventTarget]:
184179
handlers: Dict[str, EventHandler] = {}
185180
if "eventHandlers" in model:
186181
handlers.update(model["eventHandlers"])
@@ -281,9 +276,9 @@ class _ElementQueue:
281276

282277
__slots__ = "_queue", "_pending"
283278

284-
def __init__(self):
285-
self._queue = asyncio.Queue()
286-
self._pending = set()
279+
def __init__(self) -> None:
280+
self._queue: "asyncio.Queue[AbstractElement]" = asyncio.Queue()
281+
self._pending: Set[str] = set()
287282

288283
def put(self, element: AbstractElement) -> None:
289284
if element.id not in self._pending:

0 commit comments

Comments
 (0)