22import gc
33import random
44import re
5+ from collections .abc import Sequence
6+ from typing import Any
57from weakref import finalize
68from weakref import ref as weakref
79
1214from idom .config import IDOM_DEBUG_MODE
1315from idom .core .component import component
1416from idom .core .hooks import use_effect , use_state
15- from idom .core .layout import Layout , LayoutEventMessage , LayoutUpdateMessage
17+ from idom .core .layout import Layout
18+ from idom .core .types import LayoutEventMessage , LayoutUpdateMessage
1619from idom .testing import (
1720 HookCatcher ,
1821 StaticEventHandler ,
@@ -32,6 +35,14 @@ def no_logged_errors():
3235 raise record .exc_info [1 ]
3336
3437
38+ def event_message (target : str , * data : Any ) -> LayoutEventMessage :
39+ return {"type" : "layout-event" , "target" : target , "data" : data }
40+
41+
42+ def update_message (path : str , model : Any ) -> LayoutUpdateMessage :
43+ return {"type" : "layout-update" , "path" : path , "model" : model }
44+
45+
3546def test_layout_repr ():
3647 @idom .component
3748 def MyComponent ():
@@ -58,7 +69,7 @@ def Component():
5869 layout = idom .Layout (component )
5970
6071 with pytest .raises (Exception ):
61- await layout .deliver (LayoutEventMessage ("something" , [] ))
72+ await layout .deliver (event_message ("something" ))
6273
6374 with pytest .raises (Exception ):
6475 layout .update (component )
@@ -77,19 +88,17 @@ def SimpleComponent():
7788
7889 async with idom .Layout (SimpleComponent ()) as layout :
7990 update_1 = await layout .render ()
80- assert update_1 == LayoutUpdateMessage (
91+ assert update_1 == update_message (
8192 path = "" ,
82- old = None ,
83- new = {"tagName" : "" , "children" : [{"tagName" : "div" }]},
93+ model = {"tagName" : "" , "children" : [{"tagName" : "div" }]},
8494 )
8595
8696 set_state_hook .current ("table" )
8797
8898 update_2 = await layout .render ()
89- assert update_2 == LayoutUpdateMessage (
99+ assert update_2 == update_message (
90100 path = "" ,
91- old = update_1 .new ,
92- new = {"tagName" : "" , "children" : [{"tagName" : "table" }]},
101+ model = {"tagName" : "" , "children" : [{"tagName" : "table" }]},
93102 )
94103
95104
@@ -99,7 +108,7 @@ def SomeComponent():
99108 return None
100109
101110 async with idom .Layout (SomeComponent ()) as layout :
102- assert (await layout .render ()). new == {"tagName" : "" }
111+ assert (await layout .render ())[ "model" ] == {"tagName" : "" }
103112
104113
105114async def test_nested_component_layout ():
@@ -135,28 +144,25 @@ def make_child_model(state):
135144
136145 async with idom .Layout (Parent ()) as layout :
137146 update_1 = await layout .render ()
138- assert update_1 == LayoutUpdateMessage (
147+ assert update_1 == update_message (
139148 path = "" ,
140- old = None ,
141- new = make_parent_model (0 , make_child_model (0 )),
149+ model = make_parent_model (0 , make_child_model (0 )),
142150 )
143151
144152 parent_set_state .current (1 )
145153
146154 update_2 = await layout .render ()
147- assert update_2 == LayoutUpdateMessage (
155+ assert update_2 == update_message (
148156 path = "" ,
149- old = update_1 .new ,
150- new = make_parent_model (1 , make_child_model (0 )),
157+ model = make_parent_model (1 , make_child_model (0 )),
151158 )
152159
153160 child_set_state .current (1 )
154161
155162 update_3 = await layout .render ()
156- assert update_3 == LayoutUpdateMessage (
163+ assert update_3 == update_message (
157164 path = "/children/0/children/1" ,
158- old = update_2 .new ["children" ][0 ]["children" ][1 ],
159- new = make_child_model (1 ),
165+ model = make_child_model (1 ),
160166 )
161167
162168
@@ -180,10 +186,9 @@ def BadChild():
180186 with assert_idom_did_log (match_error = "error from bad child" ):
181187
182188 async with idom .Layout (Main ()) as layout :
183- assert (await layout .render ()) == LayoutUpdateMessage (
189+ assert (await layout .render ()) == update_message (
184190 path = "" ,
185- old = None ,
186- new = {
191+ model = {
187192 "tagName" : "" ,
188193 "children" : [
189194 {
@@ -232,10 +237,9 @@ def BadChild():
232237 with assert_idom_did_log (match_error = "error from bad child" ):
233238
234239 async with idom .Layout (Main ()) as layout :
235- assert (await layout .render ()) == LayoutUpdateMessage (
240+ assert (await layout .render ()) == update_message (
236241 path = "" ,
237- old = None ,
238- new = {
242+ model = {
239243 "tagName" : "" ,
240244 "children" : [
241245 {
@@ -271,10 +275,9 @@ def Child():
271275 return {"tagName" : "div" , "children" : {"tagName" : "h1" }}
272276
273277 async with idom .Layout (Main ()) as layout :
274- assert (await layout .render ()) == LayoutUpdateMessage (
278+ assert (await layout .render ()) == update_message (
275279 path = "" ,
276- old = None ,
277- new = {
280+ model = {
278281 "tagName" : "" ,
279282 "children" : [
280283 {
@@ -478,7 +481,7 @@ def Child():
478481 hook .latest .schedule_render ()
479482
480483 update = await layout .render ()
481- assert update . path == "/children/0/children/0/children/0"
484+ assert update [ " path" ] == "/children/0/children/0/children/0"
482485
483486
484487async def test_log_on_dispatch_to_missing_event_handler (caplog ):
@@ -487,7 +490,7 @@ def SomeComponent():
487490 return idom .html .div ()
488491
489492 async with idom .Layout (SomeComponent ()) as layout :
490- await layout .deliver (LayoutEventMessage ( target = "missing" , data = [] ))
493+ await layout .deliver (event_message ( "missing" ))
491494
492495 assert re .match (
493496 "Ignored event - handler 'missing' does not exist or its component unmounted" ,
@@ -528,7 +531,7 @@ def bad_trigger():
528531 async with idom .Layout (MyComponent ()) as layout :
529532 await layout .render ()
530533 for i in range (3 ):
531- event = LayoutEventMessage (good_handler .target , [] )
534+ event = event_message (good_handler .target )
532535 await layout .deliver (event )
533536
534537 assert called_good_trigger .current
@@ -579,7 +582,7 @@ def callback():
579582 async with idom .Layout (RootComponent ()) as layout :
580583 await layout .render ()
581584 for _ in range (3 ):
582- event = LayoutEventMessage (good_handler .target , [] )
585+ event = event_message (good_handler .target )
583586 await layout .deliver (event )
584587
585588 assert called_good_trigger .current
@@ -599,10 +602,9 @@ def Inner():
599602 return idom .html .div ("hello" )
600603
601604 async with idom .Layout (Outer ()) as layout :
602- assert (await layout .render ()) == LayoutUpdateMessage (
605+ assert (await layout .render ()) == update_message (
603606 path = "" ,
604- old = None ,
605- new = {
607+ model = {
606608 "tagName" : "" ,
607609 "children" : [
608610 {
@@ -767,7 +769,7 @@ def raise_error():
767769
768770 async with idom .Layout (ComponentWithBadEventHandler ()) as layout :
769771 await layout .render ()
770- event = LayoutEventMessage (bad_handler .target , [] )
772+ event = event_message (bad_handler .target )
771773 await layout .deliver (event )
772774
773775
@@ -1038,7 +1040,7 @@ async def record_if_state_is_reset():
10381040 did_call_effect .clear ()
10391041
10401042 for i in range (1 , 5 ):
1041- await layout .deliver (LayoutEventMessage (set_child_key_num .target , [] ))
1043+ await layout .deliver (event_message (set_child_key_num .target ))
10421044 await layout .render ()
10431045 assert effect_calls_without_state == {"some-key" , "key-0" }
10441046 did_call_effect .clear ()
@@ -1086,13 +1088,13 @@ def Root():
10861088
10871089 async with Layout (Root ()) as layout :
10881090 await layout .render ()
1089- await layout .deliver (LayoutEventMessage (event_handler .target , [] ))
1091+ await layout .deliver (event_message (event_handler .target ))
10901092 assert did_trigger .current
10911093 did_trigger .current = False
10921094
10931095 set_event_name .current ("second" )
10941096 await layout .render ()
1095- await layout .deliver (LayoutEventMessage (event_handler .target , [] ))
1097+ await layout .deliver (event_message (event_handler .target ))
10961098 assert did_trigger .current
10971099 did_trigger .current = False
10981100
@@ -1144,7 +1146,7 @@ def Child():
11441146
11451147 async with idom .Layout (Parent ()) as layout :
11461148 update = await layout .render ()
1147- assert update . new == {
1149+ assert update [ "model" ] == {
11481150 "tagName" : "" ,
11491151 "children" : [
11501152 {
0 commit comments