17
17
18
18
from idom .config import IDOM_DEBUG_MODE , IDOM_FEATURE_INDEX_AS_DEFAULT_KEY
19
19
20
- from .component import AbstractComponent
20
+ from .component import ComponentType
21
21
from .events import EventHandler
22
22
from .hooks import LifeCycleHook
23
- from .utils import hex_id
24
23
from .vdom import validate_vdom
25
24
26
25
@@ -67,24 +66,24 @@ class Layout:
67
66
if not hasattr (abc .ABC , "__weakref__" ): # pragma: no cover
68
67
__slots__ .append ("__weakref__" )
69
68
70
- def __init__ (self , root : "AbstractComponent " ) -> None :
69
+ def __init__ (self , root : "ComponentType " ) -> None :
71
70
super ().__init__ ()
72
- if not isinstance (root , AbstractComponent ):
73
- raise TypeError ("Expected an AbstractComponent , not %r" % root )
71
+ if not isinstance (root , ComponentType ):
72
+ raise TypeError ("Expected an ComponentType , not %r" % root )
74
73
self .root = root
75
74
76
75
def __enter__ (self : _Self ) -> _Self :
77
76
# create attributes here to avoid access before entering context manager
78
77
self ._event_handlers : Dict [str , EventHandler ] = {}
79
78
self ._rendering_queue = _ComponentQueue ()
80
- self ._model_state_by_component_id : Dict [int , _ModelState ] = {
81
- id ( self .root ) : _ModelState (None , - 1 , "" , LifeCycleHook (self , self .root ))
79
+ self ._model_state_by_component_id : Dict [str , _ModelState ] = {
80
+ self .root . id : _ModelState (None , - 1 , "" , LifeCycleHook (self , self .root ))
82
81
}
83
82
self ._rendering_queue .put (self .root )
84
83
return self
85
84
86
85
def __exit__ (self , * exc : Any ) -> None :
87
- root_state = self ._model_state_by_component_id [id ( self .root ) ]
86
+ root_state = self ._model_state_by_component_id [self .root . id ]
88
87
self ._unmount_model_states ([root_state ])
89
88
90
89
# delete attributes here to avoid access after exiting context manager
@@ -94,7 +93,7 @@ def __exit__(self, *exc: Any) -> None:
94
93
95
94
return None
96
95
97
- def update (self , component : "AbstractComponent " ) -> None :
96
+ def update (self , component : "ComponentType " ) -> None :
98
97
"""Schedule a re-render of a component in the layout"""
99
98
self ._rendering_queue .put (component )
100
99
return None
@@ -121,7 +120,7 @@ async def render(self) -> LayoutUpdate:
121
120
"""Await the next available render. This will block until a component is updated"""
122
121
while True :
123
122
component = await self ._rendering_queue .get ()
124
- if id ( component ) in self ._model_state_by_component_id :
123
+ if component . id in self ._model_state_by_component_id :
125
124
return self ._create_layout_update (component )
126
125
else :
127
126
logger .info (
@@ -139,11 +138,11 @@ async def render(self) -> LayoutUpdate:
139
138
async def render (self ) -> LayoutUpdate :
140
139
# Ensure that the model is valid VDOM on each render
141
140
result = await self ._debug_render ()
142
- validate_vdom (self ._model_state_by_component_id [id ( self .root ) ].model )
141
+ validate_vdom (self ._model_state_by_component_id [self .root . id ].model )
143
142
return result
144
143
145
- def _create_layout_update (self , component : AbstractComponent ) -> LayoutUpdate :
146
- old_state = self ._model_state_by_component_id [id ( component ) ]
144
+ def _create_layout_update (self , component : ComponentType ) -> LayoutUpdate :
145
+ old_state = self ._model_state_by_component_id [component . id ]
147
146
new_state = old_state .new (None , component )
148
147
149
148
self ._render_component (old_state , new_state , component )
@@ -160,7 +159,7 @@ def _render_component(
160
159
self ,
161
160
old_state : Optional [_ModelState ],
162
161
new_state : _ModelState ,
163
- component : AbstractComponent ,
162
+ component : ComponentType ,
164
163
) -> None :
165
164
life_cycle_hook = new_state .life_cycle_hook
166
165
life_cycle_hook .component_will_render ()
@@ -176,8 +175,8 @@ def _render_component(
176
175
new_state .model = {"tagName" : "__error__" , "children" : [str (error )]}
177
176
178
177
if old_state is not None and old_state .component is not component :
179
- del self ._model_state_by_component_id [id ( old_state .component ) ]
180
- self ._model_state_by_component_id [id ( component ) ] = new_state
178
+ del self ._model_state_by_component_id [old_state .component . id ]
179
+ self ._model_state_by_component_id [component . id ] = new_state
181
180
182
181
try :
183
182
parent = new_state .parent
@@ -249,7 +248,7 @@ def _render_model_attributes(
249
248
250
249
model_event_handlers = new_state .model ["eventHandlers" ] = {}
251
250
for event , handler in handlers_by_event .items ():
252
- target = old_state .targets_by_event .get (event , hex_id ( handler ) )
251
+ target = old_state .targets_by_event .get (event , handler . target )
253
252
new_state .targets_by_event [event ] = target
254
253
self ._event_handlers [target ] = handler
255
254
model_event_handlers [event ] = {
@@ -270,7 +269,7 @@ def _render_model_event_handlers_without_old_state(
270
269
271
270
model_event_handlers = new_state .model ["eventHandlers" ] = {}
272
271
for event , handler in handlers_by_event .items ():
273
- target = hex_id ( handler )
272
+ target = handler . target
274
273
new_state .targets_by_event [event ] = target
275
274
self ._event_handlers [target ] = handler
276
275
model_event_handlers [event ] = {
@@ -362,7 +361,7 @@ def _unmount_model_states(self, old_states: List[_ModelState]) -> None:
362
361
if hasattr (state , "life_cycle_hook" ):
363
362
hook = state .life_cycle_hook
364
363
hook .component_will_unmount ()
365
- del self ._model_state_by_component_id [id ( hook .component ) ]
364
+ del self ._model_state_by_component_id [hook .component . id ]
366
365
to_unmount .extend (state .children_by_key .values ())
367
366
368
367
def __repr__ (self ) -> str :
@@ -387,7 +386,7 @@ class _ModelState:
387
386
model : _ModelVdom
388
387
life_cycle_hook : LifeCycleHook
389
388
patch_path : str
390
- component : AbstractComponent
389
+ component : ComponentType
391
390
392
391
def __init__ (
393
392
self ,
@@ -423,7 +422,7 @@ def parent(self) -> _ModelState:
423
422
def new (
424
423
self ,
425
424
new_parent : Optional [_ModelState ],
426
- component : Optional [AbstractComponent ],
425
+ component : Optional [ComponentType ],
427
426
) -> _ModelState :
428
427
if new_parent is None :
429
428
new_parent = getattr (self , "parent" , None )
@@ -452,19 +451,19 @@ class _ComponentQueue:
452
451
453
452
def __init__ (self ) -> None :
454
453
self ._loop = asyncio .get_event_loop ()
455
- self ._queue : "asyncio.Queue[AbstractComponent ]" = asyncio .Queue ()
456
- self ._pending : Set [int ] = set ()
454
+ self ._queue : "asyncio.Queue[ComponentType ]" = asyncio .Queue ()
455
+ self ._pending : Set [str ] = set ()
457
456
458
- def put (self , component : AbstractComponent ) -> None :
459
- component_id = id ( component )
457
+ def put (self , component : ComponentType ) -> None :
458
+ component_id = component . id
460
459
if component_id not in self ._pending :
461
460
self ._pending .add (component_id )
462
461
self ._loop .call_soon_threadsafe (self ._queue .put_nowait , component )
463
462
return None
464
463
465
- async def get (self ) -> AbstractComponent :
464
+ async def get (self ) -> ComponentType :
466
465
component = await self ._queue .get ()
467
- self ._pending .remove (id ( component ) )
466
+ self ._pending .remove (component . id )
468
467
return component
469
468
470
469
@@ -475,7 +474,7 @@ def _process_child_type_and_key(
475
474
if isinstance (child , dict ):
476
475
child_type = _DICT_TYPE
477
476
key = child .get ("key" )
478
- elif isinstance (child , AbstractComponent ):
477
+ elif isinstance (child , ComponentType ):
479
478
child_type = _COMPONENT_TYPE
480
479
key = getattr (child , "key" , None )
481
480
else :
0 commit comments