From 2d03cd7290b95f0df97f2aa46dd4ceaf22d39211 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 4 Apr 2015 16:22:59 +0200 Subject: [PATCH] models: Make fields handle unsetting defaults in __dict__ --- mopidy/models.py | 12 +++++------- tests/models/test_fields.py | 8 ++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mopidy/models.py b/mopidy/models.py index 9a22b846..cf11b4d2 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -45,13 +45,13 @@ class Field(object): return instance.__dict__.get(self._name, self._default) def __set__(self, instance, value): - if value is None: - value = self._default - value = self.validate(value) if value is not None: - instance.__dict__[self._name] = value - else: + value = self.validate(value) + + if value is None or value == self._default: self.__delete__(instance) + else: + instance.__dict__[self._name] = value def __delete__(self, instance): instance.__dict__.pop(self._name, None) @@ -146,8 +146,6 @@ class ImmutableObject(object): raise TypeError( '__init__() got an unexpected keyword argument "%s"' % key) - if value == getattr(self, key): - continue # Don't explicitly set default values super(ImmutableObject, self).__setattr__(key, value) def __setattr__(self, name, value): diff --git a/tests/models/test_fields.py b/tests/models/test_fields.py index f2b55f01..864373a9 100644 --- a/tests/models/test_fields.py +++ b/tests/models/test_fields.py @@ -59,6 +59,14 @@ class FieldDescriptorTest(unittest.TestCase): self.assertEqual(None, instance.attr) self.assertNotIn('attr', instance.__dict__) + def test_field_can_be_set_default(self): + default = object() + instance = create_instance(Field(default=default)) + instance.attr = 1234 + instance.attr = default + self.assertEqual(default, instance.attr) + self.assertNotIn('attr', instance.__dict__) + class FieldTest(unittest.TestCase): def test_default_handling(self):