Fixed ElementBase.match to match using sub_interface elements.

This commit is contained in:
Lance Stout 2010-08-30 17:12:10 -04:00
parent 998741b87e
commit 3749c1b88c
2 changed files with 25 additions and 1 deletions

View file

@ -614,6 +614,12 @@ class ElementBase(object):
if self[name] != value: if self[name] != value:
return False return False
# Check sub interfaces.
if len(xpath) > 1:
next_tag = xpath[1]
if next_tag in self.sub_interfaces and self[next_tag]:
return True
# Attempt to continue matching the XPath using the stanza's plugins. # Attempt to continue matching the XPath using the stanza's plugins.
if not matched_substanzas and len(xpath) > 1: if not matched_substanzas and len(xpath) > 1:
# Convert {namespace}tag@attribs to just tag # Convert {namespace}tag@attribs to just tag

View file

@ -454,9 +454,16 @@ class TestElementBase(SleekTest):
class TestStanza(ElementBase): class TestStanza(ElementBase):
name = "foo" name = "foo"
namespace = "foo" namespace = "foo"
interfaces = set(('bar','baz')) interfaces = set(('bar','baz', 'qux'))
sub_interfaces = set(('qux',))
subitem = (TestSubStanza,) subitem = (TestSubStanza,)
def setQux(self, value):
self._setSubText('qux', text=value)
def getQux(self):
return self._getSubText('qux')
class TestStanzaPlugin(ElementBase): class TestStanzaPlugin(ElementBase):
name = "plugin" name = "plugin"
namespace = "http://test/slash/bar" namespace = "http://test/slash/bar"
@ -479,6 +486,17 @@ class TestElementBase(SleekTest):
self.failUnless(stanza.match("foo@bar=a@baz=b"), self.failUnless(stanza.match("foo@bar=a@baz=b"),
"Stanza did not match its own name with multiple attributes.") "Stanza did not match its own name with multiple attributes.")
stanza['qux'] = 'c'
self.failUnless(stanza.match("foo/qux"),
"Stanza did not match with subelements.")
stanza['qux'] = ''
self.failUnless(stanza.match("foo/qux") == False,
"Stanza matched missing subinterface element.")
self.failUnless(stanza.match("foo/bar") == False,
"Stanza matched nonexistent element.")
stanza['plugin']['attrib'] = 'c' stanza['plugin']['attrib'] = 'c'
self.failUnless(stanza.match("foo/plugin@attrib=c"), self.failUnless(stanza.match("foo/plugin@attrib=c"),
"Stanza did not match with plugin and attribute.") "Stanza did not match with plugin and attribute.")