|
From: <mi...@us...> - 2013-01-21 15:19:28
|
Revision: 7592
http://docutils.svn.sourceforge.net/docutils/?rev=7592&view=rev
Author: milde
Date: 2013-01-21 15:19:18 +0000 (Mon, 21 Jan 2013)
Log Message:
-----------
Fix [ 3601607 ] node.__repr__() must return `str` instance.
Modified Paths:
--------------
trunk/docutils/docutils/nodes.py
trunk/docutils/test/test_nodes.py
Modified: trunk/docutils/docutils/nodes.py
===================================================================
--- trunk/docutils/docutils/nodes.py 2013-01-20 12:30:53 UTC (rev 7591)
+++ trunk/docutils/docutils/nodes.py 2013-01-21 15:19:18 UTC (rev 7592)
@@ -299,15 +299,26 @@
if sys.version_info < (3,):
class reprunicode(unicode):
"""
- A class that removes the initial u from unicode's repr.
+ A unicode sub-class that removes the initial u from unicode's repr.
"""
def __repr__(self):
return unicode.__repr__(self)[1:]
+
+
else:
reprunicode = unicode
+def ensure_str(s):
+ """
+ Failsave conversion of `unicode` to `str`.
+ """
+ if sys.version_info < (3,) and isinstance(s, unicode):
+ return s.encode('ascii', 'backslashreplace')
+ return s
+
+
class Text(Node, reprunicode):
"""
@@ -341,7 +352,7 @@
data = self
if len(data) > maxlen:
data = data[:maxlen-4] + ' ...'
- return '<%s: %s>' % (self.tagname, repr(reprunicode(data)))
+ return '<%s: %r>' % (self.tagname, reprunicode(data))
def __repr__(self):
return self.shortrepr(maxlen=68)
@@ -478,14 +489,14 @@
break
if self['names']:
return '<%s "%s": %s>' % (self.__class__.__name__,
- '; '.join(self['names']), data)
+ '; '.join([ensure_str(n) for n in self['names']]), data)
else:
return '<%s: %s>' % (self.__class__.__name__, data)
def shortrepr(self):
if self['names']:
return '<%s "%s"...>' % (self.__class__.__name__,
- '; '.join(self['names']))
+ '; '.join([ensure_str(n) for n in self['names']]))
else:
return '<%s...>' % self.tagname
Modified: trunk/docutils/test/test_nodes.py
===================================================================
--- trunk/docutils/test/test_nodes.py 2013-01-20 12:30:53 UTC (rev 7591)
+++ trunk/docutils/test/test_nodes.py 2013-01-21 15:19:18 UTC (rev 7592)
@@ -33,6 +33,11 @@
self.assertEqual(repr(self.text), r"<#text: 'Line 1.\nLine 2.'>")
self.assertEqual(self.text.shortrepr(),
r"<#text: 'Line 1.\nLine 2.'>")
+ self.assertEqual(nodes.reprunicode('foo'), u'foo')
+ if sys.version_info < (3,):
+ self.assertEqual(repr(self.unicode_text), r"<#text: 'M\xf6hren'>")
+ else:
+ self.assertEqual(repr(self.unicode_text), u"<#text: 'Möhren'>")
def test_str(self):
self.assertEqual(str(self.text), 'Line 1.\nLine 2.')
@@ -42,10 +47,13 @@
self.assertEqual(str(self.unicode_text), 'M\xf6hren')
def test_astext(self):
- self.assertEqual(self.text.astext(), 'Line 1.\nLine 2.')
+ self.assertTrue(isinstance(self.text.astext(), unicode))
+ self.assertEqual(self.text.astext(), u'Line 1.\nLine 2.')
+ self.assertEqual(self.unicode_text.astext(), u'Möhren')
def test_pformat(self):
- self.assertEqual(self.text.pformat(), 'Line 1.\nLine 2.\n')
+ self.assertTrue(isinstance(self.text.pformat(), unicode))
+ self.assertEqual(self.text.pformat(), u'Line 1.\nLine 2.\n')
def test_asciirestriction(self):
if sys.version_info < (3,):
@@ -88,11 +96,25 @@
dom = element.asdom()
self.assertEqual(dom.toxml(), u'<Element mark="\u2022"/>')
dom.unlink()
+ element['names'] = ['nobody', u'имя', u'näs']
+ if sys.version_info < (3,):
+ self.assertEqual(repr(element),
+ '<Element "nobody; \\u0438\\u043c\\u044f; n\\xe4s": >')
+ else:
+ self.assertEqual(repr(element), u'<Element "nobody; имя; näs": >')
+ self.assertTrue(isinstance(repr(element), str))
def test_withtext(self):
element = nodes.Element('text\nmore', nodes.Text('text\nmore'))
+ uelement = nodes.Element(u'grün', nodes.Text(u'grün'))
self.assertEqual(repr(element), r"<Element: <#text: 'text\nmore'>>")
+ if sys.version_info < (3,):
+ self.assertEqual(repr(uelement), "<Element: <#text: 'gr\\xfcn'>>")
+ else:
+ self.assertEqual(repr(uelement), u"<Element: <#text: 'grün'>>")
+ self.assertTrue(isinstance(repr(uelement),str))
self.assertEqual(str(element), '<Element>text\nmore</Element>')
+ self.assertEqual(str(uelement), '<Element>gr\xfcn</Element>')
dom = element.asdom()
self.assertEqual(dom.toxml(), '<Element>text\nmore</Element>')
dom.unlink()
@@ -194,6 +216,25 @@
class MiscTests(unittest.TestCase):
+ def test_reprunicode(self):
+ # return `unicode` instance
+ self.assertTrue(isinstance(nodes.reprunicode('foo'), unicode))
+ self.assertEqual(nodes.reprunicode('foo'), u'foo')
+ self.assertEqual(nodes.reprunicode(u'Möhre'), u'Möhre')
+ if sys.version_info < (3,): # strip leading "u" from representation
+ self.assertEqual(repr(nodes.reprunicode(u'Möhre')),
+ repr(u'Möhre')[1:])
+ else: # no change to `unicode` under Python 3k
+ self.assertEqual(repr(nodes.reprunicode(u'Möhre')), repr(u'Möhre'))
+
+ def test_ensure_str(self):
+ self.assertTrue(isinstance(nodes.ensure_str(u'über'), str))
+ self.assertEqual(nodes.ensure_str('over'), 'over')
+ if sys.version_info < (3,): # strip leading "u" from representation
+ self.assertEqual(nodes.ensure_str(u'über'), r'\xfcber')
+ else:
+ self.assertEqual(nodes.ensure_str(u'über'), r'über')
+
def test_node_class_names(self):
node_class_names = []
for x in dir(nodes):
@@ -484,7 +525,7 @@
def compare_trees(self, one, two):
self.assertEqual(one.__class__, two.__class__)
- self.assertNotEquals(id(one), id(two))
+ self.assertNotEqual(id(one), id(two))
self.assertEqual(len(one.children), len(two.children))
for i in range(len(one.children)):
self.compare_trees(one.children[i], two.children[i])
@@ -534,7 +575,7 @@
element = nodes.Element()
document.set_id(element)
self.assertEqual(element['ids'], ['prefixauto1'])
-
+
if __name__ == '__main__':
unittest.main()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|