Skip to content

Commit 450da75

Browse files
authored
Merge pull request #22 from alexei/feature/optional_fields
Add support for optional fields; close #15
2 parents f49d589 + a03b0a9 commit 450da75

2 files changed

Lines changed: 19 additions & 4 deletions

File tree

adapter/adapter.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ def get_attribute(obj, attrs):
6161

6262

6363
class BaseField(object):
64-
def __init__(self, source=None, default=undefined):
64+
def __init__(self, source=None, default=undefined, required=True):
6565
self.source = source
6666
self.default = default
67+
self.required = required
6768

6869
def bind(self, field_name, adapter):
6970
if field_name == self.source:
@@ -88,10 +89,21 @@ def bind(self, field_name, adapter):
8889

8990
def get_attribute(self, obj):
9091
value = get_attribute(obj, self.lookup_attrs)
91-
if value is not undefined:
92-
return value
92+
if value is undefined:
93+
if self.default is not undefined:
94+
return self.default
95+
elif self.required:
96+
raise ValueError((
97+
"Required value not found for field "
98+
"`{adapter_name}.{field_name}`. Provide a default value."
99+
).format(
100+
adapter_name=self.adapter.__class__.__name__,
101+
field_name=self.field_name,
102+
))
103+
else:
104+
return undefined
93105
else:
94-
return self.default
106+
return value
95107

96108
def adapt(self, data):
97109
return data
@@ -143,6 +155,8 @@ def adapt(self, data=None):
143155
obj = model_cls()
144156
for field_name, field in self.fields.iteritems():
145157
value = field.get_attribute(data or self.data)
158+
if value is undefined:
159+
continue
146160
adapted_value = field.adapt(value)
147161
if isinstance(obj, collections.Mapping):
148162
obj[field_name] = adapted_value

tests/adapters.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ class Meta(object):
3737

3838
first_name = adapter.Field(source='first')
3939
last_name = adapter.Field(source='last')
40+
birthday = adapter.Field(source='dob', required=False)

0 commit comments

Comments
 (0)