Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions adapter/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,9 @@ class Field(BaseField):

@six.add_metaclass(AdapterMetaClass)
class Adapter(BaseField):
def __init__(self, data=None, *args, **kwargs):
def __init__(self, data=None, instance=None, *args, **kwargs):
self.data = data
self.instance = instance

super(Adapter, self).__init__(*args, **kwargs)

Expand All @@ -151,16 +152,22 @@ def get_fields(self):
return copy.deepcopy(self.declared_fields)

def adapt(self, data=None):
meta = getattr(self, 'Meta', None)
model_cls = getattr(meta, 'model', dict)
obj = model_cls()
instance = self.get_instance()
for field_name, field in self.fields.iteritems():
value = field.get_attribute(data or self.data)
if value is undefined:
continue
adapted_value = field.adapt(value)
if isinstance(obj, collections.Mapping):
obj[field_name] = adapted_value
if isinstance(instance, collections.Mapping):
instance[field_name] = adapted_value
else:
setattr(obj, field_name, adapted_value)
return obj
setattr(instance, field_name, adapted_value)
return instance

def get_instance(self):
if self.instance:
return self.instance
else:
meta = getattr(self, 'Meta', None)
model_cls = getattr(meta, 'model', dict)
return model_cls()
14 changes: 14 additions & 0 deletions tests/test_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,20 @@ def test_object_to_object(self):
self.assertEqual(actual.address.region, expected.address.region)
self.assertEqual(actual.address.country, expected.address.country)

def test_object_to_existing_object(self):
data = inputs.Customer(**{
'first_name': 'Betty',
'last_name': 'Gowin',
'address_street': ['3385 Gerald L. Bates Drive'],
'address_zipcode': '02143',
'address_city': 'Somerville',
'address_state': 'US-MA',
'address_country': 'US',
})
instance = outputs.Customer()
actual = adapters.CustomerAdapter(data, instance=instance).adapt()
self.assertEqual(actual, instance)

def test_dict_to_dict(self):
data = {
'first': 'Jacquelyn',
Expand Down