1
+ import dataclasses
1
2
import json
2
3
import re
3
4
@@ -179,17 +180,16 @@ def test_typed_dict_literal():
179
180
180
181
181
182
def test_typed_dict_missing ():
182
- """
183
- TODO, needs tests for each case
184
- """
185
183
s = SchemaSerializer (
186
184
core_schema .union_schema (
187
185
[
188
186
core_schema .typed_dict_schema (dict (foo = core_schema .typed_dict_field (core_schema .int_schema ()))),
189
187
core_schema .typed_dict_schema (
190
188
dict (
191
189
foo = core_schema .typed_dict_field (
192
- core_schema .int_schema (serialization = core_schema .format_ser_schema ('04d' ))
190
+ core_schema .int_schema (
191
+ serialization = core_schema .format_ser_schema ('04d' , when_used = 'always' )
192
+ )
193
193
),
194
194
bar = core_schema .typed_dict_field (core_schema .int_schema ()),
195
195
)
@@ -201,7 +201,8 @@ def test_typed_dict_missing():
201
201
assert s .to_python (dict (foo = 1 )) == {'foo' : 1 }
202
202
assert s .to_python (dict (foo = 1 ), mode = 'json' ) == {'foo' : 1 }
203
203
assert s .to_json (dict (foo = 1 )) == b'{"foo":1}'
204
- assert s .to_python (dict (foo = 1 , bar = 2 )) == {'foo' : 1 , 'bar' : 2 }
204
+
205
+ assert s .to_python (dict (foo = 1 , bar = 2 )) == {'foo' : '0001' , 'bar' : 2 }
205
206
assert s .to_python (dict (foo = 1 , bar = 2 ), mode = 'json' ) == {'foo' : '0001' , 'bar' : 2 }
206
207
assert s .to_json (dict (foo = 1 , bar = 2 )) == b'{"foo":"0001","bar":2}'
207
208
@@ -269,3 +270,93 @@ def test_typed_dict_different_fields():
269
270
assert s .to_python (dict (spam = 1 , ham = 2 )) == {'spam' : 1 , 'ham' : 2 }
270
271
assert s .to_python (dict (spam = 1 , ham = 2 ), mode = 'json' ) == {'spam' : 1 , 'ham' : '0002' }
271
272
assert s .to_json (dict (spam = 1 , ham = 2 )) == b'{"spam":1,"ham":"0002"}'
273
+
274
+
275
+ def test_dataclass_union ():
276
+ @dataclasses .dataclass
277
+ class BaseUser :
278
+ name : str
279
+
280
+ @dataclasses .dataclass
281
+ class User (BaseUser ):
282
+ surname : str
283
+
284
+ @dataclasses .dataclass
285
+ class DBUser (User ):
286
+ password_hash : str
287
+
288
+ @dataclasses .dataclass
289
+ class Item :
290
+ name : str
291
+ price : float
292
+
293
+ user_schema = core_schema .dataclass_schema (
294
+ User ,
295
+ core_schema .dataclass_args_schema (
296
+ 'User' ,
297
+ [
298
+ core_schema .dataclass_field (name = 'name' , schema = core_schema .str_schema ()),
299
+ core_schema .dataclass_field (name = 'surname' , schema = core_schema .str_schema ()),
300
+ ],
301
+ ),
302
+ ['name' , 'surname' ],
303
+ )
304
+ item_schema = core_schema .dataclass_schema (
305
+ Item ,
306
+ core_schema .dataclass_args_schema (
307
+ 'Item' ,
308
+ [
309
+ core_schema .dataclass_field (name = 'name' , schema = core_schema .str_schema ()),
310
+ core_schema .dataclass_field (name = 'price' , schema = core_schema .float_schema ()),
311
+ ],
312
+ ),
313
+ ['name' , 'price' ],
314
+ )
315
+ s = SchemaSerializer (core_schema .union_schema ([user_schema , item_schema ]))
316
+ assert s .to_python (User (name = 'foo' , surname = 'bar' )) == {'name' : 'foo' , 'surname' : 'bar' }
317
+ assert s .to_python (DBUser (name = 'foo' , surname = 'bar' , password_hash = 'x' )) == {'name' : 'foo' , 'surname' : 'bar' }
318
+ assert s .to_json (DBUser (name = 'foo' , surname = 'bar' , password_hash = 'x' )) == b'{"name":"foo","surname":"bar"}'
319
+
320
+
321
+ def test_model_union ():
322
+ class BaseUser :
323
+ def __init__ (self , name : str ):
324
+ self .name = name
325
+
326
+ class User (BaseUser ):
327
+ def __init__ (self , name : str , surname : str ):
328
+ super ().__init__ (name )
329
+ self .surname = surname
330
+
331
+ class DBUser (User ):
332
+ def __init__ (self , name : str , surname : str , password_hash : str ):
333
+ super ().__init__ (name , surname )
334
+ self .password_hash = password_hash
335
+
336
+ class Item :
337
+ def __init__ (self , name : str , price : float ):
338
+ self .name = name
339
+ self .price = price
340
+
341
+ user_schema = core_schema .model_schema (
342
+ User ,
343
+ core_schema .model_fields_schema (
344
+ {
345
+ 'name' : core_schema .model_field (schema = core_schema .str_schema ()),
346
+ 'surname' : core_schema .model_field (schema = core_schema .str_schema ()),
347
+ }
348
+ ),
349
+ )
350
+ item_schema = core_schema .model_schema (
351
+ Item ,
352
+ core_schema .model_fields_schema (
353
+ {
354
+ 'name' : core_schema .model_field (schema = core_schema .str_schema ()),
355
+ 'price' : core_schema .model_field (schema = core_schema .float_schema ()),
356
+ }
357
+ ),
358
+ )
359
+ s = SchemaSerializer (core_schema .union_schema ([user_schema , item_schema ]))
360
+ assert s .to_python (User (name = 'foo' , surname = 'bar' )) == {'name' : 'foo' , 'surname' : 'bar' }
361
+ assert s .to_python (DBUser (name = 'foo' , surname = 'bar' , password_hash = 'x' )) == {'name' : 'foo' , 'surname' : 'bar' }
362
+ assert s .to_json (DBUser (name = 'foo' , surname = 'bar' , password_hash = 'x' )) == b'{"name":"foo","surname":"bar"}'
0 commit comments