Updated ElementBase.__delitem__ and added unit tests.

This commit is contained in:
Lance Stout 2010-08-19 19:11:12 -04:00
parent e4240dd593
commit fac3bca1f6
2 changed files with 79 additions and 14 deletions

View file

@ -269,6 +269,44 @@ class ElementBase(object):
self.plugins[attrib][attrib] = value self.plugins[attrib][attrib] = value
return self return self
def __delitem__(self, attrib):
"""
Delete the value of a stanza interface using dictionary-like syntax.
Example:
>>> msg['body'] = "Hi!"
>>> msg['body']
'Hi!'
>>> del msg['body']
>>> msg['body']
''
Stanza interfaces are typically mapped directly to the underlyig XML
object, but can be overridden by the presence of a delAttrib method
(or delFoo where the interface is named foo, etc).
The effect of deleting a stanza interface value named foo will be
one of:
1. Call delFoo, if it exists.
2. Delete foo element, if foo is in sub_interfaces.
3. Delete top level XML attribute named foo.
4. Remove the foo plugin, if it was loaded.
5. Do nothing.
"""
if attrib in self.interfaces:
del_method = "del%s" % attrib.title()
if hasattr(self, del_method):
getattr(self, del_method)()
else:
if attrib in self.sub_interfaces:
return self._delSub(attrib)
else:
self._delAttr(attrib)
elif attrib in self.plugin_attrib_map:
if attrib in self.plugins:
del self.plugins[attrib]
return self
@property @property
def attrib(self): #backwards compatibility def attrib(self): #backwards compatibility
return self return self
@ -352,20 +390,6 @@ class ElementBase(object):
def findall(self, xpath): def findall(self, xpath):
return self.xml.findall(xpath) return self.xml.findall(xpath)
def __delitem__(self, attrib):
if attrib.lower() in self.interfaces:
if hasattr(self, "del%s" % attrib.title()):
getattr(self, "del%s" % attrib.title())()
else:
if attrib in self.sub_interfaces:
return self._delSub(attrib)
else:
self._delAttr(attrib)
elif attrib in self.plugin_attrib_map:
if attrib in self.plugins:
del self.plugins[attrib]
return self
def __eq__(self, other): def __eq__(self, other):
if not isinstance(other, ElementBase): if not isinstance(other, ElementBase):
return False return False

View file

@ -189,5 +189,46 @@ class TestElementBase(SleekTest):
</foo> </foo>
""") """)
def testDelItem(self):
"""Test deleting stanza interface values."""
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
interfaces = set(('bar', 'baz', 'qux'))
sub_interfaces = set(('bar',))
def delQux(self):
pass
class TestStanzaPlugin(ElementBase):
name = "foobar"
namespace = "foo"
plugin_attrib = "foobar"
interfaces = set(('foobar',))
registerStanzaPlugin(TestStanza, TestStanzaPlugin)
stanza = TestStanza()
stanza['bar'] = 'a'
stanza['baz'] = 'b'
stanza['qux'] = 'c'
stanza['foobar']['foobar'] = 'd'
self.checkStanza(TestStanza, stanza, """
<foo xmlns="foo" baz="b" qux="c">
<bar>a</bar>
<foobar foobar="d" />
</foo>
""")
del stanza['bar']
del stanza['baz']
del stanza['qux']
del stanza['foobar']
self.checkStanza(TestStanza, stanza, """
<foo xmlns="foo" qux="c" />
""")
suite = unittest.TestLoader().loadTestsFromTestCase(TestElementBase) suite = unittest.TestLoader().loadTestsFromTestCase(TestElementBase)