diff --git a/test/test_core.py b/test/test_core.py index 5feb9f1..b4e1627 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -113,15 +113,27 @@ class TestCore(unittest.TestCase): self.assertRaises(exc, sweden.clear) self.assertRaises(exc, sweden.pop, 0) self.assertRaises(exc, sweden.popitem) - self.assertRaises(exc, sweden.__delitem__, 'name') def test_dict_syntax(self): Country = warlock.model_factory(fixture) sweden = Country(name='Sweden', population=9379116) - self.assertEqual(sweden['name'], 'Sweden') + sweden['name'] = 'Finland' self.assertEqual(sweden['name'], 'Finland') + del sweden['name'] + self.assertRaises(AttributeError, getattr, sweden, 'name') + + def test_attr_syntax(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + + sweden.name = 'Finland' + self.assertEqual(sweden.name, 'Finland') + + delattr(sweden, 'name') + self.assertRaises(AttributeError, getattr, sweden, 'name') + def test_changes(self): Country = warlock.model_factory(fixture) sweden = Country(name='Sweden', population=9379116) diff --git a/warlock/core.py b/warlock/core.py index da662ec..38cb854 100644 --- a/warlock/core.py +++ b/warlock/core.py @@ -76,7 +76,18 @@ def model_factory(schema): raise InvalidOperation() def __delitem__(self, key): - raise InvalidOperation() + mutation = dict(self.items()) + del mutation[key] + try: + self.validator(mutation) + except ValidationError: + msg = "Unable to delete attribute '%s'" % (key) + raise InvalidOperation(msg) + + dict.__delitem__(self, key) + + def __delattr__(self, key): + self.__delitem__(key) # NOTE(termie): This is kind of the opposite of what copy usually does def copy(self):