diff --git a/adapter/adapter.py b/adapter/adapter.py index e9ed5b4..5da7425 100644 --- a/adapter/adapter.py +++ b/adapter/adapter.py @@ -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) @@ -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() diff --git a/tests/test_adapter.py b/tests/test_adapter.py index 8fa6b22..cabf264 100644 --- a/tests/test_adapter.py +++ b/tests/test_adapter.py @@ -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',