26
26
)
27
27
28
28
from cattrs ._compat import (
29
+ AbstractSet ,
29
30
Counter ,
30
31
FrozenSet ,
32
+ FrozenSetSubscriptable ,
31
33
Mapping ,
32
34
MutableMapping ,
33
35
MutableSequence ,
@@ -173,6 +175,15 @@ def test_stdlib_json_converter(everything: Everything):
173
175
assert converter .loads (converter .dumps (everything ), Everything ) == everything
174
176
175
177
178
+ @given (everythings ())
179
+ def test_stdlib_json_converter_unstruct_collection_overrides (everything : Everything ):
180
+ converter = json_make_converter (unstruct_collection_overrides = {AbstractSet : sorted })
181
+ raw = converter .unstructure (everything )
182
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
183
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
184
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
185
+
186
+
176
187
@given (
177
188
everythings (
178
189
min_int = - 9223372036854775808 , max_int = 9223372036854775807 , allow_inf = False
@@ -198,6 +209,21 @@ def test_ujson_converter(everything: Everything):
198
209
assert converter .loads (raw , Everything ) == everything
199
210
200
211
212
+ @given (
213
+ everythings (
214
+ min_int = - 9223372036854775808 , max_int = 9223372036854775807 , allow_inf = False
215
+ )
216
+ )
217
+ def test_ujson_converter_unstruct_collection_overrides (everything : Everything ):
218
+ converter = ujson_make_converter (
219
+ unstruct_collection_overrides = {AbstractSet : sorted }
220
+ )
221
+ raw = converter .unstructure (everything )
222
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
223
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
224
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
225
+
226
+
201
227
@pytest .mark .skipif (python_implementation () == "PyPy" , reason = "no orjson on PyPy" )
202
228
@given (
203
229
everythings (
@@ -231,6 +257,24 @@ def test_orjson_converter(everything: Everything, detailed_validation: bool):
231
257
assert converter .loads (raw , Everything ) == everything
232
258
233
259
260
+ @pytest .mark .skipif (python_implementation () == "PyPy" , reason = "no orjson on PyPy" )
261
+ @given (
262
+ everythings (
263
+ min_int = - 9223372036854775808 , max_int = 9223372036854775807 , allow_inf = False
264
+ )
265
+ )
266
+ def test_orjson_converter_unstruct_collection_overrides (everything : Everything ):
267
+ from cattrs .preconf .orjson import make_converter as orjson_make_converter
268
+
269
+ converter = orjson_make_converter (
270
+ unstruct_collection_overrides = {AbstractSet : sorted }
271
+ )
272
+ raw = converter .unstructure (everything )
273
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
274
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
275
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
276
+
277
+
234
278
@given (everythings (min_int = - 9223372036854775808 , max_int = 18446744073709551615 ))
235
279
def test_msgpack (everything : Everything ):
236
280
from msgpack import dumps as msgpack_dumps
@@ -251,6 +295,17 @@ def test_msgpack_converter(everything: Everything):
251
295
assert converter .loads (raw , Everything , strict_map_key = False ) == everything
252
296
253
297
298
+ @given (everythings (min_int = - 9223372036854775808 , max_int = 18446744073709551615 ))
299
+ def test_msgpack_converter (everything : Everything ):
300
+ converter = msgpack_make_converter (
301
+ unstruct_collection_overrides = {AbstractSet : sorted }
302
+ )
303
+ raw = converter .unstructure (everything )
304
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
305
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
306
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
307
+
308
+
254
309
@given (
255
310
everythings (
256
311
min_int = - 9223372036854775808 ,
@@ -294,6 +349,22 @@ def test_bson_converter(everything: Everything, detailed_validation: bool):
294
349
)
295
350
296
351
352
+ @given (
353
+ everythings (
354
+ min_int = - 9223372036854775808 ,
355
+ max_int = 9223372036854775807 ,
356
+ allow_null_bytes_in_keys = False ,
357
+ allow_datetime_microseconds = False ,
358
+ )
359
+ )
360
+ def test_bson_converter_unstruct_collection_overrides (everything : Everything ):
361
+ converter = bson_make_converter (unstruct_collection_overrides = {AbstractSet : sorted })
362
+ raw = converter .unstructure (everything )
363
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
364
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
365
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
366
+
367
+
297
368
@given (everythings ())
298
369
def test_pyyaml (everything : Everything ):
299
370
from yaml import safe_dump , safe_load
@@ -311,6 +382,15 @@ def test_pyyaml_converter(everything: Everything):
311
382
assert converter .loads (raw , Everything ) == everything
312
383
313
384
385
+ @given (everythings ())
386
+ def test_pyyaml_converter_unstruct_collection_overrides (everything : Everything ):
387
+ converter = pyyaml_make_converter (
388
+ unstruct_collection_overrides = {FrozenSetSubscriptable : sorted }
389
+ )
390
+ raw = converter .unstructure (everything )
391
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
392
+
393
+
314
394
@given (
315
395
everythings (
316
396
min_key_length = 1 ,
@@ -345,6 +425,24 @@ def test_tomlkit_converter(everything: Everything, detailed_validation: bool):
345
425
assert converter .loads (raw , Everything ) == everything
346
426
347
427
428
+ @given (
429
+ everythings (
430
+ min_key_length = 1 ,
431
+ allow_null_bytes_in_keys = False ,
432
+ key_blacklist_characters = ['"' , "\\ " ],
433
+ allow_control_characters_in_values = False ,
434
+ )
435
+ )
436
+ def test_tomlkit_converter_unstruct_collection_overrides (everything : Everything ):
437
+ converter = tomlkit_make_converter (
438
+ unstruct_collection_overrides = {AbstractSet : sorted }
439
+ )
440
+ raw = converter .unstructure (everything )
441
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
442
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
443
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
444
+
445
+
348
446
def test_bson_objectid ():
349
447
"""BSON ObjectIds are supported by default."""
350
448
converter = bson_make_converter ()
@@ -368,3 +466,14 @@ def test_cbor2_converter(everything: Everything):
368
466
converter = cbor2_make_converter ()
369
467
raw = converter .dumps (everything )
370
468
assert converter .loads (raw , Everything ) == everything
469
+
470
+
471
+ @given (everythings (min_int = - 9223372036854775808 , max_int = 18446744073709551615 ))
472
+ def test_cbor2_converter_unstruct_collection_overrides (everything : Everything ):
473
+ converter = cbor2_make_converter (
474
+ unstruct_collection_overrides = {AbstractSet : sorted }
475
+ )
476
+ raw = converter .unstructure (everything )
477
+ assert raw ["a_set" ] == sorted (raw ["a_set" ])
478
+ assert raw ["a_mutable_set" ] == sorted (raw ["a_mutable_set" ])
479
+ assert raw ["a_frozenset" ] == sorted (raw ["a_frozenset" ])
0 commit comments