Skip to content

Commit

Permalink
feat: parse LinkField from dict
Browse files Browse the repository at this point in the history
  • Loading branch information
pity7736 committed Aug 26, 2021
1 parent fd9501b commit 8809589
Show file tree
Hide file tree
Showing 4 changed files with 209 additions and 27 deletions.
130 changes: 103 additions & 27 deletions nyoibo/fields.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions nyoibo/fields.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -171,5 +171,9 @@ cdef class LinkField(Field):
cpdef public parse(self, value):
if value is None or isinstance(value, (self.to, *self._valid_values)):
return value
if isinstance(value, dict):
if value:
return self.to(**value)
return None
raise FieldValueError(f'{type(value)} is not a valid value for '
f'{self.__class__.__name__}')
72 changes: 72 additions & 0 deletions tests/test_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,75 @@ class Entity0(Entity, metaclass=OtherMetaEntity):

class Entity1(Entity):
_entity0 = fields.LinkField(to=Entity0)


def test_instance_entity_from_dict_with_link_field():
class Model0(Entity):
_value = fields.StrField()
_int_value = fields.IntField()

class Model1(Entity):
_link = fields.LinkField(to=Model0)
_name = fields.StrField()

data = {
'name': 'test',
'link': {
'value': 'hi world',
'int_value': '5',
'different_field': 'some value'
}
}
instance = Model1(**data)
assert instance.name == 'test'
assert instance.link.value == 'hi world'
assert instance.link.int_value == 5


def test_instance_entity_from_dict_with_empty_link_field_data():
class Model0(Entity):
_value = fields.StrField()
_int_value = fields.IntField()

class Model1(Entity):
_link = fields.LinkField(to=Model0)
_name = fields.StrField()

data = {
'name': 'test',
'link': {}
}
instance = Model1(**data)
assert instance.name == 'test'
assert instance.link is None


def test_instance_entity_from_dict_with_link_field_in_2_depth():
class Model0(Entity):
_value = fields.StrField()
_int_value = fields.IntField()

class Model1(Entity):
_link = fields.LinkField(to=Model0)
_name = fields.StrField()

class Model2(Entity):
_value = fields.StrField()
_link = fields.LinkField(to=Model1)

data = {
'value': 'some value',
'link': {
'name': 'test',
'link': {
'value': 'hi world',
'int_value': '5',
'different_field': 'some value'
}
}
}
instance = Model2(**data)
assert instance.value == 'some value'
assert instance.link.name == 'test'
assert instance.link.link.value == 'hi world'
assert instance.link.link.int_value == 5
30 changes: 30 additions & 0 deletions tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,3 +212,33 @@ class Example(Entity):
with raises(FieldValueError) as e:
link_field.parse(value)
assert str(e.value) == f'{type(value)} is not a valid value for LinkField'


def test_parse_link_field_from_dict():
class NewEntity(Entity):
_field0 = fields.StrField()
_field1 = fields.IntField()

link_field = fields.LinkField(to=NewEntity)
data = {
'field0': 'hi',
'field1': '10'
}
parsed = link_field.parse(data)
assert parsed.field0 == 'hi'
assert parsed.field1 == 10


def test_parse_link_field_from_dict_with_wrong_data():
class NewEntity(Entity):
_field0 = fields.StrField()
_field1 = fields.IntField()

link_field = fields.LinkField(to=NewEntity)
data = {
'field32': 'hi',
'field2': '10'
}
parsed = link_field.parse(data)
assert parsed.field0 is None
assert parsed.field1 is None

0 comments on commit 8809589

Please sign in to comment.