diff options
author | Brian Waldon <bcwaldon@gmail.com> | 2012-11-26 11:40:09 -0500 |
---|---|---|
committer | Brian Waldon <bcwaldon@gmail.com> | 2012-11-26 11:40:09 -0500 |
commit | ec39437bfd7a710e5ac5d4e4ca3236391c90998a (patch) | |
tree | 9995591edf72f3ec2e5a1526af75e17c9db16150 | |
parent | d34e169d1eb97b6fa84acf39ec2722d9ce77eaba (diff) | |
download | warlock-ec39437bfd7a710e5ac5d4e4ca3236391c90998a.tar.gz |
Allow delattr and del operations
-rw-r--r-- | test/test_core.py | 16 | ||||
-rw-r--r-- | warlock/core.py | 13 |
2 files changed, 26 insertions, 3 deletions
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): |