Updated roster stanza with docs and PEP8 style.

This commit is contained in:
Lance Stout 2010-08-11 23:32:14 -04:00
parent 7a5ef28492
commit b40a489796
2 changed files with 183 additions and 45 deletions

View file

@ -5,51 +5,105 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET, JID
import logging from sleekxmpp.stanza import Iq
from sleekxmpp.xmlstream import JID
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin
from sleekxmpp.xmlstream.stanzabase import ET, ElementBase
class Roster(ElementBase): class Roster(ElementBase):
namespace = 'jabber:iq:roster'
name = 'query'
plugin_attrib = 'roster'
interfaces = set(('items',))
sub_interfaces = set()
def setItems(self, items): """
self.delItems() Example roster stanzas:
for jid in items: <iq type="set">
ijid = str(jid) <query xmlns="jabber:iq:roster">
item = ET.Element('{jabber:iq:roster}item', {'jid': ijid}) <item jid="user@example.com" subscription="both" name="User">
if 'subscription' in items[jid]: <group>Friends</group>
item.attrib['subscription'] = items[jid]['subscription'] </item>
if 'name' in items[jid]: </query>
name = items[jid]['name'] </iq>
if name is not None:
item.attrib['name'] = name Stanza Inteface:
if 'groups' in items[jid]: items -- A dictionary of roster entries contained
for group in items[jid]['groups']: in the stanza.
groupxml = ET.Element('{jabber:iq:roster}group')
groupxml.text = group Methods:
item.append(groupxml) getItems -- Return a dictionary of roster entries.
self.xml.append(item) setItems -- Add <item> elements.
return self delItems -- Remove all <item> elements.
"""
def getItems(self):
items = {} namespace = 'jabber:iq:roster'
itemsxml = self.xml.findall('{jabber:iq:roster}item') name = 'query'
if itemsxml is not None: plugin_attrib = 'roster'
for itemxml in itemsxml: interfaces = set(('items',))
item = {}
item['name'] = itemxml.get('name', '') def setItems(self, items):
item['subscription'] = itemxml.get('subscription', '') """
item['groups'] = [] Set the roster entries in the <roster> stanza.
groupsxml = itemxml.findall('{jabber:iq:roster}group')
if groupsxml is not None: Uses a dictionary using JIDs as keys, where each entry is itself
for groupxml in groupsxml: a dictionary that contains:
item['groups'].append(groupxml.text) name -- An alias or nickname for the JID.
items[itemxml.get('jid')] = item subscription -- The subscription type. Can be one of 'to',
return items 'from', 'both', 'none', or 'remove'.
groups -- A list of group names to which the JID
def delItems(self): has been assigned.
for child in self.xml.getchildren():
self.xml.remove(child) Arguments:
items -- A dictionary of roster entries.
"""
self.delItems()
for jid in items:
ijid = str(jid)
item = ET.Element('{jabber:iq:roster}item', {'jid': ijid})
if 'subscription' in items[jid]:
item.attrib['subscription'] = items[jid]['subscription']
if 'name' in items[jid]:
name = items[jid]['name']
if name is not None:
item.attrib['name'] = name
if 'groups' in items[jid]:
for group in items[jid]['groups']:
groupxml = ET.Element('{jabber:iq:roster}group')
groupxml.text = group
item.append(groupxml)
self.xml.append(item)
return self
def getItems(self):
"""
Return a dictionary of roster entries.
Each item is keyed using its JID, and contains:
name -- An assigned alias or nickname for the JID.
subscription -- The subscription type. Can be one of 'to',
'from', 'both', 'none', or 'remove'.
groups -- A list of group names to which the JID has
been assigned.
"""
items = {}
itemsxml = self.xml.findall('{jabber:iq:roster}item')
if itemsxml is not None:
for itemxml in itemsxml:
item = {}
item['name'] = itemxml.get('name', '')
item['subscription'] = itemxml.get('subscription', '')
item['groups'] = []
groupsxml = itemxml.findall('{jabber:iq:roster}group')
if groupsxml is not None:
for groupxml in groupsxml:
item['groups'].append(groupxml.text)
items[itemxml.get('jid')] = item
return items
def delItems(self):
"""
Remove all <item> elements from the roster stanza.
"""
for child in self.xml.getchildren():
self.xml.remove(child)
registerStanzaPlugin(Iq, Roster)

84
tests/test_roster.py Normal file
View file

@ -0,0 +1,84 @@
from . sleektest import *
from sleekxmpp.stanza.roster import Roster
class TestRosterStanzas(SleekTest):
def testAddItems(self):
"""Test adding items to a roster stanza."""
iq = self.Iq()
iq['roster'].setItems({
'user@example.com': {
'name': 'User',
'subscription': 'both',
'groups': ['Friends', 'Coworkers']},
'otheruser@example.com': {
'name': 'Other User',
'subscription': 'both',
'groups': []}})
self.checkIq(iq, """
<iq>
<query xmlns="jabber:iq:roster">
<item jid="user@example.com" name="User" subscription="both">
<group>Friends</group>
<group>Coworkers</group>
</item>
<item jid="otheruser@example.com" name="Other User"
subscription="both" />
</query>
</iq>
""")
def testGetItems(self):
"""Test retrieving items from a roster stanza."""
xml_string = """
<iq>
<query xmlns="jabber:iq:roster">
<item jid="user@example.com" name="User" subscription="both">
<group>Friends</group>
<group>Coworkers</group>
</item>
<item jid="otheruser@example.com" name="Other User"
subscription="both" />
</query>
</iq>
"""
iq = self.Iq(ET.fromstring(xml_string))
expected = {
'user@example.com': {
'name': 'User',
'subscription': 'both',
'groups': ['Friends', 'Coworkers']},
'otheruser@example.com': {
'name': 'Other User',
'subscription': 'both',
'groups': []}}
debug = "Roster items don't match after retrieval."
debug += "\nReturned: %s" % str(iq['roster']['items'])
debug += "\nExpected: %s" % str(expected)
self.failUnless(iq['roster']['items'] == expected, debug)
def testDelItems(self):
"""Test clearing items from a roster stanza."""
xml_string = """
<iq>
<query xmlns="jabber:iq:roster">
<item jid="user@example.com" name="User" subscription="both">
<group>Friends</group>
<group>Coworkers</group>
</item>
<item jid="otheruser@example.com" name="Other User"
subscription="both" />
</query>
</iq>
"""
iq = self.Iq(ET.fromstring(xml_string))
del iq['roster']['items']
self.checkIq(iq, """
<iq>
<query xmlns="jabber:iq:roster" />
</iq>
""")
suite = unittest.TestLoader().loadTestsFromTestCase(TestRosterStanzas)