CapsCache: made docstring match the API, fixed minor bugs, added tests

This commit is contained in:
Brendan Taylor 2008-06-12 03:56:47 +00:00
parent 00b7e9823f
commit 82b30c0791
2 changed files with 66 additions and 24 deletions

View File

@ -44,46 +44,39 @@ class CapsCache(object):
# object creation
>>> cc=CapsCache(logger_object)
>>> caps=('http://exodus.jabberstudio.org/caps', '0.9', None) # node, ver, ext
>>> muc='http://jabber.org/protocol/muc'
>>> chatstates='http://jabber.org/protocol/chatstates'
>>> caps = ('sha-1', '66/0NaeaBKkwk85efJTGmU47vXI=')
>>> muc = 'http://jabber.org/protocol/muc'
>>> chatstates = 'http://jabber.org/protocol/chatstates'
# setting data
>>> cc[caps].identities = [{'category':'client', 'type':'pc'}]
>>> cc[caps].features = [muc]
# retrieving data
>>> muc in cc[caps].features
True
>>> muc in cc[caps]
True
>>> chatstates in cc[caps]
>>> chatstates in cc[caps].features
False
>>> cc[caps].identities
set({'category':'client', 'type':'pc'})
>>> x=cc[caps] # more efficient if making several queries for one set of caps
[{'category': 'client', 'type': 'pc'}]
>>> x = cc[caps] # more efficient if making several queries for one set of caps
ATypicalBlackBoxObject
>>> muc in x
>>> muc in x.features
True
>>> x.node
'http://exodus.jabberstudio.org/caps'
# retrieving data (multiple exts case)
>>> caps=('http://gajim.org/caps', '0.9', ('csn', 'ft'))
>>> muc in cc[caps]
>>> muc in cc[caps].features
True
# setting data
>>> newcaps=('http://exodus.jabberstudio.org/caps', '0.9a', None)
>>> cc[newcaps].identities.add({'category':'client', 'type':'pc', 'name':'Gajim'})
>>> cc[newcaps].features+=muc # same as:
>>> cc[newcaps]+=muc
>>> cc[newcaps]['csn']+=chatstates # adding data as if ext was 'csn'
# warning: no feature removal!
'''
def __init__(self, logger=None):
''' Create a cache for entity capabilities. '''
# our containers:
# __cache is a dictionary mapping: pair of node and version maps
# __cache is a dictionary mapping: pair of hash method and hash maps
# to CapsCacheItem object
# __CacheItem is a class that stores data about particular
# client (node/version pair)
# client (hash method/hash pair)
self.__cache = {}
class CacheItem(object):
@ -129,7 +122,7 @@ class CapsCache(object):
d['xml:lang'] = i[2]
if i[3]:
d['name'] = i[3]
list.append(d)
list_.append(d)
return list_
def _set_identities(ciself, value):
ciself._identities = []
@ -172,7 +165,9 @@ class CapsCache(object):
def __getitem__(self, caps):
if caps in self.__cache:
return self.__cache[caps]
hash_method, hash = caps[0], caps[1]
hash_method, hash = caps
x = self.__CacheItem(hash_method, hash)
self.__cache[(hash_method, hash)] = x
return x

47
test/test_caps.py Normal file
View File

@ -0,0 +1,47 @@
# tests for capabilities and the capabilities cache
import unittest
import testlib
testlib.setup_env()
from common import gajim
from common import xmpp
from common.caps import CapsCache
from mock import Mock
class MockLogger(Mock):
def __init__(self, *args):
Mock.__init__(self, *args)
class TestCapsCache(unittest.TestCase):
def setUp(self):
self.logger = MockLogger()
self.cc = CapsCache(self.logger)
def test_examples(self):
'''tests the examples given in common/caps.py'''
caps = ('sha-1', '66/0NaeaBKkwk85efJTGmU47vXI=')
identity = {'category': 'client', 'type': 'pc'}
muc = 'http://jabber.org/protocol/muc'
chatstates = 'http://jabber.org/protocol/chatstates'
self.cc[caps].identities = [identity]
self.cc[caps].features = [muc]
self.assert_(muc in self.cc[caps].features)
self.assert_(chatstates not in self.cc[caps].features)
id = self.cc[caps].identities
self.assertEqual(1, len(id))
id = id[0]
self.assertEqual('client', id['category'])
self.assertEqual('pc', id['type'])
if __name__ == '__main__':
unittest.main()