1From 6b3ab4a94e4d498cdabd5aac6b749031abd785c8 Mon Sep 17 00:00:00 2001
2From: Ralph Meijer <ralphm@ik.nu>
3Date: Thu, 18 Jul 2024 19:04:47 +0200
4Subject: [PATCH] Remove py2 compat
5
6Co-authored-by: OPNA2608 <opna2608@protonmail.com>
7---
8 setup.py | 11 ++-
9 wokkel/component.py | 13 ++-
10 wokkel/data_form.py | 70 ++++++----------
11 wokkel/delay.py | 2 +-
12 wokkel/disco.py | 51 ++++++------
13 wokkel/formats.py | 20 ++---
14 wokkel/generic.py | 19 +----
15 wokkel/iwokkel.py | 150 +++++++++++++++++-----------------
16 wokkel/muc.py | 67 ++++++++-------
17 wokkel/pubsub.py | 55 ++++++-------
18 wokkel/server.py | 17 ++--
19 wokkel/shim.py | 5 +-
20 wokkel/subprotocols.py | 13 ++-
21 wokkel/test/helpers.py | 5 +-
22 wokkel/test/test_client.py | 3 +-
23 wokkel/test/test_data_form.py | 89 +++++---------------
24 wokkel/test/test_generic.py | 75 +----------------
25 wokkel/test/test_muc.py | 13 ++-
26 wokkel/test/test_server.py | 6 +-
27 wokkel/test/test_shim.py | 5 +-
28 wokkel/test/test_xmppim.py | 19 ++---
29 wokkel/xmppim.py | 89 ++++++++++----------
30 22 files changed, 318 insertions(+), 479 deletions(-)
31
32diff --git a/setup.py b/setup.py
33index 8804fd9..f7f1e33 100755
34--- a/setup.py
35+++ b/setup.py
36@@ -40,11 +40,11 @@ setup(name='wokkel',
37 license='MIT',
38 platforms='any',
39 classifiers=[
40- 'Programming Language :: Python :: 2.7',
41 'Programming Language :: Python :: 3',
42- 'Programming Language :: Python :: 3.4',
43- 'Programming Language :: Python :: 3.5',
44 'Programming Language :: Python :: 3.6',
45+ 'Programming Language :: Python :: 3.7',
46+ 'Programming Language :: Python :: 3.8',
47+ 'Programming Language :: Python :: 3.9',
48 ],
49 packages=[
50 'wokkel',
51@@ -60,16 +60,15 @@ setup(name='wokkel',
52 install_requires=[
53 'incremental>=16.9.0',
54 'python-dateutil',
55+ 'Twisted[tls]>=16.4.0',
56 ],
57 extras_require={
58- ":python_version<'3'": 'Twisted[tls]>=15.5.0',
59- ":python_version>'3'": 'Twisted[tls]>=16.4.0',
60 "dev": [
61 "pyflakes",
62 "coverage",
63+ "pydoctor",
64 "sphinx",
65 "towncrier",
66 ],
67- "dev:python_version<'3'": "pydoctor",
68 },
69 )
70diff --git a/wokkel/component.py b/wokkel/component.py
71index da48230..9410837 100644
72--- a/wokkel/component.py
73+++ b/wokkel/component.py
74@@ -12,7 +12,6 @@ from __future__ import division, absolute_import
75 from twisted.application import service
76 from twisted.internet import reactor
77 from twisted.python import log
78-from twisted.python.compat import unicode
79 from twisted.words.protocols.jabber.jid import internJID as JID
80 from twisted.words.protocols.jabber import component, error, xmlstream
81 from twisted.words.xish import domish
82@@ -105,7 +104,7 @@ class InternalComponent(xmlstream.XMPPHandlerCollection, service.Service):
83 components of this type connect to a router in the same process. This
84 allows for one-process XMPP servers.
85
86- @ivar domains: Domains (as L{unicode}) this component will handle traffic
87+ @ivar domains: Domains (as L{str}) this component will handle traffic
88 for.
89 @type domains: L{set}
90 """
91@@ -177,7 +176,7 @@ class ListenComponentAuthenticator(xmlstream.ListenAuthenticator):
92 Authenticator for accepting components.
93
94 @ivar secret: The shared used to authorized incoming component connections.
95- @type secret: L{unicode}.
96+ @type secret: L{str}.
97 """
98
99 namespace = NS_COMPONENT_ACCEPT
100@@ -241,7 +240,7 @@ class ListenComponentAuthenticator(xmlstream.ListenAuthenticator):
101 L{onHandshake}.
102 """
103 if (element.uri, element.name) == (self.namespace, 'handshake'):
104- self.onHandshake(unicode(element))
105+ self.onHandshake(str(element))
106 else:
107 exc = error.StreamError('not-authorized')
108 self.xmlstream.sendStreamError(exc)
109@@ -257,7 +256,7 @@ class ListenComponentAuthenticator(xmlstream.ListenAuthenticator):
110 be exchanged.
111 """
112 calculatedHash = xmlstream.hashPassword(self.xmlstream.sid,
113- unicode(self.secret))
114+ str(self.secret))
115 if handshake != calculatedHash:
116 exc = error.StreamError('not-authorized', text='Invalid hash')
117 self.xmlstream.sendStreamError(exc)
118@@ -301,7 +300,7 @@ class Router(object):
119
120 @param destination: Destination of the route to be added as a host name
121 or L{None} for the default route.
122- @type destination: L{unicode} or L{NoneType}
123+ @type destination: L{str} or L{NoneType}
124
125 @param xs: XML Stream to register the route for.
126 @type xs:
127@@ -316,7 +315,7 @@ class Router(object):
128 Remove a route.
129
130 @param destination: Destination of the route that should be removed.
131- @type destination: L{unicode}
132+ @type destination: L{str}
133
134 @param xs: XML Stream to remove the route for.
135 @type xs:
136diff --git a/wokkel/data_form.py b/wokkel/data_form.py
137index ed9c5fc..7f1c34c 100644
138--- a/wokkel/data_form.py
139+++ b/wokkel/data_form.py
140@@ -17,7 +17,6 @@ from __future__ import division, absolute_import
141 from zope.interface import implementer
142 from zope.interface.common import mapping
143
144-from twisted.python.compat import iteritems, unicode, _PY3
145 from twisted.words.protocols.jabber.jid import JID
146 from twisted.words.xish import domish
147
148@@ -51,9 +50,9 @@ class Option(object):
149 Data Forms field option.
150
151 @ivar value: Value of this option.
152- @type value: L{unicode}
153+ @type value: L{str}
154 @ivar label: Optional label for this option.
155- @type label: L{unicode} or L{NoneType}
156+ @type label: L{str} or L{NoneType}
157 """
158
159 def __init__(self, value, label=None):
160@@ -91,7 +90,7 @@ class Option(object):
161 raise Error("Option has no value")
162
163 label = element.getAttribute('label')
164- return Option(unicode(valueElements[0]), label)
165+ return Option(str(valueElements[0]), label)
166
167
168 class Field(object):
169@@ -108,15 +107,15 @@ class Field(object):
170 @ivar var: Field name. Optional if C{fieldType} is C{'fixed'}.
171 @type var: L{str}
172 @ivar label: Human readable label for this field.
173- @type label: L{unicode}
174+ @type label: L{str}
175 @ivar values: The values for this field, for multi-valued field
176- types, as a list of L{bool}, L{unicode} or L{JID}.
177+ types, as a list of L{bool}, L{str} or L{JID}.
178 @type values: L{list}
179 @ivar options: List of possible values to choose from in a response
180 to this form as a list of L{Option}s.
181 @type options: L{list}
182 @ivar desc: Human readable description for this field.
183- @type desc: L{unicode}
184+ @type desc: L{str}
185 @ivar required: Whether the field is required to be provided in a
186 response to this form.
187 @type required: L{bool}
188@@ -147,7 +146,7 @@ class Field(object):
189 try:
190 self.options = [Option(optionValue, optionLabel)
191 for optionValue, optionLabel
192- in iteritems(options)]
193+ in options.items()]
194 except AttributeError:
195 self.options = options or []
196
197@@ -185,7 +184,7 @@ class Field(object):
198
199 Sets C{value} as the only element of L{values}.
200
201- @type value: L{bool}, L{unicode} or L{JID}
202+ @type value: L{bool}, L{str} or L{JID}
203 """
204 self.values = [value]
205
206@@ -229,7 +228,7 @@ class Field(object):
207 newValues = []
208 for value in self.values:
209 if self.fieldType == 'boolean':
210- if isinstance(value, (str, unicode)):
211+ if isinstance(value, str):
212 checkValue = value.lower()
213 if not checkValue in ('0', '1', 'false', 'true'):
214 raise ValueError("Not a boolean")
215@@ -263,9 +262,9 @@ class Field(object):
216
217 for value in self.values:
218 if isinstance(value, bool):
219- value = unicode(value).lower()
220+ value = str(value).lower()
221 else:
222- value = unicode(value)
223+ value = str(value)
224
225 field.addElement('value', content=value)
226
227@@ -288,7 +287,7 @@ class Field(object):
228
229 @staticmethod
230 def _parse_desc(field, element):
231- desc = unicode(element)
232+ desc = str(element)
233 if desc:
234 field.desc = desc
235
236@@ -305,7 +304,7 @@ class Field(object):
237
238 @staticmethod
239 def _parse_value(field, element):
240- value = unicode(element)
241+ value = str(element)
242 field.values.append(value)
243
244
245@@ -313,9 +312,9 @@ class Field(object):
246 def fromElement(element):
247 field = Field(None)
248
249- for eAttr, fAttr in iteritems({'type': 'fieldType',
250- 'var': 'var',
251- 'label': 'label'}):
252+ for eAttr, fAttr in {'type': 'fieldType',
253+ 'var': 'var',
254+ 'label': 'label'}.items():
255 value = element.getAttribute(eAttr)
256 if value:
257 setattr(field, fAttr, value)
258@@ -350,7 +349,7 @@ class Field(object):
259
260 if 'options' in fieldDict:
261 options = []
262- for value, label in iteritems(fieldDict['options']):
263+ for value, label in fieldDict['options'].items():
264 options.append(Option(value, label))
265 kwargs['options'] = options
266
267@@ -385,9 +384,9 @@ class Form(object):
268 @type formType: L{str}
269
270 @ivar title: Natural language title of the form.
271- @type title: L{unicode}
272+ @type title: L{str}
273
274- @ivar instructions: Natural language instructions as a list of L{unicode}
275+ @ivar instructions: Natural language instructions as a list of L{str}
276 strings without line breaks.
277 @type instructions: L{list}
278
279@@ -497,7 +496,7 @@ class Form(object):
280 C{fieldDefs}.
281 @type filterUnknown: L{bool}
282 """
283- for name, value in iteritems(values):
284+ for name, value in values.items():
285 fieldDict = {'var': name,
286 'type': None}
287
288@@ -542,14 +541,14 @@ class Form(object):
289
290 @staticmethod
291 def _parse_title(form, element):
292- title = unicode(element)
293+ title = str(element)
294 if title:
295 form.title = title
296
297
298 @staticmethod
299 def _parse_instructions(form, element):
300- instructions = unicode(element)
301+ instructions = str(element)
302 if instructions:
303 form.instructions.append(instructions)
304
305@@ -624,36 +623,19 @@ class Form(object):
306 return key in self.fields
307
308
309- def iterkeys(self):
310+ def keys(self):
311 return iter(self)
312
313
314- def itervalues(self):
315+ def values(self):
316 for key in self:
317 yield self[key]
318
319
320- def iteritems(self):
321+ def items(self):
322 for key in self:
323 yield (key, self[key])
324
325- if _PY3:
326- keys = iterkeys
327- values = itervalues
328- items = iteritems
329- else:
330- def keys(self):
331- return list(self)
332-
333-
334- def values(self):
335- return list(self.itervalues())
336-
337-
338- def items(self):
339- return list(self.iteritems())
340-
341-
342 def getValues(self):
343 """
344 Extract values from the named form fields.
345@@ -701,7 +683,7 @@ class Form(object):
346
347 filtered = []
348
349- for name, field in iteritems(self.fields):
350+ for name, field in self.fields.items():
351 if name in fieldDefs:
352 fieldDef = fieldDefs[name]
353 if 'type' not in fieldDef:
354diff --git a/wokkel/delay.py b/wokkel/delay.py
355index be06cb3..1dd1703 100644
356--- a/wokkel/delay.py
357+++ b/wokkel/delay.py
358@@ -46,7 +46,7 @@ class Delay(object):
359 Render this instance into a domish Element.
360
361 @param legacy: If C{True}, use the legacy XEP-0091 format.
362- @type legacy: C{bool}
363+ @type legacy: L{bool}
364 """
365 if not self.stamp:
366 raise ValueError("stamp is required")
367diff --git a/wokkel/disco.py b/wokkel/disco.py
368index 9ea43ef..227789d 100644
369--- a/wokkel/disco.py
370+++ b/wokkel/disco.py
371@@ -13,7 +13,6 @@ U{XEP-0030<http://xmpp.org/extensions/xep-0030.html>}.
372 from __future__ import division, absolute_import
373
374 from twisted.internet import defer
375-from twisted.python.compat import iteritems, unicode
376 from twisted.words.protocols.jabber import error, jid
377 from twisted.words.xish import domish
378
379@@ -29,11 +28,11 @@ IQ_GET = '/iq[@type="get"]'
380 DISCO_INFO = IQ_GET + '/query[@xmlns="' + NS_DISCO_INFO + '"]'
381 DISCO_ITEMS = IQ_GET + '/query[@xmlns="' + NS_DISCO_ITEMS + '"]'
382
383-class DiscoFeature(unicode):
384+class DiscoFeature(str):
385 """
386 XMPP service discovery feature.
387
388- This extends C{unicode} to convert to and from L{domish.Element}, but
389+ This extends L{str} to convert to and from L{domish.Element}, but
390 further behaves identically.
391 """
392
393@@ -44,7 +43,7 @@ class DiscoFeature(unicode):
394 @rtype: L{domish.Element}.
395 """
396 element = domish.Element((NS_DISCO_INFO, 'feature'))
397- element['var'] = unicode(self)
398+ element['var'] = str(self)
399 return element
400
401
402@@ -68,11 +67,11 @@ class DiscoIdentity(object):
403 XMPP service discovery identity.
404
405 @ivar category: The identity category.
406- @type category: C{unicode}
407+ @type category: L{str}
408 @ivar type: The identity type.
409- @type type: C{unicode}
410+ @type type: L{str}
411 @ivar name: The optional natural language name for this entity.
412- @type name: C{unicode}
413+ @type name: L{str}
414 """
415
416 def __init__(self, category, idType, name=None):
417@@ -119,21 +118,21 @@ class DiscoInfo(object):
418 XMPP service discovery info.
419
420 @ivar nodeIdentifier: The optional node this info applies to.
421- @type nodeIdentifier: C{unicode}
422+ @type nodeIdentifier: L{str}
423 @ivar features: Features as L{DiscoFeature}.
424- @type features: C{set}
425+ @type features: L{set}
426 @ivar identities: Identities as a mapping from (category, type) to name,
427- all C{unicode}.
428- @type identities: C{dict}
429+ all L{str}.
430+ @type identities: L{dict}
431 @ivar extensions: Service discovery extensions as a mapping from the
432- extension form's C{FORM_TYPE} (C{unicode}) to
433+ extension form's C{FORM_TYPE} (L{str}) to
434 L{data_form.Form}. Forms with no C{FORM_TYPE} field
435 are mapped as C{None}. Note that multiple forms
436 with the same C{FORM_TYPE} have the last in sequence
437 prevail.
438- @type extensions: C{dict}
439+ @type extensions: L{dict}
440 @ivar _items: Sequence of added items.
441- @type _items: C{list}
442+ @type _items: L{list}
443 """
444
445 def __init__(self):
446@@ -226,9 +225,9 @@ class DiscoItem(object):
447 @ivar entity: The entity holding the item.
448 @type entity: L{jid.JID}
449 @ivar nodeIdentifier: The optional node identifier for the item.
450- @type nodeIdentifier: C{unicode}
451+ @type nodeIdentifier: L{str}
452 @ivar name: The optional natural language name for this entity.
453- @type name: C{unicode}
454+ @type name: L{str}
455 """
456
457 def __init__(self, entity, nodeIdentifier='', name=None):
458@@ -278,9 +277,9 @@ class DiscoItems(object):
459 XMPP service discovery items.
460
461 @ivar nodeIdentifier: The optional node this info applies to.
462- @type nodeIdentifier: C{unicode}
463+ @type nodeIdentifier: L{str}
464 @ivar _items: Sequence of added items.
465- @type _items: C{list}
466+ @type _items: L{list}
467 """
468
469 def __init__(self):
470@@ -353,9 +352,9 @@ class _DiscoRequest(generic.Request):
471 A Service Discovery request.
472
473 @ivar verb: Type of request: C{'info'} or C{'items'}.
474- @type verb: C{str}
475+ @type verb: L{str}
476 @ivar nodeIdentifier: Optional node to request info for.
477- @type nodeIdentifier: C{unicode}
478+ @type nodeIdentifier: L{str}
479 """
480
481 verb = None
482@@ -366,7 +365,7 @@ class _DiscoRequest(generic.Request):
483 NS_DISCO_ITEMS: 'items',
484 }
485
486- _verbRequestMap = dict(((v, k) for k, v in iteritems(_requestVerbMap)))
487+ _verbRequestMap = dict(((v, k) for k, v in _requestVerbMap.items()))
488
489 def __init__(self, verb=None, nodeIdentifier='',
490 recipient=None, sender=None):
491@@ -415,7 +414,7 @@ class DiscoClientProtocol(XMPPHandler):
492 @type entity: L{jid.JID}
493
494 @param nodeIdentifier: Optional node to request info from.
495- @type nodeIdentifier: C{unicode}
496+ @type nodeIdentifier: L{str}
497
498 @param sender: Optional sender address.
499 @type sender: L{jid.JID}
500@@ -438,7 +437,7 @@ class DiscoClientProtocol(XMPPHandler):
501 @type entity: L{jid.JID}
502
503 @param nodeIdentifier: Optional node to request info from.
504- @type nodeIdentifier: C{unicode}
505+ @type nodeIdentifier: L{str}
506
507 @param sender: Optional sender address.
508 @type sender: L{jid.JID}
509@@ -534,7 +533,7 @@ class DiscoHandler(XMPPHandler, IQHandlerMixin):
510
511 @param deferredList: List of deferreds for which the results should be
512 gathered.
513- @type deferredList: C{list}
514+ @type deferredList: L{list}
515 @return: Deferred that fires with a list of gathered results.
516 @rtype: L{defer.Deferred}
517 """
518@@ -566,7 +565,7 @@ class DiscoHandler(XMPPHandler, IQHandlerMixin):
519 @param target: The entity the request was sent to.
520 @type target: L{JID<twisted.words.protocols.jabber.jid.JID>}
521 @param nodeIdentifier: The optional node being queried, or C{''}.
522- @type nodeIdentifier: C{unicode}
523+ @type nodeIdentifier: L{str}
524 @return: Deferred with the gathered results from sibling handlers.
525 @rtype: L{defer.Deferred}
526 """
527@@ -589,7 +588,7 @@ class DiscoHandler(XMPPHandler, IQHandlerMixin):
528 @param target: The entity the request was sent to.
529 @type target: L{JID<twisted.words.protocols.jabber.jid.JID>}
530 @param nodeIdentifier: The optional node being queried, or C{''}.
531- @type nodeIdentifier: C{unicode}
532+ @type nodeIdentifier: L{str}
533 @return: Deferred with the gathered results from sibling handlers.
534 @rtype: L{defer.Deferred}
535 """
536diff --git a/wokkel/formats.py b/wokkel/formats.py
537index 0eb0be6..972cc7e 100644
538--- a/wokkel/formats.py
539+++ b/wokkel/formats.py
540@@ -9,8 +9,6 @@ Generic payload formats.
541
542 from __future__ import division, absolute_import
543
544-from twisted.python.compat import unicode
545-
546 NS_MOOD = 'http://jabber.org/protocol/mood'
547 NS_TUNE = 'http://jabber.org/protocol/tune'
548
549@@ -55,7 +53,7 @@ class Mood:
550 continue
551
552 if child.name == 'text':
553- text = unicode(child)
554+ text = str(child)
555 else:
556 value = child.name
557
558@@ -76,19 +74,19 @@ class Tune:
559 U{XEP-0118<http://xmpp.org/extensions/xep-0118.html>}.
560
561 @ivar artist: The artist or performer of the song or piece.
562- @type artist: C{unicode}
563+ @type artist: L{str}
564 @ivar length: The duration of the song or piece in seconds.
565- @type length: C{int}
566+ @type length: L{int}
567 @ivar source: The collection (e.g. album) or other source.
568- @type source: C{unicode}
569+ @type source: L{str}
570 @ivar title: The title of the song or piece
571- @type title: C{unicode}
572+ @type title: L{str}
573 @ivar track: A unique identifier for the tune; e.g. the track number within
574 the collection or the specific URI for the object.
575- @type track: C{unicode}
576+ @type track: L{str}
577 @ivar uri: A URI pointing to information about the song, collection, or
578 artist.
579- @type uri: C{str}
580+ @type uri: L{str}
581
582 """
583
584@@ -122,10 +120,10 @@ class Tune:
585 continue
586
587 if child.name in ('artist', 'source', 'title', 'track', 'uri'):
588- setattr(tune, child.name, unicode(child))
589+ setattr(tune, child.name, str(child))
590 elif child.name == 'length':
591 try:
592- tune.length = int(unicode(child))
593+ tune.length = int(str(child))
594 except ValueError:
595 pass
596
597diff --git a/wokkel/generic.py b/wokkel/generic.py
598index 2e975f6..becff8f 100644
599--- a/wokkel/generic.py
600+++ b/wokkel/generic.py
601@@ -13,14 +13,11 @@ from zope.interface import implementer
602
603 from twisted.internet import defer, protocol
604 from twisted.python import reflect
605-from twisted.python.deprecate import deprecated
606 from twisted.words.protocols.jabber import error, jid, xmlstream
607 from twisted.words.protocols.jabber.xmlstream import toResponse
608 from twisted.words.xish import domish, utility
609 from twisted.words.xish.xmlstream import BootstrapMixin
610
611-from incremental import Version
612-
613 from wokkel.iwokkel import IDisco
614 from wokkel.subprotocols import XMPPHandler
615
616@@ -35,7 +32,7 @@ def parseXml(string):
617 Parse serialized XML into a DOM structure.
618
619 @param string: The serialized XML to be parsed, UTF-8 encoded.
620- @type string: C{str}.
621+ @type string: L{str}.
622 @return: The DOM structure, or C{None} on empty or incomplete input.
623 @rtype: L{domish.Element}
624 """
625@@ -332,17 +329,3 @@ class DeferredXmlStreamFactory(BootstrapMixin, protocol.ClientFactory):
626
627 def clientConnectionFailed(self, connector, reason):
628 self.deferred.errback(reason)
629-
630-
631-
632-@deprecated(Version("wokkel", 18, 0, 0), "unicode.encode('idna')")
633-def prepareIDNName(name):
634- """
635- Encode a unicode IDN Domain Name into its ACE equivalent.
636-
637- This will encode the domain labels, separated by allowed dot code points,
638- to their ASCII Compatible Encoding (ACE) equivalent, using punycode. The
639- result is an ASCII byte string of the encoded labels, separated by the
640- standard full stop.
641- """
642- return name.encode('idna')
643diff --git a/wokkel/iwokkel.py b/wokkel/iwokkel.py
644index 30a1057..35383b5 100644
645--- a/wokkel/iwokkel.py
646+++ b/wokkel/iwokkel.py
647@@ -46,7 +46,7 @@ class IDisco(Interface):
648 @param nodeIdentifier: The optional identifier of the node at this
649 entity to retrieve the identify and features of. The default is
650 C{''}, meaning the root node.
651- @type nodeIdentifier: C{unicode}
652+ @type nodeIdentifier: L{str}
653 """
654
655 def getDiscoItems(requestor, target, nodeIdentifier=''):
656@@ -60,7 +60,7 @@ class IDisco(Interface):
657 @param nodeIdentifier: The optional identifier of the node at this
658 entity to retrieve the identify and features of.
659 The default is C{''}, meaning the root node.
660- @type nodeIdentifier: C{unicode}
661+ @type nodeIdentifier: L{str}
662 """
663
664
665@@ -109,7 +109,7 @@ class IPubSubClient(Interface):
666 @param nodeIdentifier: Optional suggestion for the new node's
667 identifier. If omitted, the creation of an
668 instant node will be attempted.
669- @type nodeIdentifier: C{unicode}
670+ @type nodeIdentifier: L{str}
671 @return: a deferred that fires with the identifier of the newly created
672 node. Note that this can differ from the suggested identifier
673 if the publish subscribe service chooses to modify or ignore
674@@ -124,7 +124,7 @@ class IPubSubClient(Interface):
675 @param service: The publish-subscribe service entity.
676 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
677 @param nodeIdentifier: Identifier of the node to be deleted.
678- @type nodeIdentifier: C{unicode}
679+ @type nodeIdentifier: L{str}
680 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
681 """
682
683@@ -135,7 +135,7 @@ class IPubSubClient(Interface):
684 @param service: The publish-subscribe service entity.
685 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
686 @param nodeIdentifier: Identifier of the node to subscribe to.
687- @type nodeIdentifier: C{unicode}
688+ @type nodeIdentifier: L{str}
689 @param subscriber: JID to subscribe to the node.
690 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
691 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
692@@ -148,7 +148,7 @@ class IPubSubClient(Interface):
693 @param service: The publish-subscribe service entity.
694 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
695 @param nodeIdentifier: Identifier of the node to unsubscribe from.
696- @type nodeIdentifier: C{unicode}
697+ @type nodeIdentifier: L{str}
698 @param subscriber: JID to unsubscribe from the node.
699 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
700 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
701@@ -165,9 +165,9 @@ class IPubSubClient(Interface):
702 @param service: The publish-subscribe service entity.
703 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
704 @param nodeIdentifier: Identifier of the node to publish to.
705- @type nodeIdentifier: C{unicode}
706+ @type nodeIdentifier: L{str}
707 @param items: List of item elements.
708- @type items: C{list} of L{Item}
709+ @type items: L{list} of L{Item}
710 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
711 """
712
713@@ -191,12 +191,12 @@ class IPubSubService(Interface):
714 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
715 @param nodeIdentifier: The identifier of the node that was published
716 to.
717- @type nodeIdentifier: C{unicode}
718+ @type nodeIdentifier: L{str}
719 @param notifications: The notifications as tuples of subscriber, the
720 list of subscriptions and the list of items to be notified.
721- @type notifications: C{list} of
722- (L{JID<twisted.words.protocols.jabber.jid.JID>}, C{list} of
723- L{Subscription<wokkel.pubsub.Subscription>}, C{list} of
724+ @type notifications: L{list} of
725+ (L{JID<twisted.words.protocols.jabber.jid.JID>}, L{list} of
726+ L{Subscription<wokkel.pubsub.Subscription>}, L{list} of
727 L{Element<twisted.words.xish.domish.Element>})
728 """
729
730@@ -209,14 +209,14 @@ class IPubSubService(Interface):
731 @param service: The entity the notifications will originate from.
732 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
733 @param nodeIdentifier: The identifier of the node that was deleted.
734- @type nodeIdentifier: C{unicode}
735+ @type nodeIdentifier: L{str}
736 @param subscribers: The subscribers for which a notification should be
737 sent out.
738- @type subscribers: C{list} of
739+ @type subscribers: L{list} of
740 L{JID<twisted.words.protocols.jabber.jid.JID>}
741 @param redirectURI: Optional XMPP URI of another node that subscribers
742 are redirected to.
743- @type redirectURI: C{str}
744+ @type redirectURI: L{str}
745 """
746
747 def publish(requestor, service, nodeIdentifier, items):
748@@ -228,9 +228,9 @@ class IPubSubService(Interface):
749 @param service: The entity the request was addressed to.
750 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
751 @param nodeIdentifier: The identifier of the node to publish to.
752- @type nodeIdentifier: C{unicode}
753+ @type nodeIdentifier: L{str}
754 @param items: The items to be published as elements.
755- @type items: C{list} of C{Element<twisted.words.xish.domish.Element>}
756+ @type items: L{list} of C{Element<twisted.words.xish.domish.Element>}
757 @return: deferred that fires on success.
758 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
759 """
760@@ -244,7 +244,7 @@ class IPubSubService(Interface):
761 @param service: The entity the request was addressed to.
762 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
763 @param nodeIdentifier: The identifier of the node to subscribe to.
764- @type nodeIdentifier: C{unicode}
765+ @type nodeIdentifier: L{str}
766 @param subscriber: The entity to be subscribed.
767 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
768 @return: A deferred that fires with a
769@@ -261,7 +261,7 @@ class IPubSubService(Interface):
770 @param service: The entity the request was addressed to.
771 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
772 @param nodeIdentifier: The identifier of the node to unsubscribe from.
773- @type nodeIdentifier: C{unicode}
774+ @type nodeIdentifier: L{str}
775 @param subscriber: The entity to be unsubscribed.
776 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
777 @return: A deferred that fires with C{None} when unsubscription has
778@@ -277,7 +277,7 @@ class IPubSubService(Interface):
779 @type requestor: L{JID<twisted.words.protocols.jabber.jid.JID>}
780 @param service: The entity the request was addressed to.
781 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
782- @return: A deferred that fires with a C{list} of subscriptions as
783+ @return: A deferred that fires with a L{list} of subscriptions as
784 L{Subscription<wokkel.pubsub.Subscription>}.
785 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
786 """
787@@ -290,9 +290,9 @@ class IPubSubService(Interface):
788 @type requestor: L{JID<twisted.words.protocols.jabber.jid.JID>}
789 @param service: The entity the request was addressed to.
790 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
791- @return: A deferred that fires with a C{list} of affiliations as
792- C{tuple}s of (node identifier as C{unicode}, affiliation state as
793- C{str}). The affiliation can be C{'owner'}, C{'publisher'}, or
794+ @return: A deferred that fires with a L{list} of affiliations as
795+ C{tuple}s of (node identifier as L{str}, affiliation state as
796+ L{str}). The affiliation can be C{'owner'}, C{'publisher'}, or
797 C{'outcast'}.
798 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
799 """
800@@ -308,8 +308,8 @@ class IPubSubService(Interface):
801 @param nodeIdentifier: The suggestion for the identifier of the node
802 to be created. If the request did not include a suggestion for the
803 node identifier, the value is C{None}.
804- @type nodeIdentifier: C{unicode} or C{NoneType}
805- @return: A deferred that fires with a C{unicode} that represents
806+ @type nodeIdentifier: L{str} or C{NoneType}
807+ @return: A deferred that fires with a L{str} that represents
808 the identifier of the new node.
809 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
810 """
811@@ -322,10 +322,10 @@ class IPubSubService(Interface):
812 by option name. The value of each entry represents the specifics for
813 that option in a dictionary:
814
815- - C{'type'} (C{str}): The option's type (see
816+ - C{'type'} (L{str}): The option's type (see
817 L{Field<wokkel.data_form.Field>}'s doc string for possible values).
818- - C{'label'} (C{unicode}): A human readable label for this option.
819- - C{'options'} (C{dict}): Optional list of possible values for this
820+ - C{'label'} (L{str}): A human readable label for this option.
821+ - C{'options'} (L{dict}): Optional list of possible values for this
822 option.
823
824 Example::
825@@ -346,7 +346,7 @@ class IPubSubService(Interface):
826 }
827 }
828
829- @rtype: C{dict}.
830+ @rtype: L{dict}.
831 """
832
833 def getDefaultConfiguration(requestor, service, nodeType):
834@@ -359,11 +359,11 @@ class IPubSubService(Interface):
835 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
836 @param nodeType: The type of node for which the configuration is
837 retrieved, C{'leaf'} or C{'collection'}.
838- @type nodeType: C{str}
839- @return: A deferred that fires with a C{dict} representing the default
840- node configuration. Keys are C{str}s that represent the
841- field name. Values can be of types C{unicode}, C{int} or
842- C{bool}.
843+ @type nodeType: L{str}
844+ @return: A deferred that fires with a L{dict} representing the default
845+ node configuration. Keys are L{str}s that represent the
846+ field name. Values can be of types L{str}, L{int} or
847+ L{bool}.
848 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
849 """
850
851@@ -377,10 +377,10 @@ class IPubSubService(Interface):
852 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
853 @param nodeIdentifier: The identifier of the node to retrieve the
854 configuration from.
855- @type nodeIdentifier: C{unicode}
856- @return: A deferred that fires with a C{dict} representing the node
857- configuration. Keys are C{str}s that represent the field name.
858- Values can be of types C{unicode}, C{int} or C{bool}.
859+ @type nodeIdentifier: L{str}
860+ @return: A deferred that fires with a L{dict} representing the node
861+ configuration. Keys are L{str}s that represent the field name.
862+ Values can be of types L{str}, L{int} or L{bool}.
863 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
864 """
865
866@@ -394,7 +394,7 @@ class IPubSubService(Interface):
867 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
868 @param nodeIdentifier: The identifier of the node to change the
869 configuration of.
870- @type nodeIdentifier: C{unicode}
871+ @type nodeIdentifier: L{str}
872 @return: A deferred that fires with C{None} when the node's
873 configuration has been changed.
874 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
875@@ -410,7 +410,7 @@ class IPubSubService(Interface):
876 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
877 @param nodeIdentifier: The identifier of the node to retrieve items
878 from.
879- @type nodeIdentifier: C{unicode}
880+ @type nodeIdentifier: L{str}
881 """
882
883 def retract(requestor, service, nodeIdentifier, itemIdentifiers):
884@@ -423,7 +423,7 @@ class IPubSubService(Interface):
885 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
886 @param nodeIdentifier: The identifier of the node to retract items
887 from.
888- @type nodeIdentifier: C{unicode}
889+ @type nodeIdentifier: L{str}
890 """
891
892 def purge(requestor, service, nodeIdentifier):
893@@ -435,7 +435,7 @@ class IPubSubService(Interface):
894 @param service: The entity the request was addressed to.
895 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
896 @param nodeIdentifier: The identifier of the node to be purged.
897- @type nodeIdentifier: C{unicode}
898+ @type nodeIdentifier: L{str}
899 """
900
901 def delete(requestor, service, nodeIdentifier):
902@@ -447,7 +447,7 @@ class IPubSubService(Interface):
903 @param service: The entity the request was addressed to.
904 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
905 @param nodeIdentifier: The identifier of the node to be delete.
906- @type nodeIdentifier: C{unicode}
907+ @type nodeIdentifier: L{str}
908 """
909
910
911@@ -472,7 +472,7 @@ class IPubSubResource(Interface):
912 @param service: The publish-subscribe service entity.
913 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
914 @param nodeIdentifier: Identifier of the node to request the info for.
915- @type nodeIdentifier: C{unicode}
916+ @type nodeIdentifier: L{str}
917 @return: A deferred that fires with a dictionary. If not empty,
918 it must have the keys C{'type'} and C{'meta-data'} to keep
919 respectively the node type and a dictionary with the meta
920@@ -491,7 +491,7 @@ class IPubSubResource(Interface):
921 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
922 @param nodeIdentifier: Identifier of the node to request the childs
923 for.
924- @type nodeIdentifier: C{unicode}
925+ @type nodeIdentifier: L{str}
926 @return: A deferred that fires with a list of child node identifiers.
927 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
928 """
929@@ -505,10 +505,10 @@ class IPubSubResource(Interface):
930 by option name. The value of each entry represents the specifics for
931 that option in a dictionary:
932
933- - C{'type'} (C{str}): The option's type (see
934+ - C{'type'} (L{str}): The option's type (see
935 L{Field<wokkel.data_form.Field>}'s doc string for possible values).
936- - C{'label'} (C{unicode}): A human readable label for this option.
937- - C{'options'} (C{dict}): Optional list of possible values for this
938+ - C{'label'} (L{str}): A human readable label for this option.
939+ - C{'options'} (L{dict}): Optional list of possible values for this
940 option.
941
942 Example::
943@@ -529,7 +529,7 @@ class IPubSubResource(Interface):
944 }
945 }
946
947- @rtype: C{dict}.
948+ @rtype: L{dict}.
949 """
950
951
952@@ -574,7 +574,7 @@ class IPubSubResource(Interface):
953
954 @param request: The publish-subscribe request.
955 @type request: L{wokkel.pubsub.PubSubRequest}
956- @return: A deferred that fires with a C{list} of subscriptions as
957+ @return: A deferred that fires with a L{list} of subscriptions as
958 L{Subscription<wokkel.pubsub.Subscription>}.
959 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
960 """
961@@ -586,9 +586,9 @@ class IPubSubResource(Interface):
962
963 @param request: The publish-subscribe request.
964 @type request: L{wokkel.pubsub.PubSubRequest}
965- @return: A deferred that fires with a C{list} of affiliations as
966- C{tuple}s of (node identifier as C{unicode}, affiliation state as
967- C{str}). The affiliation can be C{'owner'}, C{'publisher'}, or
968+ @return: A deferred that fires with a L{list} of affiliations as
969+ C{tuple}s of (node identifier as L{str}, affiliation state as
970+ L{str}). The affiliation can be C{'owner'}, C{'publisher'}, or
971 C{'outcast'}.
972 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
973 """
974@@ -600,7 +600,7 @@ class IPubSubResource(Interface):
975
976 @param request: The publish-subscribe request.
977 @type request: L{wokkel.pubsub.PubSubRequest}
978- @return: A deferred that fires with a C{unicode} that represents
979+ @return: A deferred that fires with a L{str} that represents
980 the identifier of the new node.
981 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
982 """
983@@ -612,10 +612,10 @@ class IPubSubResource(Interface):
984
985 @param request: The publish-subscribe request.
986 @type request: L{wokkel.pubsub.PubSubRequest}
987- @return: A deferred that fires with a C{dict} representing the default
988- node configuration. Keys are C{str}s that represent the
989- field name. Values can be of types C{unicode}, C{int} or
990- C{bool}.
991+ @return: A deferred that fires with a L{dict} representing the default
992+ node configuration. Keys are L{str}s that represent the
993+ field name. Values can be of types L{str}, L{int} or
994+ L{bool}.
995 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
996 """
997
998@@ -626,9 +626,9 @@ class IPubSubResource(Interface):
999
1000 @param request: The publish-subscribe request.
1001 @type request: L{wokkel.pubsub.PubSubRequest}
1002- @return: A deferred that fires with a C{dict} representing the node
1003- configuration. Keys are C{str}s that represent the field name.
1004- Values can be of types C{unicode}, C{int} or C{bool}.
1005+ @return: A deferred that fires with a L{dict} representing the node
1006+ configuration. Keys are L{str}s that represent the field name.
1007+ Values can be of types L{str}, L{int} or L{bool}.
1008 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
1009 """
1010
1011@@ -651,7 +651,7 @@ class IPubSubResource(Interface):
1012
1013 @param request: The publish-subscribe request.
1014 @type request: L{wokkel.pubsub.PubSubRequest}
1015- @return: A deferred that fires with a C{list} of L{pubsub.Item}.
1016+ @return: A deferred that fires with a L{list} of L{pubsub.Item}.
1017 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
1018 """
1019
1020@@ -698,9 +698,9 @@ class IPubSubResource(Interface):
1021
1022 @param request: The publish-subscribe request.
1023 @type request: L{wokkel.pubsub.PubSubRequest}
1024- @return: A deferred that fires with a C{dict} of affiliations with the
1025+ @return: A deferred that fires with a L{dict} of affiliations with the
1026 entity as key (L{JID<twisted.words.protocols.jabber.jid.JID>}) and
1027- the affiliation state as value (C{unicode}). The affiliation can
1028+ the affiliation state as value (L{str}). The affiliation can
1029 be C{u'owner'}, C{u'publisher'}, or C{u'outcast'}.
1030 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
1031
1032@@ -748,7 +748,7 @@ class IMUCClient(Interface):
1033 @type user: L{muc.User}
1034
1035 @param subject: The subject of the given room.
1036- @type subject: C{unicode}
1037+ @type subject: L{str}
1038 """
1039
1040
1041@@ -769,7 +769,7 @@ class IMUCClient(Interface):
1042
1043 @param options: A mapping of field names to values, or C{None} to
1044 cancel.
1045- @type options: C{dict}
1046+ @type options: L{dict}
1047 """
1048
1049
1050@@ -796,14 +796,14 @@ class IMUCClient(Interface):
1051 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1052
1053 @param nick: The nick name for the entitity joining the room.
1054- @type nick: C{unicode}
1055+ @type nick: L{str}
1056
1057 @param historyOptions: Options for conversation history sent by the
1058 room upon joining.
1059 @type historyOptions: L{HistoryOptions}
1060
1061 @param password: Optional password for the room.
1062- @type password: C{unicode}
1063+ @type password: L{str}
1064
1065 @return: A deferred that fires when the entity is in the room or an
1066 error has occurred.
1067@@ -820,7 +820,7 @@ class IMUCClient(Interface):
1068 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1069
1070 @param nick: The new nick name within the room.
1071- @type nick: C{unicode}
1072+ @type nick: L{str}
1073 """
1074
1075
1076@@ -876,7 +876,7 @@ class IMUCClient(Interface):
1077
1078 @param options: A mapping of field names to values, or C{None} to
1079 cancel.
1080- @type options: C{dict}
1081+ @type options: L{dict}
1082 """
1083
1084
1085@@ -890,7 +890,7 @@ class IMUCClient(Interface):
1086 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1087
1088 @param subject: The subject you want to set.
1089- @type subject: C{unicode}
1090+ @type subject: L{str}
1091 """
1092
1093
1094@@ -917,7 +917,7 @@ class IMUCClient(Interface):
1095 holding the original stanza a
1096 L{Element<twisted.words.xish.domish.Element>}, and C{'timestamp'}
1097 with the timestamp.
1098- @type messages: C{list} of
1099+ @type messages: L{list} of
1100 L{Element<twisted.words.xish.domish.Element>}
1101 """
1102
1103@@ -933,7 +933,7 @@ class IMUCClient(Interface):
1104 @type entity: L{JID<twisted.words.protocols.jabber.jid.JID>}
1105
1106 @param reason: The reason for banning the entity.
1107- @type reason: C{unicode}
1108+ @type reason: L{str}
1109
1110 @param sender: The entity sending the request.
1111 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1112@@ -949,10 +949,10 @@ class IMUCClient(Interface):
1113
1114 @param nick: The occupant to be banned.
1115 @type nick: L{JID<twisted.words.protocols.jabber.jid.JID>} or
1116- C{unicode}
1117+ L{str}
1118
1119 @param reason: The reason given for the kick.
1120- @type reason: C{unicode}
1121+ @type reason: L{str}
1122
1123 @param sender: The entity sending the request.
1124 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1125diff --git a/wokkel/muc.py b/wokkel/muc.py
1126index 330664b..4c826f2 100644
1127--- a/wokkel/muc.py
1128+++ b/wokkel/muc.py
1129@@ -17,7 +17,6 @@ from dateutil.tz import tzutc
1130 from zope.interface import implementer
1131
1132 from twisted.internet import defer
1133-from twisted.python.compat import unicode
1134 from twisted.python.constants import Values, ValueConstant
1135 from twisted.words.protocols.jabber import jid, error, xmlstream
1136 from twisted.words.xish import domish
1137@@ -192,7 +191,7 @@ class AdminItem(object):
1138 item.role = element.getAttribute('role')
1139
1140 for child in element.elements(NS_MUC_ADMIN, 'reason'):
1141- item.reason = unicode(child)
1142+ item.reason = str(child)
1143
1144 return item
1145
1146@@ -228,13 +227,13 @@ class DestructionRequest(generic.Request):
1147 Room destruction request.
1148
1149 @param reason: Optional reason for the destruction of this room.
1150- @type reason: L{unicode}.
1151+ @type reason: L{str}.
1152
1153 @param alternate: Optional room JID of an alternate venue.
1154 @type alternate: L{JID<twisted.words.protocols.jabber.jid.JID>}
1155
1156 @param password: Optional password for entering the alternate venue.
1157- @type password: L{unicode}
1158+ @type password: L{str}
1159 """
1160
1161 stanzaType = 'set'
1162@@ -395,10 +394,10 @@ class UserPresence(xmppim.AvailabilityPresence):
1163 Availability presence sent from MUC service to client.
1164
1165 @ivar affiliation: Affiliation of the entity to the room.
1166- @type affiliation: L{unicode}
1167+ @type affiliation: L{str}
1168
1169 @ivar role: Role of the entity in the room.
1170- @type role: L{unicode}
1171+ @type role: L{str}
1172
1173 @ivar entity: The real JID of the entity this presence is from.
1174 @type entity: L{JID<twisted.words.protocols.jabber.jid.JID>}
1175@@ -408,7 +407,7 @@ class UserPresence(xmppim.AvailabilityPresence):
1176 @type mucStatuses: L{Statuses}
1177
1178 @ivar nick: The nick name of the entity in the room.
1179- @type nick: L{unicode}
1180+ @type nick: L{str}
1181 """
1182
1183 affiliation = None
1184@@ -451,7 +450,7 @@ class UserPresence(xmppim.AvailabilityPresence):
1185 self.role = child.getAttribute('role')
1186
1187 for reason in child.elements(NS_MUC_ADMIN, 'reason'):
1188- self.reason = unicode(reason)
1189+ self.reason = str(reason)
1190
1191 # TODO: destroy
1192
1193@@ -595,14 +594,14 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1194 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1195
1196 @param nick: The nick name for the entitity joining the room.
1197- @type nick: L{unicode}
1198+ @type nick: L{str}
1199
1200 @param historyOptions: Options for conversation history sent by the
1201 room upon joining.
1202 @type historyOptions: L{HistoryOptions}
1203
1204 @param password: Optional password for the room.
1205- @type password: L{unicode}
1206+ @type password: L{str}
1207
1208 @return: A deferred that fires when the entity is in the room or an
1209 error has occurred.
1210@@ -628,7 +627,7 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1211 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1212
1213 @param nick: The new nick name within the room.
1214- @type nick: L{unicode}
1215+ @type nick: L{str}
1216 """
1217 occupantJID = jid.JID(tuple=(roomJID.user, roomJID.host, nick))
1218 presence = BasicPresence(recipient=occupantJID)
1219@@ -646,10 +645,10 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1220
1221 @param show: The availability of the entity. Common values are xa,
1222 available, etc
1223- @type show: L{unicode}
1224+ @type show: L{str}
1225
1226 @param status: The current status of the entity.
1227- @type status: L{unicode}
1228+ @type status: L{str}
1229 """
1230 occupantJID = self._roomOccupantMap[roomJID]
1231 presence = BasicPresence(recipient=occupantJID, show=show,
1232@@ -704,7 +703,7 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1233 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1234
1235 @param subject: The subject you want to set.
1236- @type subject: L{unicode}
1237+ @type subject: L{str}
1238 """
1239 message = GroupChat(roomJID.userhostJID(), subject=subject)
1240 self.send(message.toElement())
1241@@ -723,7 +722,7 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1242 @type invitee: L{JID<twisted.words.protocols.jabber.jid.JID>}
1243
1244 @param reason: The reason for the invite.
1245- @type reason: L{unicode}
1246+ @type reason: L{str}
1247 """
1248 message = InviteMessage(recipient=roomJID, invitee=invitee,
1249 reason=reason)
1250@@ -970,7 +969,7 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1251 L{JID<twisted.words.protocols.jabber.jid.JID>}
1252
1253 @param affiliation: The affilation to the entities will acquire.
1254- @type affiliation: L{unicode}
1255+ @type affiliation: L{str}
1256
1257 @param sender: The entity sending the request.
1258 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1259@@ -992,10 +991,10 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1260 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1261
1262 @param nick: The nick name for the user in this room.
1263- @type nick: L{unicode}
1264+ @type nick: L{str}
1265
1266 @param reason: The reason for granting voice to the entity.
1267- @type reason: L{unicode}
1268+ @type reason: L{str}
1269
1270 @param sender: The entity sending the request.
1271 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1272@@ -1015,10 +1014,10 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1273 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1274
1275 @param nick: The nick name for the user in this room.
1276- @type nick: L{unicode}
1277+ @type nick: L{str}
1278
1279 @param reason: The reason for revoking voice from the entity.
1280- @type reason: L{unicode}
1281+ @type reason: L{str}
1282
1283 @param sender: The entity sending the request.
1284 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1285@@ -1035,10 +1034,10 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1286 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1287
1288 @param nick: The nick name for the user in this room.
1289- @type nick: L{unicode}
1290+ @type nick: L{str}
1291
1292 @param reason: The reason for granting moderation to the entity.
1293- @type reason: L{unicode}
1294+ @type reason: L{str}
1295
1296 @param sender: The entity sending the request.
1297 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1298@@ -1058,7 +1057,7 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1299 @type entity: L{JID<twisted.words.protocols.jabber.jid.JID>}
1300
1301 @param reason: The reason for banning the entity.
1302- @type reason: L{unicode}
1303+ @type reason: L{str}
1304
1305 @param sender: The entity sending the request.
1306 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1307@@ -1075,10 +1074,10 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1308 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1309
1310 @param nick: The occupant to be banned.
1311- @type nick: L{unicode}
1312+ @type nick: L{str}
1313
1314 @param reason: The reason given for the kick.
1315- @type reason: L{unicode}
1316+ @type reason: L{str}
1317
1318 @param sender: The entity sending the request.
1319 @type sender: L{JID<twisted.words.protocols.jabber.jid.JID>}
1320@@ -1095,7 +1094,7 @@ class MUCClientProtocol(xmppim.BasePresenceProtocol):
1321 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1322
1323 @param reason: The reason for the destruction of the room.
1324- @type reason: L{unicode}
1325+ @type reason: L{str}
1326
1327 @param alternate: The JID of the room suggested as an alternate venue.
1328 @type alternate: L{JID<twisted.words.protocols.jabber.jid.JID>}
1329@@ -1135,7 +1134,7 @@ class Room(object):
1330 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1331
1332 @ivar nick: The nick name for the client in this room.
1333- @type nick: L{unicode}
1334+ @type nick: L{str}
1335
1336 @ivar occupantJID: The JID of the occupant in the room. Generated from
1337 roomJID and nick.
1338@@ -1190,7 +1189,7 @@ class Room(object):
1339 Get a user from the room's roster.
1340
1341 @param nick: The nick for the user in the MUC room.
1342- @type nick: L{unicode}
1343+ @type nick: L{str}
1344 """
1345 return self.roster.get(nick)
1346
1347@@ -1444,14 +1443,14 @@ class MUCClient(MUCClientProtocol):
1348 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1349
1350 @param nick: The nick name for the entitity joining the room.
1351- @type nick: L{unicode}
1352+ @type nick: L{str}
1353
1354 @param historyOptions: Options for conversation history sent by the
1355 room upon joining.
1356 @type historyOptions: L{HistoryOptions}
1357
1358 @param password: Optional password for the room.
1359- @type password: L{unicode}
1360+ @type password: L{str}
1361
1362 @return: A deferred that fires with the room when the entity is in the
1363 room, or with a failure if an error has occurred.
1364@@ -1488,7 +1487,7 @@ class MUCClient(MUCClientProtocol):
1365 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1366
1367 @param nick: The new nick name within the room.
1368- @type nick: L{unicode}
1369+ @type nick: L{str}
1370 """
1371 def cb(presence):
1372 # Presence confirmation, change the nickname.
1373@@ -1530,10 +1529,10 @@ class MUCClient(MUCClientProtocol):
1374
1375 @param show: The availability of the entity. Common values are xa,
1376 available, etc
1377- @type show: L{unicode}
1378+ @type show: L{str}
1379
1380 @param status: The current status of the entity.
1381- @type status: L{unicode}
1382+ @type status: L{str}
1383 """
1384 room = self._getRoom(roomJID)
1385 d = MUCClientProtocol.status(self, roomJID, show, status)
1386@@ -1549,7 +1548,7 @@ class MUCClient(MUCClientProtocol):
1387 @type roomJID: L{JID<twisted.words.protocols.jabber.jid.JID>}
1388
1389 @param reason: The reason for the destruction of the room.
1390- @type reason: L{unicode}
1391+ @type reason: L{str}
1392
1393 @param alternate: The JID of the room suggested as an alternate venue.
1394 @type alternate: L{JID<twisted.words.protocols.jabber.jid.JID>}
1395diff --git a/wokkel/pubsub.py b/wokkel/pubsub.py
1396index 689a6e2..2eb1b44 100644
1397--- a/wokkel/pubsub.py
1398+++ b/wokkel/pubsub.py
1399@@ -16,7 +16,6 @@ from zope.interface import implementer
1400
1401 from twisted.internet import defer
1402 from twisted.python import log
1403-from twisted.python.compat import StringType, iteritems, unicode
1404 from twisted.words.protocols.jabber import jid, error
1405 from twisted.words.xish import domish
1406
1407@@ -107,20 +106,20 @@ class Subscription(object):
1408
1409 @ivar nodeIdentifier: The identifier of the node subscribed to. The root
1410 node is denoted by L{None}.
1411- @type nodeIdentifier: L{unicode}
1412+ @type nodeIdentifier: L{str}
1413
1414 @ivar subscriber: The subscribing entity.
1415 @type subscriber: L{jid.JID}
1416
1417 @ivar state: The subscription state. One of C{'subscribed'}, C{'pending'},
1418 C{'unconfigured'}.
1419- @type state: L{unicode}
1420+ @type state: L{str}
1421
1422 @ivar options: Optional list of subscription options.
1423 @type options: L{dict}
1424
1425 @ivar subscriptionIdentifier: Optional subscription identifier.
1426- @type subscriptionIdentifier: L{unicode}
1427+ @type subscriptionIdentifier: L{str}
1428 """
1429
1430 def __init__(self, nodeIdentifier, subscriber, state, options=None,
1431@@ -150,7 +149,7 @@ class Subscription(object):
1432 element = domish.Element((defaultUri, 'subscription'))
1433 if self.nodeIdentifier:
1434 element['node'] = self.nodeIdentifier
1435- element['jid'] = unicode(self.subscriber)
1436+ element['jid'] = str(self.subscriber)
1437 element['subscription'] = self.state
1438 if self.subscriptionIdentifier:
1439 element['subid'] = self.subscriptionIdentifier
1440@@ -171,17 +170,17 @@ class Item(domish.Element):
1441 def __init__(self, id=None, payload=None):
1442 """
1443 @param id: optional item identifier
1444- @type id: L{unicode}
1445+ @type id: L{str}
1446 @param payload: optional item payload. Either as a domish element, or
1447 as serialized XML.
1448- @type payload: object providing L{domish.IElement} or L{unicode}.
1449+ @type payload: object providing L{domish.IElement} or L{str}.
1450 """
1451
1452 domish.Element.__init__(self, (None, 'item'))
1453 if id is not None:
1454 self['id'] = id
1455 if payload is not None:
1456- if isinstance(payload, StringType):
1457+ if isinstance(payload, str):
1458 self.addRawXml(payload)
1459 else:
1460 self.addChild(payload)
1461@@ -213,7 +212,7 @@ class PubSubRequest(generic.Stanza):
1462 @type maxItems: L{int}.
1463
1464 @ivar nodeIdentifier: Identifier of the node the request is about.
1465- @type nodeIdentifier: L{unicode}
1466+ @type nodeIdentifier: L{str}
1467
1468 @ivar nodeType: The type of node that should be created, or for which the
1469 configuration is retrieved. C{'leaf'} or C{'collection'}.
1470@@ -227,7 +226,7 @@ class PubSubRequest(generic.Stanza):
1471 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
1472
1473 @ivar subscriptionIdentifier: Identifier for a specific subscription.
1474- @type subscriptionIdentifier: L{unicode}
1475+ @type subscriptionIdentifier: L{str}
1476
1477 @ivar subscriptions: Subscriptions to be modified, as a set of
1478 L{Subscription}.
1479@@ -235,7 +234,7 @@ class PubSubRequest(generic.Stanza):
1480
1481 @ivar affiliations: Affiliations to be modified, as a dictionary of entity
1482 (L{JID<twisted.words.protocols.jabber.jid.JID>} to affiliation
1483- (L{unicode}).
1484+ (L{str}).
1485 @type affiliations: L{dict}
1486 """
1487
1488@@ -277,7 +276,7 @@ class PubSubRequest(generic.Stanza):
1489 }
1490
1491 # Map request verb to request iq type and subelement name
1492- _verbRequestMap = dict(((v, k) for k, v in iteritems(_requestVerbMap)))
1493+ _verbRequestMap = dict(((v, k) for k, v in _requestVerbMap.items()))
1494
1495 # Map request verb to parameter handler names
1496 _parameters = {
1497@@ -487,7 +486,7 @@ class PubSubRequest(generic.Stanza):
1498 Render maximum items into an items request.
1499 """
1500 if self.maxItems:
1501- verbElement['max_items'] = unicode(self.maxItems)
1502+ verbElement['max_items'] = str(self.maxItems)
1503
1504
1505 def _parse_subidOrNone(self, verbElement):
1506@@ -648,7 +647,7 @@ class PubSubEvent(object):
1507 @param recipient: The entity to which the notification was sent.
1508 @type recipient: L{wokkel.pubsub.ItemsEvent}
1509 @param nodeIdentifier: Identifier of the node the event pertains to.
1510- @type nodeIdentifier: L{unicode}
1511+ @type nodeIdentifier: L{str}
1512 @param headers: SHIM headers, see L{wokkel.shim.extractHeaders}.
1513 @type headers: L{dict}
1514 """
1515@@ -772,7 +771,7 @@ class PubSubClient(XMPPHandler):
1516 @param service: The publish subscribe service to create the node at.
1517 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1518 @param nodeIdentifier: Optional suggestion for the id of the node.
1519- @type nodeIdentifier: L{unicode}
1520+ @type nodeIdentifier: L{str}
1521 @param options: Optional node configuration options.
1522 @type options: L{dict}
1523 """
1524@@ -807,7 +806,7 @@ class PubSubClient(XMPPHandler):
1525 @param service: The publish subscribe service to delete the node from.
1526 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1527 @param nodeIdentifier: The identifier of the node.
1528- @type nodeIdentifier: L{unicode}
1529+ @type nodeIdentifier: L{str}
1530 """
1531 request = PubSubRequest('delete')
1532 request.recipient = service
1533@@ -825,7 +824,7 @@ class PubSubClient(XMPPHandler):
1534 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1535
1536 @param nodeIdentifier: The identifier of the node.
1537- @type nodeIdentifier: L{unicode}
1538+ @type nodeIdentifier: L{str}
1539
1540 @param subscriber: The entity to subscribe to the node. This entity
1541 will get notifications of new published items.
1542@@ -877,13 +876,13 @@ class PubSubClient(XMPPHandler):
1543 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1544
1545 @param nodeIdentifier: The identifier of the node.
1546- @type nodeIdentifier: L{unicode}
1547+ @type nodeIdentifier: L{str}
1548
1549 @param subscriber: The entity to unsubscribe from the node.
1550 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
1551
1552 @param subscriptionIdentifier: Optional subscription identifier.
1553- @type subscriptionIdentifier: L{unicode}
1554+ @type subscriptionIdentifier: L{str}
1555 """
1556 request = PubSubRequest('unsubscribe')
1557 request.recipient = service
1558@@ -901,7 +900,7 @@ class PubSubClient(XMPPHandler):
1559 @param service: The publish subscribe service that keeps the node.
1560 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1561 @param nodeIdentifier: The identifier of the node.
1562- @type nodeIdentifier: L{unicode}
1563+ @type nodeIdentifier: L{str}
1564 @param items: Optional list of L{Item}s to publish.
1565 @type items: L{list}
1566 """
1567@@ -922,7 +921,7 @@ class PubSubClient(XMPPHandler):
1568 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1569
1570 @param nodeIdentifier: The identifier of the node.
1571- @type nodeIdentifier: L{unicode}
1572+ @type nodeIdentifier: L{str}
1573
1574 @param maxItems: Optional limit on the number of retrieved items.
1575 @type maxItems: L{int}
1576@@ -930,10 +929,10 @@ class PubSubClient(XMPPHandler):
1577 @param subscriptionIdentifier: Optional subscription identifier. In
1578 case the node has been subscribed to multiple times, this narrows
1579 the results to the specific subscription.
1580- @type subscriptionIdentifier: L{unicode}
1581+ @type subscriptionIdentifier: L{str}
1582
1583 @param itemIdentifiers: Identifiers of the items to be retrieved.
1584- @type itemIdentifiers: L{set} of L{unicode}
1585+ @type itemIdentifiers: L{set} of L{str}
1586 """
1587 request = PubSubRequest('items')
1588 request.recipient = service
1589@@ -965,13 +964,13 @@ class PubSubClient(XMPPHandler):
1590 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1591
1592 @param nodeIdentifier: The identifier of the node.
1593- @type nodeIdentifier: L{unicode}
1594+ @type nodeIdentifier: L{str}
1595
1596 @param subscriber: The entity subscribed to the node.
1597 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
1598
1599 @param subscriptionIdentifier: Optional subscription identifier.
1600- @type subscriptionIdentifier: L{unicode}
1601+ @type subscriptionIdentifier: L{str}
1602
1603 @rtype: L{data_form.Form}
1604 """
1605@@ -1002,7 +1001,7 @@ class PubSubClient(XMPPHandler):
1606 @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
1607
1608 @param nodeIdentifier: The identifier of the node.
1609- @type nodeIdentifier: L{unicode}
1610+ @type nodeIdentifier: L{str}
1611
1612 @param subscriber: The entity subscribed to the node.
1613 @type subscriber: L{JID<twisted.words.protocols.jabber.jid.JID>}
1614@@ -1011,7 +1010,7 @@ class PubSubClient(XMPPHandler):
1615 @type options: L{dict}.
1616
1617 @param subscriptionIdentifier: Optional subscription identifier.
1618- @type subscriptionIdentifier: L{unicode}
1619+ @type subscriptionIdentifier: L{str}
1620 """
1621 request = PubSubRequest('optionsSet')
1622 request.recipient = service
1623@@ -1356,7 +1355,7 @@ class PubSubService(XMPPHandler, IQHandlerMixin):
1624 if request.nodeIdentifier:
1625 affiliations['node'] = request.nodeIdentifier
1626
1627- for entity, affiliation in iteritems(result):
1628+ for entity, affiliation in result.items():
1629 item = affiliations.addElement('affiliation')
1630 item['jid'] = entity.full()
1631 item['affiliation'] = affiliation
1632diff --git a/wokkel/server.py b/wokkel/server.py
1633index 54517a2..fbd8452 100644
1634--- a/wokkel/server.py
1635+++ b/wokkel/server.py
1636@@ -22,7 +22,6 @@ from zope.interface import implementer
1637 from twisted.internet import defer, reactor
1638 from twisted.names.srvconnect import SRVConnector
1639 from twisted.python import log, randbytes
1640-from twisted.python.compat import iteritems, unicode
1641 from twisted.words.protocols.jabber import error, ijabber, jid, xmlstream
1642 from twisted.words.xish import domish
1643
1644@@ -40,15 +39,15 @@ def generateKey(secret, receivingServer, originatingServer, streamID):
1645
1646 @param secret: the shared secret known to the Originating Server and
1647 Authoritive Server.
1648- @type secret: L{unicode}
1649+ @type secret: L{str}
1650 @param receivingServer: the Receiving Server host name.
1651- @type receivingServer: L{unicode}
1652+ @type receivingServer: L{str}
1653 @param originatingServer: the Originating Server host name.
1654- @type originatingServer: L{unicode}
1655+ @type originatingServer: L{str}
1656 @param streamID: the Stream ID as generated by the Receiving Server.
1657- @type streamID: L{unicode}
1658+ @type streamID: L{str}
1659 @return: hexadecimal digest of the generated key.
1660- @type: C{str}
1661+ @type: L{str}
1662 """
1663
1664 hashObject = sha256()
1665@@ -340,7 +339,7 @@ class XMPPServerListenAuthenticator(xmlstream.ListenAuthenticator):
1666 try:
1667 if xmlstream.NS_STREAMS != rootElement.uri or \
1668 self.namespace != self.xmlstream.namespace or \
1669- ('db', NS_DIALBACK) not in iteritems(rootElement.localPrefixes):
1670+ ('db', NS_DIALBACK) not in rootElement.localPrefixes.items():
1671 raise error.StreamError('invalid-namespace')
1672
1673 if targetDomain and targetDomain not in self.service.domains:
1674@@ -379,7 +378,7 @@ class XMPPServerListenAuthenticator(xmlstream.ListenAuthenticator):
1675 raise error.StreamError('invalid-from')
1676
1677 streamID = verify.getAttribute('id', '')
1678- key = unicode(verify)
1679+ key = str(verify)
1680
1681 calculatedKey = generateKey(self.service.secret, receivingServer,
1682 originatingServer, streamID)
1683@@ -415,7 +414,7 @@ class XMPPServerListenAuthenticator(xmlstream.ListenAuthenticator):
1684
1685 receivingServer = result['to']
1686 originatingServer = result['from']
1687- key = unicode(result)
1688+ key = str(result)
1689
1690 d = self.service.validateConnection(receivingServer, originatingServer,
1691 self.xmlstream.sid, key)
1692diff --git a/wokkel/shim.py b/wokkel/shim.py
1693index 3b12349..85a0848 100644
1694--- a/wokkel/shim.py
1695+++ b/wokkel/shim.py
1696@@ -12,7 +12,6 @@ U{XEP-0131<http://xmpp.org/extensions/xep-0131.html>}.
1697
1698 from __future__ import division, absolute_import
1699
1700-from twisted.python.compat import unicode
1701 from twisted.words.xish import domish
1702
1703 NS_SHIM = "http://jabber.org/protocol/shim"
1704@@ -30,7 +29,7 @@ def extractHeaders(stanza):
1705 @param stanza: The stanza to extract headers from.
1706 @type stanza: L{Element<twisted.words.xish.domish.Element>}
1707 @return: Headers as a mapping from header name to a list of values.
1708- @rtype: C{dict}
1709+ @rtype: L{dict}
1710 """
1711 headers = {}
1712
1713@@ -38,6 +37,6 @@ def extractHeaders(stanza):
1714 'headers', NS_SHIM):
1715 for header in domish.generateElementsQNamed(element.children,
1716 'header', NS_SHIM):
1717- headers.setdefault(header['name'], []).append(unicode(header))
1718+ headers.setdefault(header['name'], []).append(str(header))
1719
1720 return headers
1721diff --git a/wokkel/subprotocols.py b/wokkel/subprotocols.py
1722index f0a6090..b4cde14 100644
1723--- a/wokkel/subprotocols.py
1724+++ b/wokkel/subprotocols.py
1725@@ -14,7 +14,6 @@ from zope.interface import implementer
1726 from twisted.internet import defer
1727 from twisted.internet.error import ConnectionDone
1728 from twisted.python import failure, log
1729-from twisted.python.compat import iteritems, itervalues
1730 from twisted.python.deprecate import deprecatedModuleAttribute
1731 from twisted.words.protocols.jabber import error, ijabber, xmlstream
1732 from twisted.words.protocols.jabber.xmlstream import toResponse
1733@@ -130,15 +129,15 @@ class StreamManager(XMPPHandlerCollection):
1734 @ivar xmlstream: currently managed XML stream
1735 @type xmlstream: L{XmlStream}
1736 @ivar logTraffic: if true, log all traffic.
1737- @type logTraffic: C{bool}
1738+ @type logTraffic: L{bool}
1739 @ivar _initialized: Whether the stream represented by L{xmlstream} has
1740 been initialized. This is used when caching outgoing
1741 stanzas.
1742- @type _initialized: C{bool}
1743+ @type _initialized: L{bool}
1744 @ivar _packetQueue: internal buffer of unsent data. See L{send} for details.
1745 @type _packetQueue: L{list}
1746 @ivar timeout: Default IQ request timeout in seconds.
1747- @type timeout: C{int}
1748+ @type timeout: L{int}
1749 @ivar _reactor: A provider of L{IReactorTime} to track timeouts.
1750 """
1751 timeout = None
1752@@ -277,7 +276,7 @@ class StreamManager(XMPPHandlerCollection):
1753 # deferreds will never be fired.
1754 iqDeferreds = self._iqDeferreds
1755 self._iqDeferreds = {}
1756- for d in itervalues(iqDeferreds):
1757+ for d in iqDeferreds.values():
1758 d.errback(reason)
1759
1760
1761@@ -420,7 +419,7 @@ class IQHandlerMixin(object):
1762
1763 @cvar iqHandlers: Mapping from XPath queries (as a string) to the method
1764 name that will handle requests that match the query.
1765- @type iqHandlers: C{dict}
1766+ @type iqHandlers: L{dict}
1767 """
1768
1769 iqHandlers = None
1770@@ -455,7 +454,7 @@ class IQHandlerMixin(object):
1771 return error.StanzaError('internal-server-error').toResponse(iq)
1772
1773 handler = None
1774- for queryString, method in iteritems(self.iqHandlers):
1775+ for queryString, method in self.iqHandlers.items():
1776 if xpath.internQuery(queryString).matches(iq):
1777 handler = getattr(self, method)
1778
1779diff --git a/wokkel/test/helpers.py b/wokkel/test/helpers.py
1780index 102b3dc..c76a4a0 100644
1781--- a/wokkel/test/helpers.py
1782+++ b/wokkel/test/helpers.py
1783@@ -8,7 +8,6 @@ Unit test helpers.
1784 from __future__ import division, absolute_import
1785
1786 from twisted.internet import defer
1787-from twisted.python.compat import iteritems
1788 from twisted.words.xish import xpath
1789 from twisted.words.xish.utility import EventDispatcher
1790
1791@@ -79,14 +78,14 @@ class TestableRequestHandlerMixin(object):
1792 Find a handler and call it directly.
1793
1794 @param xml: XML stanza that may yield a handler being called.
1795- @type xml: C{str}.
1796+ @type xml: L{str}.
1797 @return: Deferred that fires with the result of a handler for this
1798 stanza. If no handler was found, the deferred has its errback
1799 called with a C{NotImplementedError} exception.
1800 """
1801 handler = None
1802 iq = parseXml(xml)
1803- for queryString, method in iteritems(self.service.iqHandlers):
1804+ for queryString, method in self.service.iqHandlers.items():
1805 if xpath.internQuery(queryString).matches(iq):
1806 handler = getattr(self.service, method)
1807
1808diff --git a/wokkel/test/test_client.py b/wokkel/test/test_client.py
1809index ef367f7..ef9adfd 100644
1810--- a/wokkel/test/test_client.py
1811+++ b/wokkel/test/test_client.py
1812@@ -8,6 +8,7 @@ Tests for L{wokkel.client}.
1813 from __future__ import division, absolute_import
1814
1815 from twisted.internet import defer
1816+from twisted.python.compat import nativeString
1817 from twisted.trial import unittest
1818 from twisted.words.protocols.jabber import xmlstream
1819 from twisted.words.protocols.jabber.client import XMPPAuthenticator
1820@@ -152,7 +153,7 @@ class ClientCreatorTest(unittest.TestCase):
1821
1822 def cb(connector):
1823 self.assertEqual('xmpp-client', connector.service)
1824- self.assertEqual('example.org', connector.domain)
1825+ self.assertEqual('example.org', nativeString(connector.domain))
1826 self.assertEqual(factory, connector.factory)
1827
1828 def connect(connector):
1829diff --git a/wokkel/test/test_data_form.py b/wokkel/test/test_data_form.py
1830index 60e36f4..246f1c5 100644
1831--- a/wokkel/test/test_data_form.py
1832+++ b/wokkel/test/test_data_form.py
1833@@ -10,7 +10,6 @@ from __future__ import division, absolute_import
1834 from zope.interface import verify
1835 from zope.interface.common.mapping import IIterableMapping
1836
1837-from twisted.python.compat import unicode, _PY3
1838 from twisted.trial import unittest
1839 from twisted.words.xish import domish
1840 from twisted.words.protocols.jabber import jid
1841@@ -34,7 +33,7 @@ class OptionTest(unittest.TestCase):
1842 self.assertEqual('option', element.name)
1843 self.assertEqual(NS_X_DATA, element.uri)
1844 self.assertEqual(NS_X_DATA, element.value.uri)
1845- self.assertEqual('value', unicode(element.value))
1846+ self.assertEqual('value', str(element.value))
1847 self.assertFalse(element.hasAttribute('label'))
1848
1849
1850@@ -48,7 +47,7 @@ class OptionTest(unittest.TestCase):
1851 self.assertEqual('option', element.name)
1852 self.assertEqual(NS_X_DATA, element.uri)
1853 self.assertEqual(NS_X_DATA, element.value.uri)
1854- self.assertEqual('value', unicode(element.value))
1855+ self.assertEqual('value', str(element.value))
1856 self.assertEqual('label', element['label'])
1857
1858
1859@@ -225,7 +224,7 @@ class FieldTest(unittest.TestCase):
1860 child = element.children[0]
1861 self.assertEqual('desc', child.name)
1862 self.assertEqual(NS_X_DATA, child.uri)
1863- self.assertEqual(u'My desc', unicode(child))
1864+ self.assertEqual(u'My desc', str(child))
1865
1866
1867 def test_toElementRequired(self):
1868@@ -248,7 +247,7 @@ class FieldTest(unittest.TestCase):
1869 field = data_form.Field(fieldType='jid-single', var='test',
1870 value=jid.JID(u'test@example.org'))
1871 element = field.toElement()
1872- self.assertEqual(u'test@example.org', unicode(element.value))
1873+ self.assertEqual(u'test@example.org', str(element.value))
1874
1875
1876 def test_toElementJIDTextSingle(self):
1877@@ -258,7 +257,7 @@ class FieldTest(unittest.TestCase):
1878 field = data_form.Field(fieldType='text-single', var='test',
1879 value=jid.JID(u'test@example.org'))
1880 element = field.toElement()
1881- self.assertEqual(u'test@example.org', unicode(element.value))
1882+ self.assertEqual(u'test@example.org', str(element.value))
1883
1884
1885 def test_toElementBoolean(self):
1886@@ -268,7 +267,7 @@ class FieldTest(unittest.TestCase):
1887 field = data_form.Field(fieldType='boolean', var='test',
1888 value=True)
1889 element = field.toElement()
1890- self.assertEqual(u'true', unicode(element.value))
1891+ self.assertEqual(u'true', str(element.value))
1892
1893
1894 def test_toElementBooleanTextSingle(self):
1895@@ -277,7 +276,7 @@ class FieldTest(unittest.TestCase):
1896 """
1897 field = data_form.Field(var='test', value=True)
1898 element = field.toElement()
1899- self.assertEqual(u'true', unicode(element.value))
1900+ self.assertEqual(u'true', str(element.value))
1901
1902
1903 def test_toElementNoType(self):
1904@@ -396,7 +395,7 @@ class FieldTest(unittest.TestCase):
1905
1906 def test_fromElementValueTextSingle(self):
1907 """
1908- Parsed text-single field values should be of type C{unicode}.
1909+ Parsed text-single field values should be of type L{str}.
1910 """
1911 element = domish.Element((NS_X_DATA, 'field'))
1912 element['type'] = 'text-single'
1913@@ -407,7 +406,7 @@ class FieldTest(unittest.TestCase):
1914
1915 def test_fromElementValueJID(self):
1916 """
1917- Parsed jid-single field values should be of type C{unicode}.
1918+ Parsed jid-single field values should be of type L{str}.
1919 """
1920 element = domish.Element((NS_X_DATA, 'field'))
1921 element['type'] = 'jid-single'
1922@@ -418,7 +417,7 @@ class FieldTest(unittest.TestCase):
1923
1924 def test_fromElementValueJIDMalformed(self):
1925 """
1926- Parsed jid-single field values should be of type C{unicode}.
1927+ Parsed jid-single field values should be of type L{str}.
1928
1929 No validation should be done at this point, so invalid JIDs should
1930 also be passed as-is.
1931@@ -432,7 +431,7 @@ class FieldTest(unittest.TestCase):
1932
1933 def test_fromElementValueBoolean(self):
1934 """
1935- Parsed boolean field values should be of type C{unicode}.
1936+ Parsed boolean field values should be of type L{str}.
1937 """
1938 element = domish.Element((NS_X_DATA, 'field'))
1939 element['type'] = 'boolean'
1940@@ -561,7 +560,7 @@ class FormTest(unittest.TestCase):
1941 title = elements[0]
1942 self.assertEqual('title', title.name)
1943 self.assertEqual(NS_X_DATA, title.uri)
1944- self.assertEqual('Bot configuration', unicode(title))
1945+ self.assertEqual('Bot configuration', str(title))
1946
1947
1948 def test_toElementInstructions(self):
1949@@ -576,7 +575,7 @@ class FormTest(unittest.TestCase):
1950 instructions = elements[0]
1951 self.assertEqual('instructions', instructions.name)
1952 self.assertEqual(NS_X_DATA, instructions.uri)
1953- self.assertEqual('Fill out this form!', unicode(instructions))
1954+ self.assertEqual('Fill out this form!', str(instructions))
1955
1956
1957 def test_toElementInstructionsMultiple(self):
1958@@ -593,10 +592,10 @@ class FormTest(unittest.TestCase):
1959 instructions2 = elements[1]
1960 self.assertEqual('instructions', instructions1.name)
1961 self.assertEqual(NS_X_DATA, instructions1.uri)
1962- self.assertEqual('Fill out this form!', unicode(instructions1))
1963+ self.assertEqual('Fill out this form!', str(instructions1))
1964 self.assertEqual('instructions', instructions2.name)
1965 self.assertEqual(NS_X_DATA, instructions2.uri)
1966- self.assertEqual('no really', unicode(instructions2))
1967+ self.assertEqual('no really', str(instructions2))
1968
1969
1970 def test_toElementFormType(self):
1971@@ -613,7 +612,7 @@ class FormTest(unittest.TestCase):
1972 self.assertEqual(NS_X_DATA, formTypeField.uri)
1973 self.assertEqual('FORM_TYPE', formTypeField['var'])
1974 self.assertEqual('hidden', formTypeField['type'])
1975- self.assertEqual('jabber:bot', unicode(formTypeField.value))
1976+ self.assertEqual('jabber:bot', str(formTypeField.value))
1977
1978
1979 def test_toElementFields(self):
1980@@ -1091,7 +1090,7 @@ class FormTest(unittest.TestCase):
1981 self.assertNotIn('features', form)
1982
1983
1984- def test_iterkeys(self):
1985+ def test_keys(self):
1986 """
1987 Iterating over the keys of a form yields all field names.
1988 """
1989@@ -1101,10 +1100,10 @@ class FormTest(unittest.TestCase):
1990 values=['news', 'search'])]
1991 form = data_form.Form('submit', fields=fields)
1992 self.assertEqual(set(['botname', 'public', 'features']),
1993- set(form.iterkeys()))
1994+ set(form.keys()))
1995
1996
1997- def test_itervalues(self):
1998+ def test_values(self):
1999 """
2000 Iterating over the values of a form yields all field values.
2001 """
2002@@ -1112,63 +1111,19 @@ class FormTest(unittest.TestCase):
2003 data_form.Field('boolean', var='public', value=True)]
2004 form = data_form.Form('submit', fields=fields)
2005 self.assertEqual(set(['The Jabber Bot', True]),
2006- set(form.itervalues()))
2007-
2008-
2009- def test_iteritems(self):
2010- """
2011- Iterating over the values of a form yields all item tuples.
2012- """
2013- fields = [data_form.Field(var='botname', value='The Jabber Bot'),
2014- data_form.Field('boolean', var='public', value=True)]
2015- form = data_form.Form('submit', fields=fields)
2016- self.assertEqual(set([('botname', 'The Jabber Bot'),
2017- ('public', True)]),
2018- set(form.iteritems()))
2019-
2020-
2021- def test_keys(self):
2022- """
2023- Getting the keys of a form yields a list of field names.
2024- """
2025- fields = [data_form.Field(var='botname', value='The Jabber Bot'),
2026- data_form.Field('boolean', var='public', value=True),
2027- data_form.Field('list-multi', var='features',
2028- values=['news', 'search'])]
2029- form = data_form.Form('submit', fields=fields)
2030- keys = form.keys()
2031- if not _PY3:
2032- self.assertIsInstance(keys, list)
2033- self.assertEqual(set(['botname', 'public', 'features']),
2034- set(keys))
2035-
2036-
2037- def test_values(self):
2038- """
2039- Getting the values of a form yields a list of field values.
2040- """
2041- fields = [data_form.Field(var='botname', value='The Jabber Bot'),
2042- data_form.Field('boolean', var='public', value=True)]
2043- form = data_form.Form('submit', fields=fields)
2044- values = form.values()
2045- if not _PY3:
2046- self.assertIsInstance(values, list)
2047- self.assertEqual(set(['The Jabber Bot', True]), set(values))
2048+ set(form.values()))
2049
2050
2051 def test_items(self):
2052 """
2053- Iterating over the values of a form yields a list of all item tuples.
2054+ Iterating over the values of a form yields all item tuples.
2055 """
2056 fields = [data_form.Field(var='botname', value='The Jabber Bot'),
2057 data_form.Field('boolean', var='public', value=True)]
2058 form = data_form.Form('submit', fields=fields)
2059- items = form.items()
2060- if not _PY3:
2061- self.assertIsInstance(items, list)
2062 self.assertEqual(set([('botname', 'The Jabber Bot'),
2063 ('public', True)]),
2064- set(items))
2065+ set(form.items()))
2066
2067
2068 def test_getValues(self):
2069diff --git a/wokkel/test/test_generic.py b/wokkel/test/test_generic.py
2070index 94c39e5..4e4ab45 100644
2071--- a/wokkel/test/test_generic.py
2072+++ b/wokkel/test/test_generic.py
2073@@ -7,19 +7,12 @@ Tests for L{wokkel.generic}.
2074
2075 from __future__ import division, absolute_import
2076
2077-import re
2078-
2079 from zope.interface.verify import verifyObject
2080
2081-from twisted.python import deprecate
2082-from twisted.python.compat import unicode
2083 from twisted.trial import unittest
2084-from twisted.trial.util import suppress as SUPPRESS
2085 from twisted.words.xish import domish
2086 from twisted.words.protocols.jabber.jid import JID
2087
2088-from incremental import Version
2089-
2090 from wokkel import generic
2091 from wokkel.iwokkel import IDisco
2092 from wokkel.test.helpers import XmlStreamStub
2093@@ -66,11 +59,11 @@ class VersionHandlerTest(unittest.TestCase):
2094 elements = list(domish.generateElementsQNamed(response.query.children,
2095 'name', NS_VERSION))
2096 self.assertEquals(1, len(elements))
2097- self.assertEquals('Test', unicode(elements[0]))
2098+ self.assertEquals('Test', str(elements[0]))
2099 elements = list(domish.generateElementsQNamed(response.query.children,
2100 'version', NS_VERSION))
2101 self.assertEquals(1, len(elements))
2102- self.assertEquals('0.1.0', unicode(elements[0]))
2103+ self.assertEquals('0.1.0', str(elements[0]))
2104
2105
2106
2107@@ -314,67 +307,3 @@ class RequestTest(unittest.TestCase):
2108
2109 request = SetRequest()
2110 self.assertEqual('set', request.stanzaType)
2111-
2112-
2113-
2114-class PrepareIDNNameTests(unittest.TestCase):
2115- """
2116- Tests for L{wokkel.generic.prepareIDNName}.
2117- """
2118-
2119- suppress = [SUPPRESS(category=DeprecationWarning,
2120- message=re.escape(
2121- deprecate.getDeprecationWarningString(
2122- generic.prepareIDNName,
2123- Version("wokkel", 18, 0, 0),
2124- replacement="unicode.encode('idna')")))]
2125-
2126-
2127- def test_deprecated(self):
2128- """
2129- prepareIDNName is deprecated.
2130- """
2131- self.callDeprecated((Version("wokkel", 18, 0, 0),
2132- "unicode.encode('idna')"),
2133- generic.prepareIDNName, ("example.com"))
2134- test_deprecated.suppress = []
2135-
2136-
2137- def test_unicode(self):
2138- """
2139- A unicode all-ASCII name is converted to an ASCII byte string.
2140- """
2141- name = u"example.com"
2142- result = generic.prepareIDNName(name)
2143- self.assertEqual(b"example.com", result)
2144-
2145-
2146- def test_unicodeNonASCII(self):
2147- """
2148- A unicode with non-ASCII is converted to its ACE equivalent.
2149- """
2150- name = u"\u00e9chec.example.com"
2151- result = generic.prepareIDNName(name)
2152- self.assertEqual(b"xn--chec-9oa.example.com", result)
2153-
2154-
2155- def test_unicodeHalfwidthIdeographicFullStop(self):
2156- """
2157- Exotic dots in unicode names are converted to Full Stop.
2158- """
2159- name = u"\u00e9chec.example\uff61com"
2160- result = generic.prepareIDNName(name)
2161- self.assertEqual(b"xn--chec-9oa.example.com", result)
2162-
2163-
2164- def test_unicodeTrailingDot(self):
2165- """
2166- Unicode names with trailing dots retain the trailing dot.
2167-
2168- L{encodings.idna.ToASCII} doesn't allow the empty string as the input,
2169- hence the implementation needs to strip a trailing dot, and re-add it
2170- after encoding the labels.
2171- """
2172- name = u"example.com."
2173- result = generic.prepareIDNName(name)
2174- self.assertEqual(b"example.com.", result)
2175diff --git a/wokkel/test/test_muc.py b/wokkel/test/test_muc.py
2176index f690d05..282a8a1 100644
2177--- a/wokkel/test/test_muc.py
2178+++ b/wokkel/test/test_muc.py
2179@@ -14,7 +14,6 @@ from zope.interface import verify
2180
2181 from twisted.trial import unittest
2182 from twisted.internet import defer, task
2183-from twisted.python.compat import iteritems, unicode
2184 from twisted.words.xish import domish, xpath
2185 from twisted.words.protocols.jabber.jid import JID
2186 from twisted.words.protocols.jabber.error import StanzaError
2187@@ -81,7 +80,7 @@ class StatusCodeTest(unittest.TestCase):
2188 332: 'removed-shutdown',
2189 }
2190
2191- for code, condition in iteritems(codes):
2192+ for code, condition in codes.items():
2193 constantName = condition.replace('-', '_').upper()
2194 self.assertEqual(getattr(muc.STATUS_CODE, constantName),
2195 muc.STATUS_CODE.lookupByValue(code))
2196@@ -757,7 +756,7 @@ class MUCClientProtocolTest(unittest.TestCase):
2197 self.assertEquals('message', message.name)
2198 self.assertEquals(self.roomJID.full(), message.getAttribute('to'))
2199 self.assertEquals('groupchat', message.getAttribute('type'))
2200- self.assertEquals(u'This is a test', unicode(message.body))
2201+ self.assertEquals(u'This is a test', str(message.body))
2202
2203
2204 def test_chat(self):
2205@@ -773,7 +772,7 @@ class MUCClientProtocolTest(unittest.TestCase):
2206 self.assertEquals('message', message.name)
2207 self.assertEquals(otherOccupantJID.full(), message.getAttribute('to'))
2208 self.assertEquals('chat', message.getAttribute('type'))
2209- self.assertEquals(u'This is a test', unicode(message.body))
2210+ self.assertEquals(u'This is a test', str(message.body))
2211
2212
2213 def test_subject(self):
2214@@ -787,7 +786,7 @@ class MUCClientProtocolTest(unittest.TestCase):
2215 self.assertEquals('message', message.name)
2216 self.assertEquals(self.roomJID.full(), message.getAttribute('to'))
2217 self.assertEquals('groupchat', message.getAttribute('type'))
2218- self.assertEquals(u'This is a test', unicode(message.subject))
2219+ self.assertEquals(u'This is a test', str(message.subject))
2220
2221
2222 def test_invite(self):
2223@@ -806,7 +805,7 @@ class MUCClientProtocolTest(unittest.TestCase):
2224 self.assertEquals(muc.NS_MUC_USER, message.x.invite.uri)
2225 self.assertEquals(invitee.full(), message.x.invite.getAttribute('to'))
2226 self.assertEquals(muc.NS_MUC_USER, message.x.invite.reason.uri)
2227- self.assertEquals(u'This is a test', unicode(message.x.invite.reason))
2228+ self.assertEquals(u'This is a test', str(message.x.invite.reason))
2229
2230
2231 def test_getRegisterForm(self):
2232@@ -1399,7 +1398,7 @@ class MUCClientProtocolTest(unittest.TestCase):
2233 nodes = xpath.queryForNodes(query, iq)
2234 self.assertNotIdentical(None, nodes, 'Bad configure request')
2235 destroy = nodes[0]
2236- self.assertEquals('Time to leave', unicode(destroy.reason))
2237+ self.assertEquals('Time to leave', str(destroy.reason))
2238
2239 response = toResponse(iq, 'result')
2240 self.stub.send(response)
2241diff --git a/wokkel/test/test_server.py b/wokkel/test/test_server.py
2242index 3e3c923..1efb6e5 100644
2243--- a/wokkel/test/test_server.py
2244+++ b/wokkel/test/test_server.py
2245@@ -8,7 +8,11 @@ Tests for L{wokkel.server}.
2246 from __future__ import division, absolute_import
2247 from twisted.internet import defer
2248 from twisted.python import failure
2249-from twisted.test.proto_helpers import StringTransport
2250+try:
2251+ from twisted.internet.testing import StringTransport
2252+except ImportError:
2253+ from twisted.test.proto_helpers import StringTransport
2254+
2255 from twisted.trial import unittest
2256 from twisted.words.protocols.jabber import error, jid, xmlstream
2257 from twisted.words.xish import domish
2258diff --git a/wokkel/test/test_shim.py b/wokkel/test/test_shim.py
2259index ded4679..d3b76cf 100644
2260--- a/wokkel/test/test_shim.py
2261+++ b/wokkel/test/test_shim.py
2262@@ -9,7 +9,6 @@ Tests for {wokkel.shim}.
2263
2264 from __future__ import division, absolute_import
2265
2266-from twisted.python.compat import unicode
2267 from twisted.trial import unittest
2268
2269 from wokkel import shim
2270@@ -36,7 +35,7 @@ class HeadersTest(unittest.TestCase):
2271 self.assertEquals(NS_SHIM, header.uri)
2272 self.assertEquals('header', header.name)
2273 self.assertEquals('Urgency', header['name'])
2274- self.assertEquals('high', unicode(header))
2275+ self.assertEquals('high', str(header))
2276
2277
2278 def test_headerRepeated(self):
2279@@ -47,7 +46,7 @@ class HeadersTest(unittest.TestCase):
2280 ('Collection', 'node2')])
2281 elements = list(headers.elements())
2282 self.assertEquals(2, len(elements))
2283- collections = set((unicode(element) for element in elements
2284+ collections = set((str(element) for element in elements
2285 if element['name'] == 'Collection'))
2286 self.assertIn('node1', collections)
2287 self.assertIn('node2', collections)
2288diff --git a/wokkel/test/test_xmppim.py b/wokkel/test/test_xmppim.py
2289index faab8ed..0d4fdbf 100644
2290--- a/wokkel/test/test_xmppim.py
2291+++ b/wokkel/test/test_xmppim.py
2292@@ -9,7 +9,6 @@ from __future__ import division, absolute_import
2293
2294 from twisted.internet import defer
2295 from twisted.trial import unittest
2296-from twisted.python.compat import unicode
2297 from twisted.words.protocols.jabber import error
2298 from twisted.words.protocols.jabber.jid import JID
2299 from twisted.words.protocols.jabber.xmlstream import toResponse
2300@@ -55,7 +54,7 @@ class PresenceClientProtocolTest(unittest.TestCase):
2301 self.assertEquals(None, presence.uri)
2302 self.assertEquals("user@example.com", presence.getAttribute('to'))
2303 self.assertEquals("unavailable", presence.getAttribute('type'))
2304- self.assertEquals("Disconnected", unicode(presence.status))
2305+ self.assertEquals("Disconnected", str(presence.status))
2306
2307 def test_unavailableBroadcast(self):
2308 """
2309@@ -298,9 +297,9 @@ class PresenceProtocolTest(unittest.TestCase):
2310 element = self.output[-1]
2311 self.assertEquals("user@example.com", element.getAttribute('to'))
2312 self.assertIdentical(None, element.getAttribute('type'))
2313- self.assertEquals(u'chat', unicode(element.show))
2314- self.assertEquals(u'Talk to me!', unicode(element.status))
2315- self.assertEquals(u'50', unicode(element.priority))
2316+ self.assertEquals(u'chat', str(element.show))
2317+ self.assertEquals(u'Talk to me!', str(element.status))
2318+ self.assertEquals(u'50', str(element.priority))
2319
2320 def test_availableLanguages(self):
2321 """
2322@@ -314,19 +313,19 @@ class PresenceProtocolTest(unittest.TestCase):
2323 element = self.output[-1]
2324 self.assertEquals("user@example.com", element.getAttribute('to'))
2325 self.assertIdentical(None, element.getAttribute('type'))
2326- self.assertEquals(u'chat', unicode(element.show))
2327+ self.assertEquals(u'chat', str(element.show))
2328
2329 statuses = {}
2330 for status in element.elements():
2331 if status.name == 'status':
2332 lang = status.getAttribute((NS_XML, 'lang'))
2333- statuses[lang] = unicode(status)
2334+ statuses[lang] = str(status)
2335
2336 self.assertIn(None, statuses)
2337 self.assertEquals(u'Talk to me!', statuses[None])
2338 self.assertIn('nl', statuses)
2339 self.assertEquals(u'Praat met me!', statuses['nl'])
2340- self.assertEquals(u'50', unicode(element.priority))
2341+ self.assertEquals(u'50', str(element.priority))
2342
2343
2344 def test_availableSender(self):
2345@@ -363,7 +362,7 @@ class PresenceProtocolTest(unittest.TestCase):
2346 self.assertEquals(None, element.uri)
2347 self.assertEquals("user@example.com", element.getAttribute('to'))
2348 self.assertEquals("unavailable", element.getAttribute('type'))
2349- self.assertEquals("Disconnected", unicode(element.status))
2350+ self.assertEquals("Disconnected", str(element.status))
2351
2352
2353 def test_unavailableBroadcast(self):
2354@@ -568,7 +567,7 @@ class RosterItemTest(unittest.TestCase):
2355 foundGroups = set()
2356 for child in element.elements():
2357 if child.uri == NS_ROSTER and child.name == 'group':
2358- foundGroups.add(unicode(child))
2359+ foundGroups.add(str(child))
2360
2361 self.assertEqual(groups, foundGroups)
2362
2363diff --git a/wokkel/xmppim.py b/wokkel/xmppim.py
2364index e6af929..683577b 100644
2365--- a/wokkel/xmppim.py
2366+++ b/wokkel/xmppim.py
2367@@ -15,7 +15,6 @@ from __future__ import division, absolute_import
2368 import warnings
2369
2370 from twisted.internet import defer
2371-from twisted.python.compat import iteritems, itervalues, unicode
2372 from twisted.words.protocols.jabber import error
2373 from twisted.words.protocols.jabber.jid import JID
2374 from twisted.words.xish import domish
2375@@ -48,20 +47,20 @@ class AvailablePresence(Presence):
2376 self.addElement('show', content=show)
2377
2378 if statuses is not None:
2379- for lang, status in iteritems(statuses):
2380+ for lang, status in statuses.items():
2381 s = self.addElement('status', content=status)
2382 if lang:
2383 s[(NS_XML, "lang")] = lang
2384
2385 if priority != 0:
2386- self.addElement('priority', content=unicode(int(priority)))
2387+ self.addElement('priority', content=str(int(priority)))
2388
2389 class UnavailablePresence(Presence):
2390 def __init__(self, to=None, statuses=None):
2391 Presence.__init__(self, to, type='unavailable')
2392
2393 if statuses is not None:
2394- for lang, status in iteritems(statuses):
2395+ for lang, status in statuses.items():
2396 s = self.addElement('status', content=status)
2397 if lang:
2398 s[(NS_XML, "lang")] = lang
2399@@ -76,7 +75,7 @@ class PresenceClientProtocol(XMPPHandler):
2400 for element in presence.elements():
2401 if element.name == 'status':
2402 lang = element.getAttribute((NS_XML, 'lang'))
2403- text = unicode(element)
2404+ text = str(element)
2405 statuses[lang] = text
2406 return statuses
2407
2408@@ -92,14 +91,14 @@ class PresenceClientProtocol(XMPPHandler):
2409 def _onPresenceAvailable(self, presence):
2410 entity = JID(presence["from"])
2411
2412- show = unicode(presence.show or '')
2413+ show = str(presence.show or '')
2414 if show not in ['away', 'xa', 'chat', 'dnd']:
2415 show = None
2416
2417 statuses = self._getStatuses(presence)
2418
2419 try:
2420- priority = int(unicode(presence.priority or '')) or 0
2421+ priority = int(str(presence.priority or '')) or 0
2422 except ValueError:
2423 priority = 0
2424
2425@@ -133,14 +132,14 @@ class PresenceClientProtocol(XMPPHandler):
2426 @type entity: {JID}
2427 @param show: detailed presence information. One of C{'away'}, C{'xa'},
2428 C{'chat'}, C{'dnd'} or C{None}.
2429- @type show: C{str} or C{NoneType}
2430+ @type show: L{str} or C{NoneType}
2431 @param statuses: dictionary of natural language descriptions of the
2432 availability status, keyed by the language
2433 descriptor. A status without a language
2434 specified, is keyed with C{None}.
2435- @type statuses: C{dict}
2436+ @type statuses: L{dict}
2437 @param priority: priority level of the resource.
2438- @type priority: C{int}
2439+ @type priority: L{int}
2440 """
2441
2442 def unavailableReceived(self, entity, statuses=None):
2443@@ -153,7 +152,7 @@ class PresenceClientProtocol(XMPPHandler):
2444 availability status, keyed by the language
2445 descriptor. A status without a language
2446 specified, is keyed with C{None}.
2447- @type statuses: C{dict}
2448+ @type statuses: L{dict}
2449 """
2450
2451 def subscribedReceived(self, entity):
2452@@ -196,14 +195,14 @@ class PresenceClientProtocol(XMPPHandler):
2453 @type entity: {JID}
2454 @param show: optional detailed presence information. One of C{'away'},
2455 C{'xa'}, C{'chat'}, C{'dnd'}.
2456- @type show: C{str}
2457+ @type show: L{str}
2458 @param statuses: dictionary of natural language descriptions of the
2459 availability status, keyed by the language
2460 descriptor. A status without a language
2461 specified, is keyed with C{None}.
2462- @type statuses: C{dict}
2463+ @type statuses: L{dict}
2464 @param priority: priority level of the resource.
2465- @type priority: C{int}
2466+ @type priority: L{int}
2467 """
2468 self.send(AvailablePresence(entity, show, statuses, priority))
2469
2470@@ -217,7 +216,7 @@ class PresenceClientProtocol(XMPPHandler):
2471 availability status, keyed by the language
2472 descriptor. A status without a language
2473 specified, is keyed with C{None}.
2474- @type statuses: C{dict}
2475+ @type statuses: L{dict}
2476 """
2477 self.send(UnavailablePresence(entity, statuses))
2478
2479@@ -275,19 +274,19 @@ class AvailabilityPresence(BasePresence):
2480 L{SubscriptionPresence}).
2481
2482 @ivar available: The availability being communicated.
2483- @type available: C{bool}
2484+ @type available: L{bool}
2485 @ivar show: More specific availability. Can be one of C{'chat'}, C{'away'},
2486 C{'xa'}, C{'dnd'} or C{None}.
2487- @type show: C{str} or C{NoneType}
2488+ @type show: L{str} or C{NoneType}
2489 @ivar statuses: Natural language texts to detail the (un)availability.
2490 These are represented as a mapping from language code
2491- (C{str} or C{None}) to the corresponding text (C{unicode}).
2492+ (L{str} or C{None}) to the corresponding text (L{str}).
2493 If the key is C{None}, the associated text is in the
2494 default language.
2495- @type statuses: C{dict}
2496+ @type statuses: L{dict}
2497 @ivar priority: Priority level for this resource. Must be between -128 and
2498 127. Defaults to 0.
2499- @type priority: C{int}
2500+ @type priority: L{int}
2501 """
2502
2503 childParsers = {(None, 'show'): '_childParser_show',
2504@@ -309,7 +308,7 @@ class AvailabilityPresence(BasePresence):
2505 if None in self.statuses:
2506 return self.statuses[None]
2507 elif self.statuses:
2508- for status in itervalues(self.status):
2509+ for status in self.status.values():
2510 return status
2511 else:
2512 return None
2513@@ -318,20 +317,20 @@ class AvailabilityPresence(BasePresence):
2514
2515
2516 def _childParser_show(self, element):
2517- show = unicode(element)
2518+ show = str(element)
2519 if show in ('chat', 'away', 'xa', 'dnd'):
2520 self.show = show
2521
2522
2523 def _childParser_status(self, element):
2524 lang = element.getAttribute((NS_XML, 'lang'), None)
2525- text = unicode(element)
2526+ text = str(element)
2527 self.statuses[lang] = text
2528
2529
2530 def _childParser_priority(self, element):
2531 try:
2532- self.priority = int(unicode(element))
2533+ self.priority = int(str(element))
2534 except ValueError:
2535 pass
2536
2537@@ -353,9 +352,9 @@ class AvailabilityPresence(BasePresence):
2538 if self.show in ('chat', 'away', 'xa', 'dnd'):
2539 presence.addElement('show', content=self.show)
2540 if self.priority != 0:
2541- presence.addElement('priority', content=unicode(self.priority))
2542+ presence.addElement('priority', content=str(self.priority))
2543
2544- for lang, text in iteritems(self.statuses):
2545+ for lang, text in self.statuses.items():
2546 status = presence.addElement('status', content=text)
2547 if lang:
2548 status[(NS_XML, 'lang')] = lang
2549@@ -400,7 +399,7 @@ class BasePresenceProtocol(XMPPHandler):
2550
2551 @cvar presenceTypeParserMap: Maps presence stanza types to their respective
2552 stanza parser classes (derived from L{Stanza}).
2553- @type presenceTypeParserMap: C{dict}
2554+ @type presenceTypeParserMap: L{dict}
2555 """
2556
2557 presenceTypeParserMap = {}
2558@@ -515,15 +514,15 @@ class PresenceProtocol(BasePresenceProtocol):
2559
2560 @param show: Optional detailed presence information. One of C{'away'},
2561 C{'xa'}, C{'chat'}, C{'dnd'}.
2562- @type show: C{str}
2563+ @type show: L{str}
2564
2565 @param statuses: Mapping of natural language descriptions of the
2566 availability status, keyed by the language descriptor. A status
2567 without a language specified, is keyed with C{None}.
2568- @type statuses: C{dict}
2569+ @type statuses: L{dict}
2570
2571 @param priority: priority level of the resource.
2572- @type priority: C{int}
2573+ @type priority: L{int}
2574 """
2575 presence = AvailabilityPresence(recipient=recipient, sender=sender,
2576 show=show, statuses=statuses,
2577@@ -541,7 +540,7 @@ class PresenceProtocol(BasePresenceProtocol):
2578 @param statuses: dictionary of natural language descriptions of the
2579 availability status, keyed by the language descriptor. A status
2580 without a language specified, is keyed with C{None}.
2581- @type statuses: C{dict}
2582+ @type statuses: L{dict}
2583 """
2584 presence = AvailabilityPresence(recipient=recipient, sender=sender,
2585 available=False, statuses=statuses)
2586@@ -617,25 +616,25 @@ class RosterItem(object):
2587 @ivar entity: The JID of the contact.
2588 @type entity: L{JID}
2589 @ivar name: The associated nickname for this contact.
2590- @type name: C{unicode}
2591+ @type name: L{str}
2592 @ivar subscriptionTo: Subscription state to contact's presence. If C{True},
2593 the roster owner is subscribed to the presence
2594 information of the contact.
2595- @type subscriptionTo: C{bool}
2596+ @type subscriptionTo: L{bool}
2597 @ivar subscriptionFrom: Contact's subscription state. If C{True}, the
2598 contact is subscribed to the presence information
2599 of the roster owner.
2600- @type subscriptionFrom: C{bool}
2601+ @type subscriptionFrom: L{bool}
2602 @ivar pendingOut: Whether the subscription request to this contact is
2603 pending.
2604- @type pendingOut: C{bool}
2605+ @type pendingOut: L{bool}
2606 @ivar groups: Set of groups this contact is categorized in. Groups are
2607- represented by an opaque identifier of type C{unicode}.
2608- @type groups: C{set}
2609+ represented by an opaque identifier of type L{str}.
2610+ @type groups: L{set}
2611 @ivar approved: Signals pre-approved subscription.
2612- @type approved: C{bool}
2613+ @type approved: L{bool}
2614 @ivar remove: Signals roster item removal.
2615- @type remove: C{bool}
2616+ @type remove: L{bool}
2617 """
2618
2619 __subscriptionStates = {(False, False): None,
2620@@ -755,7 +754,7 @@ class RosterItem(object):
2621 item.approved = element.getAttribute('approved') in ('true', '1')
2622 for subElement in domish.generateElementsQNamed(element.children,
2623 'group', NS_ROSTER):
2624- item.groups.add(unicode(subElement))
2625+ item.groups.add(str(subElement))
2626 return item
2627
2628
2629@@ -771,7 +770,7 @@ class RosterRequest(Request):
2630 retrieving the roster as a delta from a known cached version. This
2631 should only be set if the recipient is known to support roster
2632 versioning.
2633- @type version: C{unicode}
2634+ @type version: L{str}
2635
2636 @ivar rosterSet: If set, this is a roster set request. This flag is used
2637 to make sure some attributes of the roster item are not rendered by
2638@@ -821,7 +820,7 @@ class Roster(dict):
2639 identifier for this version of the roster.
2640
2641 @ivar version: Roster version identifier.
2642- @type version: C{unicode}.
2643+ @type version: L{str}.
2644 """
2645
2646 version = None
2647@@ -892,7 +891,7 @@ class RosterClientProtocol(XMPPHandler, IQHandlerMixin):
2648 known to support roster versioning. If there is no (valid) cached
2649 version of the roster, but roster versioning is desired,
2650 C{version} should be set to the empty string (C{u''}).
2651- @type version: C{unicode}
2652+ @type version: L{str}
2653
2654 @return: Roster as a mapping from L{JID} to L{RosterItem}.
2655 @rtype: L{twisted.internet.defer.Deferred}
2656@@ -1023,11 +1022,11 @@ class Message(Stanza):
2657
2658
2659 def _childParser_body(self, element):
2660- self.body = unicode(element)
2661+ self.body = str(element)
2662
2663
2664 def _childParser_subject(self, element):
2665- self.subject = unicode(element)
2666+ self.subject = str(element)
2667
2668
2669 def toElement(self):
2670--
26712.44.1