summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Waldon <bcwaldon@gmail.com>2012-11-26 11:40:09 -0500
committerBrian Waldon <bcwaldon@gmail.com>2012-11-26 11:40:09 -0500
commitec39437bfd7a710e5ac5d4e4ca3236391c90998a (patch)
tree9995591edf72f3ec2e5a1526af75e17c9db16150
parentd34e169d1eb97b6fa84acf39ec2722d9ce77eaba (diff)
downloadwarlock-ec39437bfd7a710e5ac5d4e4ca3236391c90998a.tar.gz
Allow delattr and del operations
-rw-r--r--test/test_core.py16
-rw-r--r--warlock/core.py13
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):