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(
213213 if default is not marshmallow .missing :
214214 desert_metadata .setdefault ("default" , default )
215215 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 )
220217
221218 field = None
222219
@@ -256,7 +253,7 @@ def field_for_schema(
256253 values = field_for_schema (arguments [1 ]),
257254 )
258255 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 )
260257 # Treat optional types as types with a None default
261258 metadata [_DESERT_SENTINEL ]["default" ] = metadata .get ("default" , None )
262259 metadata [_DESERT_SENTINEL ]["missing" ] = metadata .get ("missing" , None )
Original file line number Diff line number Diff line change 11import dataclasses
22import datetime
3+ import decimal
34import enum
5+ import re
46import sys
57import types
68import typing as t
79
810import attr
911import marshmallow
12+ import marshmallow .fields
1013import pytest
1114
1215import desert
@@ -282,6 +285,40 @@ class A:
282285 assert attr .fields (A ).x .metadata ["foo" ] == 1
283286
284287
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+
285322@pytest .mark .parametrize (argnames = ["value" ], argvalues = [["X" ], [5 ]])
286323def test_union (module , value , assert_dump_load ):
287324 """Deserialize one of several types."""
You can’t perform that action at this time.
0 commit comments