Skip to content

Commit

Permalink
Merge pull request #57 from clarkduvall/fix-none
Browse files Browse the repository at this point in the history
Fix None not being supported as Field values
  • Loading branch information
clarkduvall committed Nov 28, 2017
2 parents 8954cdf + f645934 commit 6ff0f8b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 16 deletions.
31 changes: 20 additions & 11 deletions serpy/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,18 +106,27 @@ def _serialize(self, instance, fields):
v = {}
for name, getter, to_value, call, required, pass_self in fields:
if pass_self:
result = getter(self, instance)
try:
result = getter(self, instance)
except (KeyError, AttributeError):
if required:
raise
else:
continue
else:
result = getter(instance)
if required or result is not None:
if call:
result = result()
if to_value:
result = to_value(result)
if result is None and required:
raise TypeError('Field {0} is required', name)
else:
v[name] = result
try:
result = getter(instance)
except (KeyError, AttributeError):
if required:
raise
else:
continue
if required or result is not None:
if call:
result = result()
if to_value:
result = to_value(result)
v[name] = result

return v

Expand Down
52 changes: 47 additions & 5 deletions tests/test_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,13 +152,13 @@ class ASerializer(Serializer):
data = ASerializer(o).data
self.assertEqual(data['a'], 15)

def test_optional_field(self):
def test_optional_intfield(self):
class ASerializer(Serializer):
a = IntField(required=False)

o = Obj(a=None)
data = ASerializer(o).data
self.assertNotIn('a', data)
self.assertIsNone(data['a'])

o = Obj(a='5')
data = ASerializer(o).data
Expand All @@ -171,6 +171,48 @@ class ASerializer(Serializer):
with self.assertRaises(TypeError):
ASerializer(o).data

def test_optional_field_dictserializer(self):
class ASerializer(DictSerializer):
a = Field(required=False)

data = ASerializer({'a': None}).data
self.assertIsNone(data['a'])

data = ASerializer({}).data
self.assertNotIn('a', data)

class ASerializer(DictSerializer):
a = Field()

data = ASerializer({'a': None}).data
self.assertIsNone(data['a'])

with self.assertRaises(KeyError):
ASerializer({}).data

def test_optional_field(self):
class ASerializer(Serializer):
a = Field(required=False)

o = Obj(a=None)
data = ASerializer(o).data
self.assertIsNone(data['a'])

o = Obj()
data = ASerializer(o).data
self.assertNotIn('a', data)

class ASerializer(Serializer):
a = Field()

o = Obj(a=None)
data = ASerializer(o).data
self.assertIsNone(data['a'])

o = Obj()
with self.assertRaises(AttributeError):
ASerializer(o).data

def test_optional_methodfield(self):
class ASerializer(Serializer):
a = MethodField(required=False)
Expand All @@ -180,7 +222,7 @@ def get_a(self, obj):

o = Obj(a=None)
data = ASerializer(o).data
self.assertNotIn('a', data)
self.assertIsNone(data['a'])

o = Obj(a='5')
data = ASerializer(o).data
Expand All @@ -193,8 +235,8 @@ def get_a(self, obj):
return obj.a

o = Obj(a=None)
with self.assertRaises(TypeError):
ASerializer(o).data
data = ASerializer(o).data
self.assertIsNone(data['a'])

def test_error_on_data(self):
with self.assertRaises(RuntimeError):
Expand Down

0 comments on commit 6ff0f8b

Please sign in to comment.