1717
1818from idom .config import IDOM_DEBUG_MODE , IDOM_FEATURE_INDEX_AS_DEFAULT_KEY
1919
20- from .component import AbstractComponent
20+ from .component import ComponentType
2121from .events import EventHandler
2222from .hooks import LifeCycleHook
23- from .utils import hex_id
2423from .vdom import validate_vdom
2524
2625
@@ -67,24 +66,24 @@ class Layout:
6766 if not hasattr (abc .ABC , "__weakref__" ): # pragma: no cover
6867 __slots__ .append ("__weakref__" )
6968
70- def __init__ (self , root : "AbstractComponent " ) -> None :
69+ def __init__ (self , root : "ComponentType " ) -> None :
7170 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 )
7473 self .root = root
7574
7675 def __enter__ (self : _Self ) -> _Self :
7776 # create attributes here to avoid access before entering context manager
7877 self ._event_handlers : Dict [str , EventHandler ] = {}
7978 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 ))
8281 }
8382 self ._rendering_queue .put (self .root )
8483 return self
8584
8685 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 ]
8887 self ._unmount_model_states ([root_state ])
8988
9089 # delete attributes here to avoid access after exiting context manager
@@ -94,7 +93,7 @@ def __exit__(self, *exc: Any) -> None:
9493
9594 return None
9695
97- def update (self , component : "AbstractComponent " ) -> None :
96+ def update (self , component : "ComponentType " ) -> None :
9897 """Schedule a re-render of a component in the layout"""
9998 self ._rendering_queue .put (component )
10099 return None
@@ -121,7 +120,7 @@ async def render(self) -> LayoutUpdate:
121120 """Await the next available render. This will block until a component is updated"""
122121 while True :
123122 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 :
125124 return self ._create_layout_update (component )
126125 else :
127126 logger .info (
@@ -139,11 +138,11 @@ async def render(self) -> LayoutUpdate:
139138 async def render (self ) -> LayoutUpdate :
140139 # Ensure that the model is valid VDOM on each render
141140 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 )
143142 return result
144143
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 ]
147146 new_state = old_state .new (None , component )
148147
149148 self ._render_component (old_state , new_state , component )
@@ -160,7 +159,7 @@ def _render_component(
160159 self ,
161160 old_state : Optional [_ModelState ],
162161 new_state : _ModelState ,
163- component : AbstractComponent ,
162+ component : ComponentType ,
164163 ) -> None :
165164 life_cycle_hook = new_state .life_cycle_hook
166165 life_cycle_hook .component_will_render ()
@@ -176,8 +175,8 @@ def _render_component(
176175 new_state .model = {"tagName" : "__error__" , "children" : [str (error )]}
177176
178177 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
181180
182181 try :
183182 parent = new_state .parent
@@ -249,7 +248,7 @@ def _render_model_attributes(
249248
250249 model_event_handlers = new_state .model ["eventHandlers" ] = {}
251250 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 )
253252 new_state .targets_by_event [event ] = target
254253 self ._event_handlers [target ] = handler
255254 model_event_handlers [event ] = {
@@ -270,7 +269,7 @@ def _render_model_event_handlers_without_old_state(
270269
271270 model_event_handlers = new_state .model ["eventHandlers" ] = {}
272271 for event , handler in handlers_by_event .items ():
273- target = hex_id ( handler )
272+ target = handler . target
274273 new_state .targets_by_event [event ] = target
275274 self ._event_handlers [target ] = handler
276275 model_event_handlers [event ] = {
@@ -362,7 +361,7 @@ def _unmount_model_states(self, old_states: List[_ModelState]) -> None:
362361 if hasattr (state , "life_cycle_hook" ):
363362 hook = state .life_cycle_hook
364363 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 ]
366365 to_unmount .extend (state .children_by_key .values ())
367366
368367 def __repr__ (self ) -> str :
@@ -387,7 +386,7 @@ class _ModelState:
387386 model : _ModelVdom
388387 life_cycle_hook : LifeCycleHook
389388 patch_path : str
390- component : AbstractComponent
389+ component : ComponentType
391390
392391 def __init__ (
393392 self ,
@@ -423,7 +422,7 @@ def parent(self) -> _ModelState:
423422 def new (
424423 self ,
425424 new_parent : Optional [_ModelState ],
426- component : Optional [AbstractComponent ],
425+ component : Optional [ComponentType ],
427426 ) -> _ModelState :
428427 if new_parent is None :
429428 new_parent = getattr (self , "parent" , None )
@@ -452,19 +451,19 @@ class _ComponentQueue:
452451
453452 def __init__ (self ) -> None :
454453 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 ()
457456
458- def put (self , component : AbstractComponent ) -> None :
459- component_id = id ( component )
457+ def put (self , component : ComponentType ) -> None :
458+ component_id = component . id
460459 if component_id not in self ._pending :
461460 self ._pending .add (component_id )
462461 self ._loop .call_soon_threadsafe (self ._queue .put_nowait , component )
463462 return None
464463
465- async def get (self ) -> AbstractComponent :
464+ async def get (self ) -> ComponentType :
466465 component = await self ._queue .get ()
467- self ._pending .remove (id ( component ) )
466+ self ._pending .remove (component . id )
468467 return component
469468
470469
@@ -475,7 +474,7 @@ def _process_child_type_and_key(
475474 if isinstance (child , dict ):
476475 child_type = _DICT_TYPE
477476 key = child .get ("key" )
478- elif isinstance (child , AbstractComponent ):
477+ elif isinstance (child , ComponentType ):
479478 child_type = _COMPONENT_TYPE
480479 key = getattr (child , "key" , None )
481480 else :
0 commit comments