source:
ralphm-patches/pubsub-item.patch
@
54:03ec57713c90
Last change on this file since 54:03ec57713c90 was 47:f6d222b68f1c, checked in by Ralph Meijer <ralphm@…>, 11 years ago | |
---|---|
File size: 7.3 KB |
-
wokkel/generic.py
diff -r d16bd03316ad wokkel/generic.py
a b 38 38 @return: The DOM structure, or C{None} on empty or incomplete input. 39 39 @rtype: L{domish.Element} 40 40 """ 41 roots = []42 41 results = [] 43 42 elementStream = domish.elementStream() 44 elementStream.DocumentStartEvent = roots.append45 elementStream.ElementEvent = lambda elem: r oots[0].addChild(elem)46 elementStream.DocumentEndEvent = lambda: results.append(roots[0])47 elementStream.parse( string)43 elementStream.DocumentStartEvent = lambda _: None 44 elementStream.ElementEvent = lambda elem: results.append(elem) 45 elementStream.DocumentEndEvent = lambda: None 46 elementStream.parse('<dummy>%s</dummy>' % string) 48 47 return results and results[0] or None 49 48 50 49 -
wokkel/pubsub.py
diff -r d16bd03316ad wokkel/pubsub.py
a b 157 157 158 158 159 159 160 class Item( domish.Element):160 class Item(object): 161 161 """ 162 162 Publish subscribe item. 163 163 164 This behaves like an object providing L{domish.IElement}. 165 166 Item payload can be added using C{addChild} or C{addRawXml}, or using the 167 C{payload} keyword argument to C{__init__}. 164 @ivar itemIdentifier: Optional item identifier. 165 @type itemIdentifier: L{unicode} 166 @ivar payload: Optional item payload. Either as a L{domish.Element}, or as 167 serialized XML. 168 @type payload: Object providing L{domish.IElement} or L{unicode}. 169 @ivar timestamp: Optional timestamp when the item was published as 8601 170 string. Timestamps that include a time component must have a time zone 171 indicated. 172 @type timestamp: C{unicode} 173 @ivar publisher: Optional entity that published this item. 174 @type publisher: L{JID} 168 175 """ 169 176 170 def __init__(self, id=None, payload=None): 177 def __init__(self, itemIdentifier=None, payload=None, 178 timestamp=None, publisher=None): 179 self.itemIdentifier = itemIdentifier 180 self.payload = payload 181 self.timestamp = timestamp 182 self.publisher = publisher 183 184 185 def toElement(self, namespace=NS_PUBSUB): 171 186 """ 172 @param id: optional item identifier 173 @type id: L{unicode} 174 @param payload: optional item payload. Either as a domish element, or 175 as serialized XML. 176 @type payload: object providing L{domish.IElement} or L{unicode}. 187 Render to a DOM representation. 188 189 Usually called by when rendering requests or responses. The optional 190 C{namespace} argument is for rendering the item in that namespace, so 191 L{Item} is usable in all contexts involving items. 192 193 @param namespace: The namespace of the item. Usually L{NS_PUBSUB} or 194 L{NS_PUBSUB_EVENT}. 195 @type: C{unicode} 196 @rtype: L{domish.Element} 177 197 """ 198 element = domish.Element((namespace, 'item')) 178 199 179 domish.Element.__init__(self, (None, 'item'))180 if id is not None:181 self['id'] = id 182 if payload is not None:183 if isinstance( payload, basestring):184 self.addRawXml(payload)200 if self.itemIdentifier is not None: 201 element['id'] = self.itemIdentifier 202 203 if self.payload is not None: 204 if isinstance(self.payload, basestring): 205 element.addRawXml(self.payload) 185 206 else: 186 self.addChild(payload) 207 element.addChild(self.payload) 208 209 return element 187 210 188 211 189 212 … … 351 374 self.items = [] 352 375 for element in verbElement.elements(): 353 376 if element.uri == NS_PUBSUB and element.name == 'item': 354 self.items.append(element) 377 item = Item() 378 item.itemIdentifier = element.getAttribute('id') 379 try: 380 item.payload = element.elements().next() 381 except StopIteration: 382 pass 383 self.items.append(item) 355 384 356 385 357 386 def _render_items(self, verbElement): … … 360 389 """ 361 390 if self.items: 362 391 for item in self.items: 363 item.uri = NS_PUBSUB 364 verbElement.addChild(item) 392 verbElement.addChild(item.toElement()) 365 393 366 394 367 395 def _parse_jid(self, verbElement): … … 1307 1335 items["node"] = request.nodeIdentifier 1308 1336 1309 1337 for item in result: 1310 item.uri = NS_PUBSUB 1311 items.addChild(item) 1338 items.addChild(item.toElement()) 1312 1339 1313 1340 return response 1314 1341 … … 1359 1386 nodeIdentifier, subscriber, 1360 1387 subscriptions) 1361 1388 for item in items: 1362 item.uri = NS_PUBSUB_EVENT 1363 message.event.items.addChild(item) 1389 message.event.items.addChild(item.toElement(NS_PUBSUB_EVENT)) 1364 1390 self.send(message) 1365 1391 1366 1392 -
wokkel/test/test_pubsub.py
diff -r d16bd03316ad wokkel/test/test_pubsub.py
a b 115 115 116 116 117 117 118 class ItemTest(unittest.TestCase): 119 120 def test_toElement(self): 121 item = pubsub.Item(itemIdentifier='test') 122 element = item.toElement() 123 self.assertEquals('test', element.getAttribute('id')) 124 125 126 def test_toElementPayload(self): 127 payload = domish.Element(('testns', 'test')) 128 item = pubsub.Item(itemIdentifier='test', payload=payload) 129 element = item.toElement() 130 self.assertNotIdentical(None, element.test) 131 self.assertEquals('testns', element.test.uri) 132 133 134 def test_toElementPayloadRawXML(self): 135 payload = u"<test xmlns='testns'/>" 136 item = pubsub.Item(itemIdentifier='test', payload=payload) 137 element = item.toElement() 138 self.assertEquals(1, len(element.children)) 139 self.assertEquals(payload, element.children[0]) 140 141 118 142 class PubSubClientTest(unittest.TestCase): 119 143 timeout = 2 120 144 … … 465 489 items = list(domish.generateElementsQNamed(child.children, 466 490 'item', NS_PUBSUB)) 467 491 self.assertEquals(1, len(items)) 468 self.assertIdentical(item, items[0])469 492 470 493 response = toResponse(iq, 'result') 471 494 self.stub.send(response) … … 1048 1071 1049 1072 request = pubsub.PubSubRequest.fromElement(parseXml(xml)) 1050 1073 self.assertEqual(2, len(request.items)) 1051 self.assertEqual(u'item1', request.items[0] ["id"])1052 self.assertEqual(u'item2', request.items[1] ["id"])1074 self.assertEqual(u'item1', request.items[0].itemIdentifier) 1075 self.assertEqual(u'item2', request.items[1].itemIdentifier) 1053 1076 1054 1077 1055 1078 def test_fromElementPublishItemsOptions(self): … … 1075 1098 1076 1099 request = pubsub.PubSubRequest.fromElement(parseXml(xml)) 1077 1100 self.assertEqual(2, len(request.items)) 1078 self.assertEqual(u'item1', request.items[0]["id"]) 1079 self.assertEqual(u'item2', request.items[1]["id"]) 1101 self.assertEqual(u'item1', request.items[0].itemIdentifier) 1102 self.assertEqual(u'item2', request.items[1].itemIdentifier) 1103 1080 1104 1081 1105 def test_fromElementPublishNoNode(self): 1082 1106 """
Note: See TracBrowser
for help on using the repository browser.