Skip to content

Commit c80b5cb

Browse files
authored
Merge pull request #27 from alexei/feature/support_adapting_to_existing_resource
Support adapting to existing resource
2 parents e32d83f + f921fdc commit c80b5cb

2 files changed

Lines changed: 29 additions & 8 deletions

File tree

adapter/adapter.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,9 @@ class Field(BaseField):
134134

135135
@six.add_metaclass(AdapterMetaClass)
136136
class Adapter(BaseField):
137-
def __init__(self, data=None, *args, **kwargs):
137+
def __init__(self, data=None, instance=None, *args, **kwargs):
138138
self.data = data
139+
self.instance = instance
139140

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

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

153154
def adapt(self, data=None):
154-
meta = getattr(self, 'Meta', None)
155-
model_cls = getattr(meta, 'model', dict)
156-
obj = model_cls()
155+
instance = self.get_instance()
157156
for field_name, field in self.fields.iteritems():
158157
value = field.get_attribute(data or self.data)
159158
if value is undefined:
160159
continue
161160
adapted_value = field.adapt(value)
162-
if isinstance(obj, collections.Mapping):
163-
obj[field_name] = adapted_value
161+
if isinstance(instance, collections.Mapping):
162+
instance[field_name] = adapted_value
164163
else:
165-
setattr(obj, field_name, adapted_value)
166-
return obj
164+
setattr(instance, field_name, adapted_value)
165+
return instance
166+
167+
def get_instance(self):
168+
if self.instance:
169+
return self.instance
170+
else:
171+
meta = getattr(self, 'Meta', None)
172+
model_cls = getattr(meta, 'model', dict)
173+
return model_cls()

tests/test_adapter.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,20 @@ def test_object_to_object(self):
4545
self.assertEqual(actual.address.region, expected.address.region)
4646
self.assertEqual(actual.address.country, expected.address.country)
4747

48+
def test_object_to_existing_object(self):
49+
data = inputs.Customer(**{
50+
'first_name': 'Betty',
51+
'last_name': 'Gowin',
52+
'address_street': ['3385 Gerald L. Bates Drive'],
53+
'address_zipcode': '02143',
54+
'address_city': 'Somerville',
55+
'address_state': 'US-MA',
56+
'address_country': 'US',
57+
})
58+
instance = outputs.Customer()
59+
actual = adapters.CustomerAdapter(data, instance=instance).adapt()
60+
self.assertEqual(actual, instance)
61+
4862
def test_dict_to_dict(self):
4963
data = {
5064
'first': 'Jacquelyn',

0 commit comments

Comments
 (0)