@@ -33,6 +33,14 @@ class NestedStruct:
3333 orders : list [Order ]
3434 count : int = 0
3535
36+ def build_converter (py_type , target_type = None ):
37+ """
38+ Helper to build a converter for the given Python type.
39+ If target_type is not specified, uses py_type as the target.
40+ """
41+ engine_type = encode_enriched_type (py_type )["type" ]
42+ return make_engine_value_converter ([], engine_type , target_type or py_type )
43+
3644def test_to_engine_value_basic_types ():
3745 assert to_engine_value (123 ) == 123
3846 assert to_engine_value (3.14 ) == 3.14
@@ -89,13 +97,11 @@ def test_make_engine_value_converter_basic_types():
8997 (bool , True ),
9098 # (type(None), None), # Removed unsupported NoneType
9199 ]:
92- engine_type = encode_enriched_type (py_type )["type" ]
93- converter = make_engine_value_converter ([], engine_type , py_type )
100+ converter = build_converter (py_type )
94101 assert converter (value ) == value
95102
96103def test_make_engine_value_converter_struct ():
97- engine_type = encode_enriched_type (Order )["type" ]
98- converter = make_engine_value_converter ([], engine_type , Order )
104+ converter = build_converter (Order )
99105 # All fields match
100106 engine_val = ["O123" , "mixed nuts" , 25.0 , "default_extra" ]
101107 assert converter (engine_val ) == Order ("O123" , "mixed nuts" , 25.0 , "default_extra" )
@@ -115,29 +121,25 @@ def test_make_engine_value_converter_struct():
115121def test_make_engine_value_converter_struct_field_order ():
116122 # Engine fields in different order
117123 # Use encode_enriched_type to avoid manual mistakes
118- engine_type = encode_enriched_type (Order )["type" ]
119- converter = make_engine_value_converter ([], engine_type , Order )
124+ converter = build_converter (Order )
120125 # Provide all fields in the correct order
121126 engine_val = ["O123" , "mixed nuts" , 25.0 , "default_extra" ]
122127 assert converter (engine_val ) == Order ("O123" , "mixed nuts" , 25.0 , "default_extra" )
123128
124129def test_make_engine_value_converter_collections ():
125130 # List of structs
126- engine_type = encode_enriched_type (list [Order ])["type" ]
127- converter = make_engine_value_converter ([], engine_type , list [Order ])
131+ converter = build_converter (list [Order ])
128132 engine_val = [
129133 ["O1" , "item1" , 10.0 , "default_extra" ],
130134 ["O2" , "item2" , 20.0 , "default_extra" ]
131135 ]
132136 assert converter (engine_val ) == [Order ("O1" , "item1" , 10.0 , "default_extra" ), Order ("O2" , "item2" , 20.0 , "default_extra" )]
133137 # Struct with list field
134- engine_type = encode_enriched_type (Customer )["type" ]
135- converter = make_engine_value_converter ([], engine_type , Customer )
138+ converter = build_converter (Customer )
136139 engine_val = ["Alice" , ["O1" , "item1" , 10.0 , "default_extra" ], [["vip" ], ["premium" ]]]
137140 assert converter (engine_val ) == Customer ("Alice" , Order ("O1" , "item1" , 10.0 , "default_extra" ), [Tag ("vip" ), Tag ("premium" )])
138141 # Struct with struct field
139- engine_type = encode_enriched_type (NestedStruct )["type" ]
140- converter = make_engine_value_converter ([], engine_type , NestedStruct )
142+ converter = build_converter (NestedStruct )
141143 engine_val = [
142144 ["Alice" , ["O1" , "item1" , 10.0 , "default_extra" ], [["vip" ]]],
143145 [["O1" , "item1" , 10.0 , "default_extra" ], ["O2" , "item2" , 20.0 , "default_extra" ]],
@@ -151,8 +153,7 @@ def test_make_engine_value_converter_collections():
151153
152154def test_make_engine_value_converter_defaults_and_missing_fields ():
153155 # Missing optional field in engine value
154- engine_type = encode_enriched_type (Customer )["type" ]
155- converter = make_engine_value_converter ([], engine_type , Customer )
156+ converter = build_converter (Customer )
156157 engine_val = ["Alice" , ["O1" , "item1" , 10.0 , "default_extra" ], None ] # tags explicitly None
157158 assert converter (engine_val ) == Customer ("Alice" , Order ("O1" , "item1" , 10.0 , "default_extra" ), None )
158159 # Extra field in engine value (should ignore)
0 commit comments