2
2
import gc
3
3
import random
4
4
import re
5
+ from collections .abc import Sequence
6
+ from typing import Any
5
7
from weakref import finalize
6
8
from weakref import ref as weakref
7
9
12
14
from idom .config import IDOM_DEBUG_MODE
13
15
from idom .core .component import component
14
16
from 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
16
19
from idom .testing import (
17
20
HookCatcher ,
18
21
StaticEventHandler ,
@@ -32,6 +35,14 @@ def no_logged_errors():
32
35
raise record .exc_info [1 ]
33
36
34
37
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
+
35
46
def test_layout_repr ():
36
47
@idom .component
37
48
def MyComponent ():
@@ -58,7 +69,7 @@ def Component():
58
69
layout = idom .Layout (component )
59
70
60
71
with pytest .raises (Exception ):
61
- await layout .deliver (LayoutEventMessage ("something" , [] ))
72
+ await layout .deliver (event_message ("something" ))
62
73
63
74
with pytest .raises (Exception ):
64
75
layout .update (component )
@@ -77,19 +88,17 @@ def SimpleComponent():
77
88
78
89
async with idom .Layout (SimpleComponent ()) as layout :
79
90
update_1 = await layout .render ()
80
- assert update_1 == LayoutUpdateMessage (
91
+ assert update_1 == update_message (
81
92
path = "" ,
82
- old = None ,
83
- new = {"tagName" : "" , "children" : [{"tagName" : "div" }]},
93
+ model = {"tagName" : "" , "children" : [{"tagName" : "div" }]},
84
94
)
85
95
86
96
set_state_hook .current ("table" )
87
97
88
98
update_2 = await layout .render ()
89
- assert update_2 == LayoutUpdateMessage (
99
+ assert update_2 == update_message (
90
100
path = "" ,
91
- old = update_1 .new ,
92
- new = {"tagName" : "" , "children" : [{"tagName" : "table" }]},
101
+ model = {"tagName" : "" , "children" : [{"tagName" : "table" }]},
93
102
)
94
103
95
104
@@ -99,7 +108,7 @@ def SomeComponent():
99
108
return None
100
109
101
110
async with idom .Layout (SomeComponent ()) as layout :
102
- assert (await layout .render ()). new == {"tagName" : "" }
111
+ assert (await layout .render ())[ "model" ] == {"tagName" : "" }
103
112
104
113
105
114
async def test_nested_component_layout ():
@@ -135,28 +144,25 @@ def make_child_model(state):
135
144
136
145
async with idom .Layout (Parent ()) as layout :
137
146
update_1 = await layout .render ()
138
- assert update_1 == LayoutUpdateMessage (
147
+ assert update_1 == update_message (
139
148
path = "" ,
140
- old = None ,
141
- new = make_parent_model (0 , make_child_model (0 )),
149
+ model = make_parent_model (0 , make_child_model (0 )),
142
150
)
143
151
144
152
parent_set_state .current (1 )
145
153
146
154
update_2 = await layout .render ()
147
- assert update_2 == LayoutUpdateMessage (
155
+ assert update_2 == update_message (
148
156
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 )),
151
158
)
152
159
153
160
child_set_state .current (1 )
154
161
155
162
update_3 = await layout .render ()
156
- assert update_3 == LayoutUpdateMessage (
163
+ assert update_3 == update_message (
157
164
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 ),
160
166
)
161
167
162
168
@@ -180,10 +186,9 @@ def BadChild():
180
186
with assert_idom_did_log (match_error = "error from bad child" ):
181
187
182
188
async with idom .Layout (Main ()) as layout :
183
- assert (await layout .render ()) == LayoutUpdateMessage (
189
+ assert (await layout .render ()) == update_message (
184
190
path = "" ,
185
- old = None ,
186
- new = {
191
+ model = {
187
192
"tagName" : "" ,
188
193
"children" : [
189
194
{
@@ -232,10 +237,9 @@ def BadChild():
232
237
with assert_idom_did_log (match_error = "error from bad child" ):
233
238
234
239
async with idom .Layout (Main ()) as layout :
235
- assert (await layout .render ()) == LayoutUpdateMessage (
240
+ assert (await layout .render ()) == update_message (
236
241
path = "" ,
237
- old = None ,
238
- new = {
242
+ model = {
239
243
"tagName" : "" ,
240
244
"children" : [
241
245
{
@@ -271,10 +275,9 @@ def Child():
271
275
return {"tagName" : "div" , "children" : {"tagName" : "h1" }}
272
276
273
277
async with idom .Layout (Main ()) as layout :
274
- assert (await layout .render ()) == LayoutUpdateMessage (
278
+ assert (await layout .render ()) == update_message (
275
279
path = "" ,
276
- old = None ,
277
- new = {
280
+ model = {
278
281
"tagName" : "" ,
279
282
"children" : [
280
283
{
@@ -478,7 +481,7 @@ def Child():
478
481
hook .latest .schedule_render ()
479
482
480
483
update = await layout .render ()
481
- assert update . path == "/children/0/children/0/children/0"
484
+ assert update [ " path" ] == "/children/0/children/0/children/0"
482
485
483
486
484
487
async def test_log_on_dispatch_to_missing_event_handler (caplog ):
@@ -487,7 +490,7 @@ def SomeComponent():
487
490
return idom .html .div ()
488
491
489
492
async with idom .Layout (SomeComponent ()) as layout :
490
- await layout .deliver (LayoutEventMessage ( target = "missing" , data = [] ))
493
+ await layout .deliver (event_message ( "missing" ))
491
494
492
495
assert re .match (
493
496
"Ignored event - handler 'missing' does not exist or its component unmounted" ,
@@ -528,7 +531,7 @@ def bad_trigger():
528
531
async with idom .Layout (MyComponent ()) as layout :
529
532
await layout .render ()
530
533
for i in range (3 ):
531
- event = LayoutEventMessage (good_handler .target , [] )
534
+ event = event_message (good_handler .target )
532
535
await layout .deliver (event )
533
536
534
537
assert called_good_trigger .current
@@ -579,7 +582,7 @@ def callback():
579
582
async with idom .Layout (RootComponent ()) as layout :
580
583
await layout .render ()
581
584
for _ in range (3 ):
582
- event = LayoutEventMessage (good_handler .target , [] )
585
+ event = event_message (good_handler .target )
583
586
await layout .deliver (event )
584
587
585
588
assert called_good_trigger .current
@@ -599,10 +602,9 @@ def Inner():
599
602
return idom .html .div ("hello" )
600
603
601
604
async with idom .Layout (Outer ()) as layout :
602
- assert (await layout .render ()) == LayoutUpdateMessage (
605
+ assert (await layout .render ()) == update_message (
603
606
path = "" ,
604
- old = None ,
605
- new = {
607
+ model = {
606
608
"tagName" : "" ,
607
609
"children" : [
608
610
{
@@ -767,7 +769,7 @@ def raise_error():
767
769
768
770
async with idom .Layout (ComponentWithBadEventHandler ()) as layout :
769
771
await layout .render ()
770
- event = LayoutEventMessage (bad_handler .target , [] )
772
+ event = event_message (bad_handler .target )
771
773
await layout .deliver (event )
772
774
773
775
@@ -1038,7 +1040,7 @@ async def record_if_state_is_reset():
1038
1040
did_call_effect .clear ()
1039
1041
1040
1042
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 ))
1042
1044
await layout .render ()
1043
1045
assert effect_calls_without_state == {"some-key" , "key-0" }
1044
1046
did_call_effect .clear ()
@@ -1086,13 +1088,13 @@ def Root():
1086
1088
1087
1089
async with Layout (Root ()) as layout :
1088
1090
await layout .render ()
1089
- await layout .deliver (LayoutEventMessage (event_handler .target , [] ))
1091
+ await layout .deliver (event_message (event_handler .target ))
1090
1092
assert did_trigger .current
1091
1093
did_trigger .current = False
1092
1094
1093
1095
set_event_name .current ("second" )
1094
1096
await layout .render ()
1095
- await layout .deliver (LayoutEventMessage (event_handler .target , [] ))
1097
+ await layout .deliver (event_message (event_handler .target ))
1096
1098
assert did_trigger .current
1097
1099
did_trigger .current = False
1098
1100
@@ -1144,7 +1146,7 @@ def Child():
1144
1146
1145
1147
async with idom .Layout (Parent ()) as layout :
1146
1148
update = await layout .render ()
1147
- assert update . new == {
1149
+ assert update [ "model" ] == {
1148
1150
"tagName" : "" ,
1149
1151
"children" : [
1150
1152
{
0 commit comments