File tree Expand file tree Collapse file tree 2 files changed +39
-5
lines changed Expand file tree Collapse file tree 2 files changed +39
-5
lines changed Original file line number Diff line number Diff line change @@ -213,10 +213,7 @@ def field_for_schema(
213
213
if default is not marshmallow .missing :
214
214
desert_metadata .setdefault ("default" , default )
215
215
desert_metadata .setdefault ("allow_none" , True )
216
- if not desert_metadata .get (
217
- "required"
218
- ): # 'missing' must not be set for required fields.
219
- desert_metadata .setdefault ("missing" , default )
216
+ desert_metadata .setdefault ("missing" , default )
220
217
221
218
field = None
222
219
@@ -256,7 +253,7 @@ def field_for_schema(
256
253
values = field_for_schema (arguments [1 ]),
257
254
)
258
255
elif typing_inspect .is_optional_type (typ ):
259
- subtyp = next (t for t in arguments if t is not NoneType )
256
+ [ subtyp ] = (t for t in arguments if t is not NoneType )
260
257
# Treat optional types as types with a None default
261
258
metadata [_DESERT_SENTINEL ]["default" ] = metadata .get ("default" , None )
262
259
metadata [_DESERT_SENTINEL ]["missing" ] = metadata .get ("missing" , None )
Original file line number Diff line number Diff line change 1
1
import dataclasses
2
2
import datetime
3
+ import decimal
3
4
import enum
5
+ import re
4
6
import sys
5
7
import types
6
8
import typing as t
7
9
8
10
import attr
9
11
import marshmallow
12
+ import marshmallow .fields
10
13
import pytest
11
14
12
15
import desert
@@ -282,6 +285,40 @@ class A:
282
285
assert attr .fields (A ).x .metadata ["foo" ] == 1
283
286
284
287
288
+ def test_non_init (module ):
289
+ """Non-init attributes are not included in schema"""
290
+
291
+ @module .dataclass
292
+ class A :
293
+ x : int
294
+ y : str = module .field (default = "can't init this" , init = False )
295
+
296
+ schema = desert .schema_class (A )()
297
+
298
+ assert "y" not in schema .fields
299
+
300
+
301
+ def test_metadata_marshmallow_field_loads (module ):
302
+ """Marshmallow field can be specified via metadata dict"""
303
+
304
+ @module .dataclass
305
+ class A :
306
+ x : decimal .Decimal = module .field (
307
+ metadata = {"marshmallow_field" : marshmallow .fields .Decimal (as_string = True )}
308
+ )
309
+
310
+ schema = desert .schema_class (A )()
311
+
312
+ assert schema .loads ('{"x": "1.3"}' ) == A (decimal .Decimal ("1.3" ))
313
+
314
+
315
+ def test_get_field_default_raises_for_non_field ():
316
+ """Not attrs and not dataclasses field raises"""
317
+
318
+ with pytest .raises (TypeError , match = re .escape ("None" )):
319
+ desert ._make ._get_field_default (field = None )
320
+
321
+
285
322
@pytest .mark .parametrize (argnames = ["value" ], argvalues = [["X" ], [5 ]])
286
323
def test_union (module , value , assert_dump_load ):
287
324
"""Deserialize one of several types."""
You can’t perform that action at this time.
0 commit comments