Updated ElementBase.__delitem__ and added unit tests.
This commit is contained in:
		| @@ -269,6 +269,44 @@ class ElementBase(object): | ||||
|             self.plugins[attrib][attrib] = value | ||||
|         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 | ||||
|     def attrib(self): #backwards compatibility | ||||
|             return self | ||||
| @@ -352,20 +390,6 @@ class ElementBase(object): | ||||
|     def findall(self, 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): | ||||
|             if not isinstance(other, ElementBase): | ||||
|                     return False | ||||
|   | ||||
| @@ -189,5 +189,46 @@ class TestElementBase(SleekTest): | ||||
|           </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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Lance Stout
					Lance Stout