')
+ self.assertEqual('
', (html | sanitizer).render())
def test_sanitize_remove_style_phishing(self):
sanitizer = StyleSanitizer()
# The position property is not allowed
- html = HTML(u'
')
- self.assertEquals('
', (html | sanitizer).render())
+ html = HTML('
')
+ self.assertEqual('
', (html | sanitizer).render())
# Normal margins get passed through
- html = HTML(u'
')
- self.assertEquals('
',
+ html = HTML('
')
+ self.assertEqual('
',
(html | sanitizer).render())
# But not negative margins
- html = HTML(u'
')
- self.assertEquals('
', (html | sanitizer).render())
- html = HTML(u'
')
- self.assertEquals('
', (html | sanitizer).render())
- html = HTML(u'
')
- self.assertEquals('
', (html | sanitizer).render())
+ html = HTML('
')
+ self.assertEqual('
', (html | sanitizer).render())
+ html = HTML('
')
+ self.assertEqual('
', (html | sanitizer).render())
+ html = HTML('
')
+ self.assertEqual('
', (html | sanitizer).render())
def test_sanitize_remove_src_javascript(self):
- html = HTML(u'
\')
')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ html = HTML('
\')
')
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
# Case-insensitive protocol matching
- html = HTML(u'
\')
')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ html = HTML('
\')
')
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
# Grave accents (not parsed)
- src = u'

'
+ src = '

'
self.assert_parse_error_or_equal('
![]()
', src)
# Protocol encoded using UTF-8 numeric entities
- html = HTML(u'

')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
# Protocol encoded using UTF-8 numeric entities without a semicolon
# (which is allowed because the max number of digits is used)
- html = HTML(u'

')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
# Protocol encoded using UTF-8 numeric hex entities without a semicolon
# (which is allowed because the max number of digits is used)
- html = HTML(u'

')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
# Embedded tab character in protocol
- html = HTML(u'
;\')
')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ html = HTML('
;\')
')
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
# Embedded tab character in protocol, but encoded this time
- html = HTML(u'
;\')
')
- self.assertEquals('
![]()
', (html | HTMLSanitizer()).render())
+ html = HTML('
;\')
')
+ self.assertEqual('
![]()
', (html | HTMLSanitizer()).render())
def test_sanitize_expression(self):
- html = HTML(ur'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML(r'
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_capital_expression(self):
- html = HTML(ur'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML(r'
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_url_with_javascript(self):
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_capital_url_with_javascript(self):
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_unicode_escapes(self):
- html = HTML(ur'
'
- ur'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML(r'
'
+ r'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_backslash_without_hex(self):
- html = HTML(ur'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
- html = HTML(ur'
XSS
')
+ html = HTML(r'
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
+ html = HTML(r'
XSS
')
self.assertEqual(r'
'
'XSS
',
- unicode(html | StyleSanitizer()))
+ str(html | StyleSanitizer()))
def test_sanitize_unsafe_props(self):
- html = HTML(u'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
- html = HTML(u'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
- html = HTML(u"""
XSS
""")
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML("""
XSS
""")
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
- html = HTML(u"""
XSS
""")
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML("""
XSS
""")
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_negative_margin(self):
- html = HTML(u'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
- html = HTML(u'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
+ html = HTML('
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_css_hack(self):
- html = HTML(u'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
- html = HTML(u'
XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_property_name(self):
- html = HTML(u'
prop
')
+ html = HTML('
prop
')
self.assertEqual('
prop
',
- unicode(html | StyleSanitizer()))
+ str(html | StyleSanitizer()))
def test_sanitize_unicode_expression(self):
# Fullwidth small letters
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
# Fullwidth capital letters
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
# IPA extensions
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def test_sanitize_unicode_url(self):
# IPA extensions
- html = HTML(u'
'
- u'XSS
')
- self.assertEqual('
XSS
', unicode(html | StyleSanitizer()))
+ html = HTML('
'
+ 'XSS
')
+ self.assertEqual('
XSS
', str(html | StyleSanitizer()))
def suite():
--- genshi/filters/tests/transform.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/filters/tests/transform.py
@@ -33,24 +33,24 @@ def _simplify(stream, with_attrs=False):
for mark, (kind, data, pos) in stream:
if kind is START:
if with_attrs:
- data = (unicode(data[0]), dict((unicode(k), v)
+ data = (str(data[0]), dict((str(k), v)
for k, v in data[1]))
else:
- data = unicode(data[0])
+ data = str(data[0])
elif kind is END:
- data = unicode(data)
+ data = str(data)
elif kind is ATTR:
kind = ATTR
- data = dict((unicode(k), v) for k, v in data[1])
+ data = dict((str(k), v) for k, v in data[1])
yield mark, kind, data
return list(_generate())
def _transform(html, transformer, with_attrs=False):
"""Apply transformation returning simplified marked stream."""
- if isinstance(html, basestring) and not isinstance(html, unicode):
+ if isinstance(html, str) and not isinstance(html, str):
html = HTML(html, encoding='utf-8')
- elif isinstance(html, unicode):
+ elif isinstance(html, str):
html = HTML(html, encoding='utf-8')
stream = transformer(html, keep_marks=True)
return _simplify(stream, with_attrs)
@@ -60,7 +60,7 @@ class SelectTest(unittest.TestCase):
"""Test .select()"""
def _select(self, select):
html = HTML(FOOBAR, encoding='utf-8')
- if isinstance(select, basestring):
+ if isinstance(select, str):
select = [select]
transformer = Transformer(select[0])
for sel in select[1:]:
@@ -70,78 +70,78 @@ class SelectTest(unittest.TestCase):
def test_select_single_element(self):
self.assertEqual(
self._select('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')],
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')],
)
def test_select_context(self):
self.assertEqual(
self._select('.'),
- [(ENTER, START, u'root'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (INSIDE, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (INSIDE, END, u'bar'),
- (EXIT, END, u'root')]
+ [(ENTER, START, 'root'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (INSIDE, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (INSIDE, END, 'bar'),
+ (EXIT, END, 'root')]
)
def test_select_inside_select(self):
self.assertEqual(
self._select(['.', 'foo']),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')],
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')],
)
def test_select_text(self):
self.assertEqual(
self._select('*/text()'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (OUTSIDE, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')],
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (OUTSIDE, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')],
)
def test_select_attr(self):
self.assertEqual(
self._select('foo/@name'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ATTR, ATTR, {'name': u'foo'}),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ATTR, ATTR, {'name': 'foo'}),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_select_text_context(self):
self.assertEqual(
- list(Transformer('.')(HTML(u'foo'), keep_marks=True)),
- [('OUTSIDE', ('TEXT', u'foo', (None, 1, 0)))],
+ list(Transformer('.')(HTML('foo'), keep_marks=True)),
+ [('OUTSIDE', ('TEXT', 'foo', (None, 1, 0)))],
)
@@ -152,63 +152,63 @@ class InvertTest(unittest.TestCase):
def test_invert_element(self):
self.assertEqual(
self._invert('foo'),
- [(OUTSIDE, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (OUTSIDE, END, u'root')]
+ [(OUTSIDE, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (OUTSIDE, END, 'root')]
)
def test_invert_inverted_element(self):
self.assertEqual(
_transform(FOO, Transformer('foo').invert().invert()),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (OUTSIDE, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (OUTSIDE, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (OUTSIDE, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (OUTSIDE, END, 'foo'),
+ (None, END, 'root')]
)
def test_invert_text(self):
self.assertEqual(
self._invert('foo/text()'),
- [(OUTSIDE, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (OUTSIDE, START, u'foo'),
- (None, TEXT, u'FOO'),
- (OUTSIDE, END, u'foo'),
- (OUTSIDE, END, u'root')]
+ [(OUTSIDE, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (OUTSIDE, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (OUTSIDE, END, 'foo'),
+ (OUTSIDE, END, 'root')]
)
def test_invert_attribute(self):
self.assertEqual(
self._invert('foo/@name'),
- [(OUTSIDE, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, ATTR, {'name': u'foo'}),
- (OUTSIDE, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (OUTSIDE, END, u'foo'),
- (OUTSIDE, END, u'root')]
+ [(OUTSIDE, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, ATTR, {'name': 'foo'}),
+ (OUTSIDE, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (OUTSIDE, END, 'foo'),
+ (OUTSIDE, END, 'root')]
)
def test_invert_context(self):
self.assertEqual(
self._invert('.'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_invert_text_context(self):
self.assertEqual(
- _simplify(Transformer('.').invert()(HTML(u'foo'), keep_marks=True)),
- [(None, 'TEXT', u'foo')],
+ _simplify(Transformer('.').invert()(HTML('foo'), keep_marks=True)),
+ [(None, 'TEXT', 'foo')],
)
@@ -218,12 +218,12 @@ class EndTest(unittest.TestCase):
stream = _transform(FOO, Transformer('foo').end())
self.assertEqual(
stream,
- [(OUTSIDE, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (OUTSIDE, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (OUTSIDE, END, u'foo'),
- (OUTSIDE, END, u'root')]
+ [(OUTSIDE, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (OUTSIDE, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (OUTSIDE, END, 'foo'),
+ (OUTSIDE, END, 'root')]
)
@@ -234,47 +234,47 @@ class EmptyTest(unittest.TestCase):
def test_empty_element(self):
self.assertEqual(
self._empty('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (EXIT, END, u'foo'),
- (None, END, u'root')],
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (EXIT, END, 'foo'),
+ (None, END, 'root')],
)
def test_empty_text(self):
self.assertEqual(
self._empty('foo/text()'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_empty_attr(self):
self.assertEqual(
self._empty('foo/@name'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ATTR, ATTR, {'name': u'foo'}),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ATTR, ATTR, {'name': 'foo'}),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_empty_context(self):
self.assertEqual(
self._empty('.'),
- [(ENTER, START, u'root'),
- (EXIT, END, u'root')]
+ [(ENTER, START, 'root'),
+ (EXIT, END, 'root')]
)
def test_empty_text_context(self):
self.assertEqual(
- _simplify(Transformer('.')(HTML(u'foo'), keep_marks=True)),
- [(OUTSIDE, TEXT, u'foo')],
+ _simplify(Transformer('.')(HTML('foo'), keep_marks=True)),
+ [(OUTSIDE, TEXT, 'foo')],
)
@@ -285,29 +285,29 @@ class RemoveTest(unittest.TestCase):
def test_remove_element(self):
self.assertEqual(
self._remove('foo|bar'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, END, 'root')]
)
def test_remove_text(self):
self.assertEqual(
self._remove('//text()'),
- [(None, START, u'root'),
- (None, START, u'foo'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, START, 'foo'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_remove_attr(self):
self.assertEqual(
self._remove('foo/@name'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_remove_context(self):
@@ -330,52 +330,52 @@ class UnwrapText(unittest.TestCase):
def test_unwrap_element(self):
self.assertEqual(
self._unwrap('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (INSIDE, TEXT, u'FOO'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (INSIDE, TEXT, 'FOO'),
+ (None, END, 'root')]
)
def test_unwrap_text(self):
self.assertEqual(
self._unwrap('foo/text()'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_unwrap_attr(self):
self.assertEqual(
self._unwrap('foo/@name'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ATTR, ATTR, {'name': u'foo'}),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ATTR, ATTR, {'name': 'foo'}),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_unwrap_adjacent(self):
self.assertEqual(
_transform(FOOBAR, Transformer('foo|bar').unwrap()),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, TEXT, u'BAR'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, TEXT, 'BAR'),
+ (None, END, 'root')]
)
def test_unwrap_root(self):
self.assertEqual(
self._unwrap('.'),
- [(INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo')]
+ [(INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo')]
)
def test_unwrap_text_root(self):
@@ -392,75 +392,75 @@ class WrapTest(unittest.TestCase):
def test_wrap_element(self):
self.assertEqual(
self._wrap('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'wrap'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, END, u'wrap'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'wrap'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, END, 'wrap'),
+ (None, END, 'root')]
)
def test_wrap_adjacent_elements(self):
self.assertEqual(
_transform(FOOBAR, Transformer('foo|bar').wrap('wrap')),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'wrap'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, END, u'wrap'),
- (None, START, u'wrap'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, END, u'wrap'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'wrap'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, END, 'wrap'),
+ (None, START, 'wrap'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, END, 'wrap'),
+ (None, END, 'root')]
)
def test_wrap_text(self):
self.assertEqual(
self._wrap('foo/text()'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, START, u'wrap'),
- (OUTSIDE, TEXT, u'FOO'),
- (None, END, u'wrap'),
- (None, END, u'foo'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, START, 'wrap'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (None, END, 'wrap'),
+ (None, END, 'foo'),
+ (None, END, 'root')]
)
def test_wrap_root(self):
self.assertEqual(
self._wrap('.'),
- [(None, START, u'wrap'),
- (ENTER, START, u'root'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (EXIT, END, u'root'),
- (None, END, u'wrap')]
+ [(None, START, 'wrap'),
+ (ENTER, START, 'root'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (EXIT, END, 'root'),
+ (None, END, 'wrap')]
)
def test_wrap_text_root(self):
self.assertEqual(
_transform('foo', Transformer('.').wrap('wrap')),
- [(None, START, u'wrap'),
- (OUTSIDE, TEXT, u'foo'),
- (None, END, u'wrap')],
+ [(None, START, 'wrap'),
+ (OUTSIDE, TEXT, 'foo'),
+ (None, END, 'wrap')],
)
def test_wrap_with_element(self):
element = Element('a', href='http://localhost')
self.assertEqual(
_transform('foo', Transformer('.').wrap(element), with_attrs=True),
- [(None, START, (u'a', {u'href': u'http://localhost'})),
- (OUTSIDE, TEXT, u'foo'),
- (None, END, u'a')]
+ [(None, START, ('a', {'href': 'http://localhost'})),
+ (OUTSIDE, TEXT, 'foo'),
+ (None, END, 'a')]
)
@@ -483,55 +483,55 @@ class FilterTest(unittest.TestCase):
def test_filter_element(self):
self.assertEqual(
self._filter('foo'),
- [[(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')]]
+ [[(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')]]
)
def test_filter_adjacent_elements(self):
self.assertEqual(
self._filter('foo|bar'),
- [[(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')],
- [(None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar')]]
+ [[(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')],
+ [(None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar')]]
)
def test_filter_text(self):
self.assertEqual(
self._filter('*/text()'),
- [[(None, TEXT, u'FOO')],
- [(None, TEXT, u'BAR')]]
+ [[(None, TEXT, 'FOO')],
+ [(None, TEXT, 'BAR')]]
)
def test_filter_root(self):
self.assertEqual(
self._filter('.'),
- [[(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]]
+ [[(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]]
)
def test_filter_text_root(self):
self.assertEqual(
self._filter('.', 'foo'),
- [[(None, TEXT, u'foo')]])
+ [[(None, TEXT, 'foo')]])
def test_filter_after_outside(self):
stream = _transform(
'
x', Transformer('//root/text()').filter(lambda x: x))
self.assertEqual(
list(stream),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'x'),
- (None, END, u'root')])
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'x'),
+ (None, END, 'root')])
class MapTest(unittest.TestCase):
@@ -546,16 +546,16 @@ class MapTest(unittest.TestCase):
def test_map_element(self):
self.assertEqual(
self._map('foo'),
- [(QName('foo'), Attrs([(QName('name'), u'foo'),
- (QName('size'), u'100')])),
- u'FOO',
+ [(QName('foo'), Attrs([(QName('name'), 'foo'),
+ (QName('size'), '100')])),
+ 'FOO',
QName('foo')]
)
def test_map_with_text_kind(self):
self.assertEqual(
self._map('.', TEXT),
- [u'ROOT', u'FOO', u'BAR']
+ ['ROOT', 'FOO', 'BAR']
)
def test_map_with_root_and_end_kind(self):
@@ -567,7 +567,7 @@ class MapTest(unittest.TestCase):
def test_map_with_attribute(self):
self.assertEqual(
self._map('foo/@name'),
- [(QName('foo@*'), Attrs([('name', u'foo')]))]
+ [(QName('foo@*'), Attrs([('name', 'foo')]))]
)
@@ -578,29 +578,29 @@ class SubstituteTest(unittest.TestCase):
def test_substitute_foo(self):
self.assertEqual(
self._substitute('foo', 'FOO|BAR', 'FOOOOO'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOOOOO'),
- (EXIT, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOOOOO'),
+ (EXIT, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_substitute_foobar_with_group(self):
self.assertEqual(
self._substitute('foo|bar', '(FOO|BAR)', r'(\1)'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'(FOO)'),
- (EXIT, END, u'foo'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'(BAR)'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, '(FOO)'),
+ (EXIT, END, 'foo'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, '(BAR)'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
@@ -611,43 +611,43 @@ class RenameTest(unittest.TestCase):
def test_rename_root(self):
self.assertEqual(
self._rename('.'),
- [(ENTER, START, u'foobar'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (INSIDE, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (INSIDE, END, u'bar'),
- (EXIT, END, u'foobar')]
+ [(ENTER, START, 'foobar'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (INSIDE, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (INSIDE, END, 'bar'),
+ (EXIT, END, 'foobar')]
)
def test_rename_element(self):
self.assertEqual(
self._rename('foo|bar'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foobar'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foobar'),
- (ENTER, START, u'foobar'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'foobar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foobar'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foobar'),
+ (ENTER, START, 'foobar'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'foobar'),
+ (None, END, 'root')]
)
def test_rename_text(self):
self.assertEqual(
self._rename('foo/text()'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (OUTSIDE, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (OUTSIDE, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
@@ -658,15 +658,15 @@ class ContentTestMixin(object):
def __iter__(self):
self.count += 1
- return iter(HTML(u'CONTENT %i' % self.count))
+ return iter(HTML('CONTENT %i' % self.count))
- if isinstance(html, basestring) and not isinstance(html, unicode):
+ if isinstance(html, str) and not isinstance(html, str):
html = HTML(html, encoding='utf-8')
else:
html = HTML(html)
if content is None:
content = Injector()
- elif isinstance(content, basestring):
+ elif isinstance(content, str):
content = HTML(content)
return _transform(html, getattr(Transformer(select), self.operation)
(content))
@@ -678,59 +678,59 @@ class ReplaceTest(unittest.TestCase, ContentTestMixin)
def test_replace_element(self):
self.assertEqual(
self._apply('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 1'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 1'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_replace_text(self):
self.assertEqual(
self._apply('text()'),
- [(None, START, u'root'),
- (None, TEXT, u'CONTENT 1'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'CONTENT 1'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_replace_context(self):
self.assertEqual(
self._apply('.'),
- [(None, TEXT, u'CONTENT 1')],
+ [(None, TEXT, 'CONTENT 1')],
)
def test_replace_text_context(self):
self.assertEqual(
self._apply('.', html='foo'),
- [(None, TEXT, u'CONTENT 1')],
+ [(None, TEXT, 'CONTENT 1')],
)
def test_replace_adjacent_elements(self):
self.assertEqual(
self._apply('*'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 1'),
- (None, TEXT, u'CONTENT 2'),
- (None, END, u'root')],
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 1'),
+ (None, TEXT, 'CONTENT 2'),
+ (None, END, 'root')],
)
def test_replace_all(self):
self.assertEqual(
self._apply('*|text()'),
- [(None, START, u'root'),
- (None, TEXT, u'CONTENT 1'),
- (None, TEXT, u'CONTENT 2'),
- (None, TEXT, u'CONTENT 3'),
- (None, END, u'root')],
+ [(None, START, 'root'),
+ (None, TEXT, 'CONTENT 1'),
+ (None, TEXT, 'CONTENT 2'),
+ (None, TEXT, 'CONTENT 3'),
+ (None, END, 'root')],
)
def test_replace_with_callback(self):
@@ -740,11 +740,11 @@ class ReplaceTest(unittest.TestCase, ContentTestMixin)
yield '%2i.' % count[0]
self.assertEqual(
self._apply('*', content),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, TEXT, u' 1.'),
- (None, TEXT, u' 2.'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, TEXT, ' 1.'),
+ (None, TEXT, ' 2.'),
+ (None, END, 'root')]
)
@@ -754,87 +754,87 @@ class BeforeTest(unittest.TestCase, ContentTestMixin):
def test_before_element(self):
self.assertEqual(
self._apply('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 1'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 1'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_before_text(self):
self.assertEqual(
self._apply('text()'),
- [(None, START, u'root'),
- (None, TEXT, u'CONTENT 1'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'CONTENT 1'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_before_context(self):
self.assertEqual(
self._apply('.'),
- [(None, TEXT, u'CONTENT 1'),
- (ENTER, START, u'root'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (INSIDE, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (INSIDE, END, u'bar'),
- (EXIT, END, u'root')]
+ [(None, TEXT, 'CONTENT 1'),
+ (ENTER, START, 'root'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (INSIDE, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (INSIDE, END, 'bar'),
+ (EXIT, END, 'root')]
)
def test_before_text_context(self):
self.assertEqual(
self._apply('.', html='foo'),
- [(None, TEXT, u'CONTENT 1'),
- (OUTSIDE, TEXT, u'foo')]
+ [(None, TEXT, 'CONTENT 1'),
+ (OUTSIDE, TEXT, 'foo')]
)
def test_before_adjacent_elements(self):
self.assertEqual(
self._apply('*'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 1'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, TEXT, u'CONTENT 2'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 1'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, TEXT, 'CONTENT 2'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_before_all(self):
self.assertEqual(
self._apply('*|text()'),
- [(None, START, u'root'),
- (None, TEXT, u'CONTENT 1'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 2'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, TEXT, u'CONTENT 3'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'CONTENT 1'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 2'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, TEXT, 'CONTENT 3'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_before_with_callback(self):
@@ -844,16 +844,16 @@ class BeforeTest(unittest.TestCase, ContentTestMixin):
yield '%2i.' % count[0]
self.assertEqual(
self._apply('foo/text()', content),
- [(None, 'START', u'root'),
- (None, 'TEXT', u'ROOT'),
- (None, 'START', u'foo'),
- (None, 'TEXT', u' 1.'),
- ('OUTSIDE', 'TEXT', u'FOO'),
- (None, 'END', u'foo'),
- (None, 'START', u'bar'),
- (None, 'TEXT', u'BAR'),
- (None, 'END', u'bar'),
- (None, 'END', u'root')]
+ [(None, 'START', 'root'),
+ (None, 'TEXT', 'ROOT'),
+ (None, 'START', 'foo'),
+ (None, 'TEXT', ' 1.'),
+ ('OUTSIDE', 'TEXT', 'FOO'),
+ (None, 'END', 'foo'),
+ (None, 'START', 'bar'),
+ (None, 'TEXT', 'BAR'),
+ (None, 'END', 'bar'),
+ (None, 'END', 'root')]
)
@@ -863,87 +863,87 @@ class AfterTest(unittest.TestCase, ContentTestMixin):
def test_after_element(self):
self.assertEqual(
self._apply('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, TEXT, u'CONTENT 1'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, TEXT, 'CONTENT 1'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_after_text(self):
self.assertEqual(
self._apply('text()'),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 1'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 1'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_after_context(self):
self.assertEqual(
self._apply('.'),
- [(ENTER, START, u'root'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (INSIDE, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (INSIDE, END, u'bar'),
- (EXIT, END, u'root'),
- (None, TEXT, u'CONTENT 1')]
+ [(ENTER, START, 'root'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (INSIDE, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (INSIDE, END, 'bar'),
+ (EXIT, END, 'root'),
+ (None, TEXT, 'CONTENT 1')]
)
def test_after_text_context(self):
self.assertEqual(
self._apply('.', html='foo'),
- [(OUTSIDE, TEXT, u'foo'),
- (None, TEXT, u'CONTENT 1')]
+ [(OUTSIDE, TEXT, 'foo'),
+ (None, TEXT, 'CONTENT 1')]
)
def test_after_adjacent_elements(self):
self.assertEqual(
self._apply('*'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, TEXT, u'CONTENT 1'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, TEXT, u'CONTENT 2'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, TEXT, 'CONTENT 1'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, TEXT, 'CONTENT 2'),
+ (None, END, 'root')]
)
def test_after_all(self):
self.assertEqual(
self._apply('*|text()'),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, TEXT, u'CONTENT 1'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, TEXT, u'CONTENT 2'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, TEXT, u'CONTENT 3'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, TEXT, 'CONTENT 1'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, TEXT, 'CONTENT 2'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, TEXT, 'CONTENT 3'),
+ (None, END, 'root')]
)
def test_after_with_callback(self):
@@ -953,16 +953,16 @@ class AfterTest(unittest.TestCase, ContentTestMixin):
yield '%2i.' % count[0]
self.assertEqual(
self._apply('foo/text()', content),
- [(None, 'START', u'root'),
- (None, 'TEXT', u'ROOT'),
- (None, 'START', u'foo'),
- ('OUTSIDE', 'TEXT', u'FOO'),
- (None, 'TEXT', u' 1.'),
- (None, 'END', u'foo'),
- (None, 'START', u'bar'),
- (None, 'TEXT', u'BAR'),
- (None, 'END', u'bar'),
- (None, 'END', u'root')]
+ [(None, 'START', 'root'),
+ (None, 'TEXT', 'ROOT'),
+ (None, 'START', 'foo'),
+ ('OUTSIDE', 'TEXT', 'FOO'),
+ (None, 'TEXT', ' 1.'),
+ (None, 'END', 'foo'),
+ (None, 'START', 'bar'),
+ (None, 'TEXT', 'BAR'),
+ (None, 'END', 'bar'),
+ (None, 'END', 'root')]
)
@@ -972,84 +972,84 @@ class PrependTest(unittest.TestCase, ContentTestMixin)
def test_prepend_element(self):
self.assertEqual(
self._apply('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (None, TEXT, u'CONTENT 1'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (None, TEXT, 'CONTENT 1'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_prepend_text(self):
self.assertEqual(
self._apply('text()'),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_prepend_context(self):
self.assertEqual(
self._apply('.'),
- [(ENTER, START, u'root'),
- (None, TEXT, u'CONTENT 1'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (INSIDE, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (INSIDE, END, u'bar'),
- (EXIT, END, u'root')],
+ [(ENTER, START, 'root'),
+ (None, TEXT, 'CONTENT 1'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (INSIDE, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (INSIDE, END, 'bar'),
+ (EXIT, END, 'root')],
)
def test_prepend_text_context(self):
self.assertEqual(
self._apply('.', html='foo'),
- [(OUTSIDE, TEXT, u'foo')]
+ [(OUTSIDE, TEXT, 'foo')]
)
def test_prepend_adjacent_elements(self):
self.assertEqual(
self._apply('*'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (None, TEXT, u'CONTENT 1'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (ENTER, START, u'bar'),
- (None, TEXT, u'CONTENT 2'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (None, TEXT, 'CONTENT 1'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (ENTER, START, 'bar'),
+ (None, TEXT, 'CONTENT 2'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_prepend_all(self):
self.assertEqual(
self._apply('*|text()'),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (None, TEXT, u'CONTENT 1'),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (ENTER, START, u'bar'),
- (None, TEXT, u'CONTENT 2'),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (None, TEXT, 'CONTENT 1'),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (ENTER, START, 'bar'),
+ (None, TEXT, 'CONTENT 2'),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_prepend_with_callback(self):
@@ -1059,16 +1059,16 @@ class PrependTest(unittest.TestCase, ContentTestMixin)
yield '%2i.' % count[0]
self.assertEqual(
self._apply('foo', content),
- [(None, 'START', u'root'),
- (None, 'TEXT', u'ROOT'),
- (ENTER, 'START', u'foo'),
- (None, 'TEXT', u' 1.'),
- (INSIDE, 'TEXT', u'FOO'),
- (EXIT, 'END', u'foo'),
- (None, 'START', u'bar'),
- (None, 'TEXT', u'BAR'),
- (None, 'END', u'bar'),
- (None, 'END', u'root')]
+ [(None, 'START', 'root'),
+ (None, 'TEXT', 'ROOT'),
+ (ENTER, 'START', 'foo'),
+ (None, 'TEXT', ' 1.'),
+ (INSIDE, 'TEXT', 'FOO'),
+ (EXIT, 'END', 'foo'),
+ (None, 'START', 'bar'),
+ (None, 'TEXT', 'BAR'),
+ (None, 'END', 'bar'),
+ (None, 'END', 'root')]
)
@@ -1078,84 +1078,84 @@ class AppendTest(unittest.TestCase, ContentTestMixin):
def test_append_element(self):
self.assertEqual(
self._apply('foo'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (None, TEXT, u'CONTENT 1'),
- (EXIT, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (None, TEXT, 'CONTENT 1'),
+ (EXIT, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_append_text(self):
self.assertEqual(
self._apply('text()'),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_append_context(self):
self.assertEqual(
self._apply('.'),
- [(ENTER, START, u'root'),
- (INSIDE, TEXT, u'ROOT'),
- (INSIDE, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (INSIDE, END, u'foo'),
- (INSIDE, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (INSIDE, END, u'bar'),
- (None, TEXT, u'CONTENT 1'),
- (EXIT, END, u'root')],
+ [(ENTER, START, 'root'),
+ (INSIDE, TEXT, 'ROOT'),
+ (INSIDE, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (INSIDE, END, 'foo'),
+ (INSIDE, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (INSIDE, END, 'bar'),
+ (None, TEXT, 'CONTENT 1'),
+ (EXIT, END, 'root')],
)
def test_append_text_context(self):
self.assertEqual(
self._apply('.', html='foo'),
- [(OUTSIDE, TEXT, u'foo')]
+ [(OUTSIDE, TEXT, 'foo')]
)
def test_append_adjacent_elements(self):
self.assertEqual(
self._apply('*'),
- [(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (None, TEXT, u'CONTENT 1'),
- (EXIT, END, u'foo'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (None, TEXT, u'CONTENT 2'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (None, TEXT, 'CONTENT 1'),
+ (EXIT, END, 'foo'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (None, TEXT, 'CONTENT 2'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_append_all(self):
self.assertEqual(
self._apply('*|text()'),
- [(None, START, u'root'),
- (OUTSIDE, TEXT, u'ROOT'),
- (ENTER, START, u'foo'),
- (INSIDE, TEXT, u'FOO'),
- (None, TEXT, u'CONTENT 1'),
- (EXIT, END, u'foo'),
- (ENTER, START, u'bar'),
- (INSIDE, TEXT, u'BAR'),
- (None, TEXT, u'CONTENT 2'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, 'root'),
+ (OUTSIDE, TEXT, 'ROOT'),
+ (ENTER, START, 'foo'),
+ (INSIDE, TEXT, 'FOO'),
+ (None, TEXT, 'CONTENT 1'),
+ (EXIT, END, 'foo'),
+ (ENTER, START, 'bar'),
+ (INSIDE, TEXT, 'BAR'),
+ (None, TEXT, 'CONTENT 2'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_append_with_callback(self):
@@ -1165,16 +1165,16 @@ class AppendTest(unittest.TestCase, ContentTestMixin):
yield '%2i.' % count[0]
self.assertEqual(
self._apply('foo', content),
- [(None, 'START', u'root'),
- (None, 'TEXT', u'ROOT'),
- (ENTER, 'START', u'foo'),
- (INSIDE, 'TEXT', u'FOO'),
- (None, 'TEXT', u' 1.'),
- (EXIT, 'END', u'foo'),
- (None, 'START', u'bar'),
- (None, 'TEXT', u'BAR'),
- (None, 'END', u'bar'),
- (None, 'END', u'root')]
+ [(None, 'START', 'root'),
+ (None, 'TEXT', 'ROOT'),
+ (ENTER, 'START', 'foo'),
+ (INSIDE, 'TEXT', 'FOO'),
+ (None, 'TEXT', ' 1.'),
+ (EXIT, 'END', 'foo'),
+ (None, 'START', 'bar'),
+ (None, 'TEXT', 'BAR'),
+ (None, 'END', 'bar'),
+ (None, 'END', 'root')]
)
@@ -1187,29 +1187,29 @@ class AttrTest(unittest.TestCase):
def test_set_existing_attr(self):
self.assertEqual(
self._attr('foo', 'name', 'FOO'),
- [(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (ENTER, START, (u'foo', {u'name': 'FOO', u'size': '100'})),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, (u'bar', {u'name': u'bar'})),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, ('foo', {'name': 'FOO', 'size': '100'})),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, ('bar', {'name': 'bar'})),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_set_new_attr(self):
self.assertEqual(
self._attr('foo', 'title', 'FOO'),
- [(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (ENTER, START, (u'foo', {u'name': u'foo', u'title': 'FOO', u'size': '100'})),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, (u'bar', {u'name': u'bar'})),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, ('foo', {'name': 'foo', 'title': 'FOO', 'size': '100'})),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, ('bar', {'name': 'bar'})),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_attr_from_function(self):
@@ -1219,29 +1219,29 @@ class AttrTest(unittest.TestCase):
self.assertEqual(
self._attr('foo|bar', 'name', set),
- [(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (ENTER, START, (u'foo', {u'name': 'FOO', u'size': '100'})),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (ENTER, START, (u'bar', {u'name': 'BAR'})),
- (INSIDE, TEXT, u'BAR'),
- (EXIT, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, ('foo', {'name': 'FOO', 'size': '100'})),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (ENTER, START, ('bar', {'name': 'BAR'})),
+ (INSIDE, TEXT, 'BAR'),
+ (EXIT, END, 'bar'),
+ (None, END, 'root')]
)
def test_remove_attr(self):
self.assertEqual(
self._attr('foo', 'name', None),
- [(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (ENTER, START, (u'foo', {u'size': '100'})),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, (u'bar', {u'name': u'bar'})),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, ('foo', {'size': '100'})),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, ('bar', {'name': 'bar'})),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
def test_remove_attr_with_function(self):
@@ -1250,15 +1250,15 @@ class AttrTest(unittest.TestCase):
self.assertEqual(
self._attr('foo', 'name', set),
- [(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (ENTER, START, (u'foo', {u'size': '100'})),
- (INSIDE, TEXT, u'FOO'),
- (EXIT, END, u'foo'),
- (None, START, (u'bar', {u'name': u'bar'})),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]
+ [(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (ENTER, START, ('foo', {'size': '100'})),
+ (INSIDE, TEXT, 'FOO'),
+ (EXIT, END, 'foo'),
+ (None, START, ('bar', {'name': 'bar'})),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]
)
@@ -1294,65 +1294,65 @@ class CopyTest(unittest.TestCase, BufferTestMixin):
def test_copy_element(self):
self.assertEqual(
self._apply('foo')[1],
- [[(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')]]
+ [[(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')]]
)
def test_copy_adjacent_elements(self):
self.assertEqual(
self._apply('foo|bar')[1],
- [[(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')],
- [(None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar')]]
+ [[(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')],
+ [(None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar')]]
)
def test_copy_all(self):
self.assertEqual(
self._apply('*|text()')[1],
- [[(None, TEXT, u'ROOT')],
- [(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')],
- [(None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar')]]
+ [[(None, TEXT, 'ROOT')],
+ [(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')],
+ [(None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar')]]
)
def test_copy_text(self):
self.assertEqual(
self._apply('*/text()')[1],
- [[(None, TEXT, u'FOO')],
- [(None, TEXT, u'BAR')]]
+ [[(None, TEXT, 'FOO')],
+ [(None, TEXT, 'BAR')]]
)
def test_copy_context(self):
self.assertEqual(
self._apply('.')[1],
- [[(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')]]
+ [[(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')]]
)
def test_copy_attribute(self):
self.assertEqual(
self._apply('foo/@name', with_attrs=True)[1],
- [[(None, ATTR, {'name': u'foo'})]]
+ [[(None, ATTR, {'name': 'foo'})]]
)
def test_copy_attributes(self):
self.assertEqual(
self._apply('foo/@*', with_attrs=True)[1],
- [[(None, ATTR, {u'name': u'foo', u'size': u'100'})]]
+ [[(None, ATTR, {'name': 'foo', 'size': '100'})]]
)
@@ -1362,104 +1362,104 @@ class CutTest(unittest.TestCase, BufferTestMixin):
def test_cut_element(self):
self.assertEqual(
self._apply('foo'),
- ([(None, START, u'root'),
- (None, TEXT, u'ROOT'),
- (None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')],
- [[(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')]])
+ ([(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
+ (None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')],
+ [[(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')]])
)
def test_cut_adjacent_elements(self):
self.assertEqual(
self._apply('foo|bar'),
- ([(None, START, u'root'),
- (None, TEXT, u'ROOT'),
+ ([(None, START, 'root'),
+ (None, TEXT, 'ROOT'),
(BREAK, BREAK, None),
- (None, END, u'root')],
- [[(None, START, u'foo'),
- (None, TEXT, u'FOO'),
- (None, END, u'foo')],
- [(None, START, u'bar'),
- (None, TEXT, u'BAR'),
- (None, END, u'bar')]])
+ (None, END, 'root')],
+ [[(None, START, 'foo'),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo')],
+ [(None, START, 'bar'),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar')]])
)
def test_cut_all(self):
self.assertEqual(
self._apply('*|text()'),
- ([(None, 'START', u'root'),
+ ([(None, 'START', 'root'),
('BREAK', 'BREAK', None),
('BREAK', 'BREAK', None),
- (None, 'END', u'root')],
- [[(None, 'TEXT', u'ROOT')],
- [(None, 'START', u'foo'),
- (None, 'TEXT', u'FOO'),
- (None, 'END', u'foo')],
- [(None, 'START', u'bar'),
- (None, 'TEXT', u'BAR'),
- (None, 'END', u'bar')]])
+ (None, 'END', 'root')],
+ [[(None, 'TEXT', 'ROOT')],
+ [(None, 'START', 'foo'),
+ (None, 'TEXT', 'FOO'),
+ (None, 'END', 'foo')],
+ [(None, 'START', 'bar'),
+ (None, 'TEXT', 'BAR'),
+ (None, 'END', 'bar')]])
)
def test_cut_text(self):
self.assertEqual(
self._apply('*/text()'),
- ([(None, 'START', u'root'),
- (None, 'TEXT', u'ROOT'),
- (None, 'START', u'foo'),
- (None, 'END', u'foo'),
- (None, 'START', u'bar'),
- (None, 'END', u'bar'),
- (None, 'END', u'root')],
- [[(None, 'TEXT', u'FOO')],
- [(None, 'TEXT', u'BAR')]])
+ ([(None, 'START', 'root'),
+ (None, 'TEXT', 'ROOT'),
+ (None, 'START', 'foo'),
+ (None, 'END', 'foo'),
+ (None, 'START', 'bar'),
+ (None, 'END', 'bar'),
+ (None, 'END', 'root')],
+ [[(None, 'TEXT', 'FOO')],
+ [(None, 'TEXT', 'BAR')]])
)
def test_cut_context(self):
self.assertEqual(
self._apply('.')[1],
- [[(None, 'START', u'root'),
- (None, 'TEXT', u'ROOT'),
- (None, 'START', u'foo'),
- (None, 'TEXT', u'FOO'),
- (None, 'END', u'foo'),
- (None, 'START', u'bar'),
- (None, 'TEXT', u'BAR'),
- (None, 'END', u'bar'),
- (None, 'END', u'root')]]
+ [[(None, 'START', 'root'),
+ (None, 'TEXT', 'ROOT'),
+ (None, 'START', 'foo'),
+ (None, 'TEXT', 'FOO'),
+ (None, 'END', 'foo'),
+ (None, 'START', 'bar'),
+ (None, 'TEXT', 'BAR'),
+ (None, 'END', 'bar'),
+ (None, 'END', 'root')]]
)
def test_cut_attribute(self):
self.assertEqual(
self._apply('foo/@name', with_attrs=True),
- ([(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (None, START, (u'foo', {u'size': u'100'})),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, (u'bar', {u'name': u'bar'})),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')],
- [[(None, ATTR, {u'name': u'foo'})]])
+ ([(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (None, START, ('foo', {'size': '100'})),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, ('bar', {'name': 'bar'})),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')],
+ [[(None, ATTR, {'name': 'foo'})]])
)
def test_cut_attributes(self):
self.assertEqual(
self._apply('foo/@*', with_attrs=True),
- ([(None, START, (u'root', {})),
- (None, TEXT, u'ROOT'),
- (None, START, (u'foo', {})),
- (None, TEXT, u'FOO'),
- (None, END, u'foo'),
- (None, START, (u'bar', {u'name': u'bar'})),
- (None, TEXT, u'BAR'),
- (None, END, u'bar'),
- (None, END, u'root')],
- [[(None, ATTR, {u'name': u'foo', u'size': u'100'})]])
+ ([(None, START, ('root', {})),
+ (None, TEXT, 'ROOT'),
+ (None, START, ('foo', {})),
+ (None, TEXT, 'FOO'),
+ (None, END, 'foo'),
+ (None, START, ('bar', {'name': 'bar'})),
+ (None, TEXT, 'BAR'),
+ (None, END, 'bar'),
+ (None, END, 'root')],
+ [[(None, ATTR, {'name': 'foo', 'size': '100'})]])
)
# XXX Test this when the XPath implementation is fixed (#233).
--- genshi/filters/transform.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/filters/transform.py
@@ -115,7 +115,7 @@ class PushBackStream(object):
yield peek
else:
try:
- event = self.stream.next()
+ event = next(self.stream)
yield event
except StopIteration:
if self.peek is None:
@@ -730,7 +730,7 @@ class SelectTransformation(object):
variables = {}
test = self.path.test()
stream = iter(stream)
- next = stream.next
+ next = stream.__next__
for mark, event in stream:
if mark is None:
yield mark, event
@@ -764,7 +764,7 @@ class SelectTransformation(object):
yield OUTSIDE, result
elif result:
# XXX Assume everything else is "text"?
- yield None, (TEXT, unicode(result), (None, -1, -1))
+ yield None, (TEXT, str(result), (None, -1, -1))
else:
yield None, event
@@ -990,7 +990,7 @@ class SubstituteTransformation(object):
:param replace: Replacement pattern.
:param count: Number of replacements to make in each text fragment.
"""
- if isinstance(pattern, basestring):
+ if isinstance(pattern, str):
self.pattern = re.compile(pattern)
else:
self.pattern = pattern
--- genshi/input.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/input.py
@@ -17,8 +17,8 @@ sources.
from itertools import chain
import codecs
-import htmlentitydefs as entities
-import HTMLParser as html
+import html.entities as entities
+import html.parser as html
from xml.parsers import expat
from genshi.core import Attrs, QName, Stream, stripentities
@@ -39,7 +39,7 @@ def ET(element):
"""
tag_name = QName(element.tag.lstrip('{'))
attrs = Attrs([(QName(attr.lstrip('{')), value)
- for attr, value in element.items()])
+ for attr, value in list(element.items())])
yield START, (tag_name, attrs), (None, -1, -1)
if element.text:
@@ -91,8 +91,8 @@ class XMLParser(object):
"""
_entitydefs = ['' % (name, value) for name, value in
- entities.name2codepoint.items()]
- _external_dtd = u'\n'.join(_entitydefs).encode('utf-8')
+ list(entities.name2codepoint.items())]
+ _external_dtd = '\n'.join(_entitydefs).encode('utf-8')
def __init__(self, source, filename=None, encoding=None):
"""Initialize the parser for the given XML input.
@@ -156,7 +156,7 @@ class XMLParser(object):
del self.expat # get rid of circular references
done = True
else:
- if isinstance(data, unicode):
+ if isinstance(data, str):
data = data.encode('utf-8')
self.expat.Parse(data, False)
for event in self._queue:
@@ -164,7 +164,7 @@ class XMLParser(object):
self._queue = []
if done:
break
- except expat.ExpatError, e:
+ except expat.ExpatError as e:
msg = str(e)
raise ParseError(msg, self.filename, e.lineno, e.offset)
return Stream(_generate()).filter(_coalesce)
@@ -242,7 +242,7 @@ class XMLParser(object):
if text.startswith('&'):
# deal with undefined entities
try:
- text = unichr(entities.name2codepoint[text[1:-1]])
+ text = chr(entities.name2codepoint[text[1:-1]])
self._enqueue(TEXT, text)
except KeyError:
filename, lineno, offset = self._getpos()
@@ -333,7 +333,7 @@ class HTMLParser(html.HTMLParser, object):
self.close()
done = True
else:
- if not isinstance(data, unicode):
+ if not isinstance(data, str):
raise UnicodeError("source returned bytes, but no encoding specified")
self.feed(data)
for kind, data, pos in self._queue:
@@ -345,7 +345,7 @@ class HTMLParser(html.HTMLParser, object):
for tag in open_tags:
yield END, QName(tag), pos
break
- except html.HTMLParseError, e:
+ except html.HTMLParseError as e:
msg = '%s: line %d, column %d' % (e.msg, e.lineno, e.offset)
raise ParseError(msg, self.filename, e.lineno, e.offset)
return Stream(_generate()).filter(_coalesce)
@@ -388,14 +388,14 @@ class HTMLParser(html.HTMLParser, object):
def handle_charref(self, name):
if name.lower().startswith('x'):
- text = unichr(int(name[1:], 16))
+ text = chr(int(name[1:], 16))
else:
- text = unichr(int(name))
+ text = chr(int(name))
self._enqueue(TEXT, text)
def handle_entityref(self, name):
try:
- text = unichr(entities.name2codepoint[name])
+ text = chr(entities.name2codepoint[name])
except KeyError:
text = '&%s;' % name
self._enqueue(TEXT, text)
@@ -434,7 +434,7 @@ def HTML(text, encoding=None):
:raises ParseError: if the HTML text is not well-formed, and error recovery
fails
"""
- if isinstance(text, unicode):
+ if isinstance(text, str):
# If it's unicode text the encoding should be set to None.
# The option to pass in an incorrect encoding is for ease
# of writing doctests that work in both Python 2.x and 3.x.
--- genshi/output.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/output.py
@@ -71,7 +71,7 @@ def get_serializer(method='xml', **kwargs):
:see: `XMLSerializer`, `XHTMLSerializer`, `HTMLSerializer`, `TextSerializer`
:since: version 0.4.1
"""
- if isinstance(method, basestring):
+ if isinstance(method, str):
method = {'xml': XMLSerializer,
'xhtml': XHTMLSerializer,
'html': HTMLSerializer,
@@ -581,7 +581,7 @@ class TextSerializer(object):
data = event[1]
if strip_markup and type(data) is Markup:
data = data.striptags().stripentities()
- yield unicode(data)
+ yield str(data)
class EmptyTagFilter(object):
@@ -636,7 +636,7 @@ class NamespaceFlattener(object):
self.cache = cache
def __call__(self, stream):
- prefixes = dict([(v, [k]) for k, v in self.prefixes.items()])
+ prefixes = dict([(v, [k]) for k, v in list(self.prefixes.items())])
namespaces = {XML_NAMESPACE.uri: ['xml']}
_emit, _get, cache = _prepare_cache(self.cache)
def _push_ns(prefix, uri):
@@ -666,7 +666,7 @@ class NamespaceFlattener(object):
while 1:
val += 1
yield 'ns%d' % val
- _gen_prefix = _gen_prefix().next
+ _gen_prefix = _gen_prefix().__next__
for kind, data, pos in stream:
if kind is TEXT and isinstance(data, Markup):
@@ -822,7 +822,7 @@ class DocTypeInserter(object):
:param doctype: DOCTYPE as a string or DocType object.
"""
- if isinstance(doctype, basestring):
+ if isinstance(doctype, str):
doctype = DocType.get(doctype)
self.doctype_event = (DOCTYPE, doctype, (None, -1, -1))
--- genshi/path.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/path.py
@@ -576,7 +576,7 @@ class Path(object):
variables = {}
stream = iter(stream)
def _generate(stream=stream, ns=namespaces, vs=variables):
- next = stream.next
+ next = stream.__next__
test = self.test()
for event in stream:
result = test(event, ns, vs)
@@ -932,13 +932,13 @@ def as_float(value):
return float(as_scalar(value))
def as_long(value):
- return long(as_scalar(value))
+ return int(as_scalar(value))
def as_string(value):
value = as_scalar(value)
if value is False:
return ''
- return unicode(value)
+ return str(value)
def as_bool(value):
return bool(as_scalar(value))
@@ -1346,8 +1346,8 @@ class TranslateFunction(Function):
string = as_string(self.string(kind, data, pos, namespaces, variables))
fromchars = as_string(self.fromchars(kind, data, pos, namespaces, variables))
tochars = as_string(self.tochars(kind, data, pos, namespaces, variables))
- table = dict(zip([ord(c) for c in fromchars],
- [ord(c) for c in tochars]))
+ table = dict(list(zip([ord(c) for c in fromchars],
+ [ord(c) for c in tochars])))
return string.translate(table)
def __repr__(self):
return 'translate(%r, %r, %r)' % (self.string, self.fromchars,
--- genshi/template/ast24.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/ast24.py
@@ -378,7 +378,7 @@ class ASTUpgrader(object):
def visit_Const(self, node):
if node.value is None: # appears in slices
return None
- elif isinstance(node.value, basestring):
+ elif isinstance(node.value, str):
return self._new(_ast.Str, node.value)
else:
return self._new(_ast.Num, node.value)
--- genshi/template/base.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/base.py
@@ -179,7 +179,7 @@ class Context(object):
:return: the number of variables in the context
"""
- return len(self.items())
+ return len(list(self.items()))
def __setitem__(self, key, value):
"""Set a variable in the current scope.
@@ -232,7 +232,7 @@ class Context(object):
:return: a list of variables
"""
- return [(key, self.get(key)) for key in self.keys()]
+ return [(key, self.get(key)) for key in list(self.keys())]
def update(self, mapping):
"""Update the context from the mapping provided."""
@@ -321,12 +321,11 @@ class DirectiveFactoryMeta(type):
return type.__new__(cls, name, bases, d)
-class DirectiveFactory(object):
+class DirectiveFactory(object, metaclass=DirectiveFactoryMeta):
"""Base for classes that provide a set of template directives.
:since: version 0.6
"""
- __metaclass__ = DirectiveFactoryMeta
directives = []
"""A list of ``(name, cls)`` tuples that define the set of directives
@@ -379,7 +378,7 @@ class Template(DirectiveFactory):
"""
serializer = None
- _number_conv = unicode # function used to convert numbers to event data
+ _number_conv = str # function used to convert numbers to event data
def __init__(self, source, filepath=None, filename=None, loader=None,
encoding=None, lookup='strict', allow_exec=True):
@@ -411,13 +410,13 @@ class Template(DirectiveFactory):
self._prepared = False
if not isinstance(source, Stream) and not hasattr(source, 'read'):
- if isinstance(source, unicode):
+ if isinstance(source, str):
source = StringIO(source)
else:
source = BytesIO(source)
try:
self._stream = self._parse(source, encoding)
- except ParseError, e:
+ except ParseError as e:
raise TemplateSyntaxError(e.msg, self.filepath, e.lineno, e.offset)
def __getstate__(self):
@@ -502,7 +501,7 @@ class Template(DirectiveFactory):
if kind is INCLUDE:
href, cls, fallback = data
tmpl_inlined = False
- if (isinstance(href, basestring) and
+ if (isinstance(href, str) and
not getattr(self.loader, 'auto_reload', True)):
# If the path to the included template is static, and
# auto-reloading is disabled on the template loader,
@@ -601,16 +600,16 @@ class Template(DirectiveFactory):
# First check for a string, otherwise the iterable test
# below succeeds, and the string will be chopped up into
# individual characters
- if isinstance(result, basestring):
+ if isinstance(result, str):
yield TEXT, result, pos
- elif isinstance(result, (int, float, long)):
+ elif isinstance(result, (int, float)):
yield TEXT, number_conv(result), pos
elif hasattr(result, '__iter__'):
push(stream)
stream = _ensure(result)
break
else:
- yield TEXT, unicode(result), pos
+ yield TEXT, str(result), pos
elif kind is SUB:
# This event is a list of directives and a list of nested
@@ -639,7 +638,7 @@ class Template(DirectiveFactory):
for event in stream:
if event[0] is INCLUDE:
href, cls, fallback = event[1]
- if not isinstance(href, basestring):
+ if not isinstance(href, str):
parts = []
for subkind, subdata, subpos in self._flatten(href, ctxt,
**vars):
--- genshi/template/directives.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/directives.py
@@ -35,7 +35,7 @@ class DirectiveMeta(type):
return type.__new__(cls, name, bases, d)
-class Directive(object):
+class Directive(object, metaclass=DirectiveMeta):
"""Abstract base class for template directives.
A directive is basically a callable that takes three positional arguments:
@@ -53,7 +53,6 @@ class Directive(object):
described above, and can only be applied programmatically (for example by
template filters).
"""
- __metaclass__ = DirectiveMeta
__slots__ = ['expr']
def __init__(self, value, template=None, namespaces=None, lineno=-1,
@@ -108,7 +107,7 @@ class Directive(object):
try:
return expr and Expression(expr, template.filepath, lineno,
lookup=template.lookup) or None
- except SyntaxError, err:
+ except SyntaxError as err:
err.msg += ' in expression "%s" of "%s" directive' % (expr,
cls.tagname)
raise TemplateSyntaxError(err, template.filepath, lineno,
@@ -165,18 +164,18 @@ class AttrsDirective(Directive):
def __call__(self, stream, directives, ctxt, **vars):
def _generate():
- kind, (tag, attrib), pos = stream.next()
+ kind, (tag, attrib), pos = next(stream)
attrs = _eval_expr(self.expr, ctxt, vars)
if attrs:
if isinstance(attrs, Stream):
try:
- attrs = iter(attrs).next()
+ attrs = next(iter(attrs))
except StopIteration:
attrs = []
elif not isinstance(attrs, list): # assume it's a dict
- attrs = attrs.items()
+ attrs = list(attrs.items())
attrib |= [
- (QName(n), v is not None and unicode(v).strip() or None)
+ (QName(n), v is not None and str(v).strip() or None)
for n, v in attrs
]
yield kind, (tag, attrib), pos
@@ -537,8 +536,8 @@ class StripDirective(Directive):
def __call__(self, stream, directives, ctxt, **vars):
def _generate():
if not self.expr or _eval_expr(self.expr, ctxt, vars):
- stream.next() # skip start tag
- previous = stream.next()
+ next(stream) # skip start tag
+ previous = next(stream)
for event in stream:
yield previous
previous = event
@@ -630,13 +629,13 @@ class WhenDirective(Directive):
if not info:
raise TemplateRuntimeError('"when" directives can only be used '
'inside a "choose" directive',
- self.filename, *(stream.next())[2][1:])
+ self.filename, *(next(stream))[2][1:])
if info[0]:
return []
if not self.expr and not info[1]:
raise TemplateRuntimeError('either "choose" or "when" directive '
'must have a test expression',
- self.filename, *(stream.next())[2][1:])
+ self.filename, *(next(stream))[2][1:])
if info[1]:
value = info[2]
if self.expr:
@@ -669,7 +668,7 @@ class OtherwiseDirective(Directive):
if not info:
raise TemplateRuntimeError('an "otherwise" directive can only be '
'used inside a "choose" directive',
- self.filename, *(stream.next())[2][1:])
+ self.filename, *(next(stream))[2][1:])
if info[0]:
return []
info[0] = True
@@ -706,7 +705,7 @@ class WithDirective(Directive):
self.vars.append(([_assignment(n) for n in node.targets],
Expression(node.value, template.filepath,
lineno, lookup=template.lookup)))
- except SyntaxError, err:
+ except SyntaxError as err:
err.msg += ' in expression "%s" of "%s" directive' % (value,
self.tagname)
raise TemplateSyntaxError(err, template.filepath, lineno,
--- genshi/template/eval.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/eval.py
@@ -13,7 +13,7 @@
"""Support for "safe" evaluation of Python expressions."""
-import __builtin__
+import builtins
from textwrap import dedent
from types import CodeType
@@ -37,7 +37,7 @@ has_star_import_bug = False
try:
class _FakeMapping(object):
__getitem__ = __setitem__ = lambda *a: None
- exec 'from sys import *' in {}, _FakeMapping()
+ exec('from sys import *', {}, _FakeMapping())
except SystemError:
has_star_import_bug = True
del _FakeMapping
@@ -75,7 +75,7 @@ class Code(object):
if `None`, the appropriate transformation is chosen
depending on the mode
"""
- if isinstance(source, basestring):
+ if isinstance(source, str):
self.source = source
node = _parse(source, mode=self.mode)
else:
@@ -94,13 +94,13 @@ class Code(object):
filename=filename, lineno=lineno, xform=xform)
if lookup is None:
lookup = LenientLookup
- elif isinstance(lookup, basestring):
+ elif isinstance(lookup, str):
lookup = {'lenient': LenientLookup, 'strict': StrictLookup}[lookup]
self._globals = lookup.globals
def __getstate__(self):
state = {'source': self.source, 'ast': self.ast,
- 'lookup': self._globals.im_self}
+ 'lookup': self._globals.__self__}
state['code'] = get_code_params(self.code)
return state
@@ -196,7 +196,7 @@ class Suite(Code):
"""
__traceback_hide__ = 'before_and_this'
_globals = self._globals(data)
- exec self.code in _globals, data
+ exec(self.code, _globals, data)
UNDEFINED = object()
@@ -264,7 +264,7 @@ class Undefined(object):
def __iter__(self):
return iter([])
- def __nonzero__(self):
+ def __bool__(self):
return False
def __repr__(self):
@@ -333,8 +333,8 @@ class LookupBase(object):
key = key[0]
try:
return obj[key]
- except (AttributeError, KeyError, IndexError, TypeError), e:
- if isinstance(key, basestring):
+ except (AttributeError, KeyError, IndexError, TypeError) as e:
+ if isinstance(key, str):
val = getattr(obj, key, UNDEFINED)
if val is UNDEFINED:
val = cls.undefined(key, owner=obj)
@@ -424,8 +424,8 @@ def _parse(source, mode='eval'):
if first.rstrip().endswith(':') and not rest[0].isspace():
rest = '\n'.join([' %s' % line for line in rest.splitlines()])
source = '\n'.join([first, rest])
- if isinstance(source, unicode):
- source = (u'\ufeff' + source).encode('utf-8')
+ if isinstance(source, str):
+ source = ('\ufeff' + source).encode('utf-8')
return parse(source, mode)
@@ -435,11 +435,11 @@ def _compile(node, source=None, mode='eval', filename=
filename = '
'
if IS_PYTHON2:
# Python 2 requires non-unicode filenames
- if isinstance(filename, unicode):
+ if isinstance(filename, str):
filename = filename.encode('utf-8', 'replace')
else:
# Python 3 requires unicode filenames
- if not isinstance(filename, unicode):
+ if not isinstance(filename, str):
filename = filename.decode('utf-8', 'replace')
if lineno <= 0:
lineno = 1
@@ -483,7 +483,7 @@ def _new(class_, *args, **kwargs):
return ret
-BUILTINS = __builtin__.__dict__.copy()
+BUILTINS = builtins.__dict__.copy()
BUILTINS.update({'Markup': Markup, 'Undefined': Undefined})
CONSTANTS = frozenset(['False', 'True', 'None', 'NotImplemented', 'Ellipsis'])
@@ -527,7 +527,7 @@ class TemplateASTTransformer(ASTTransformer):
return names
def visit_Str(self, node):
- if not isinstance(node.s, unicode):
+ if not isinstance(node.s, str):
try: # If the string is ASCII, return a `str` object
node.s.decode('ascii')
except ValueError: # Otherwise return a `unicode` object
--- genshi/template/interpolation.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/interpolation.py
@@ -77,7 +77,7 @@ def interpolate(text, filepath=None, lineno=-1, offset
expr = Expression(chunk.strip(), pos[0], pos[1],
lookup=lookup)
yield EXPR, expr, tuple(pos)
- except SyntaxError, err:
+ except SyntaxError as err:
raise TemplateSyntaxError(err, filepath, pos[1],
pos[2] + (err.offset or 0))
else:
--- genshi/template/loader.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/loader.py
@@ -217,7 +217,7 @@ class TemplateLoader(object):
raise TemplateError('Search path for templates not configured')
for loadfunc in search_path:
- if isinstance(loadfunc, basestring):
+ if isinstance(loadfunc, str):
loadfunc = directory(loadfunc)
try:
filepath, filename, fileobj, uptodate = loadfunc(filename)
@@ -327,9 +327,9 @@ class TemplateLoader(object):
:rtype: ``function``
"""
def _dispatch_by_prefix(filename):
- for prefix, delegate in delegates.items():
+ for prefix, delegate in list(delegates.items()):
if filename.startswith(prefix):
- if isinstance(delegate, basestring):
+ if isinstance(delegate, str):
delegate = directory(delegate)
filepath, _, fileobj, uptodate = delegate(
filename[len(prefix):].lstrip('/\\')
--- genshi/template/markup.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/markup.py
@@ -93,7 +93,7 @@ class MarkupTemplate(Template):
try:
suite = Suite(data[1], self.filepath, pos[1],
lookup=self.lookup)
- except SyntaxError, err:
+ except SyntaxError as err:
raise TemplateSyntaxError(err, self.filepath,
pos[1] + (err.lineno or 1) - 1,
pos[2] + (err.offset or 0))
@@ -311,7 +311,7 @@ class MarkupTemplate(Template):
def _strip(stream, append):
depth = 1
- next = stream.next
+ next = stream.__next__
while 1:
event = next()
if event[0] is START:
--- genshi/template/plugin.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/plugin.py
@@ -46,7 +46,7 @@ class AbstractTemplateEnginePlugin(object):
self.default_encoding = options.get('genshi.default_encoding', None)
auto_reload = options.get('genshi.auto_reload', '1')
- if isinstance(auto_reload, basestring):
+ if isinstance(auto_reload, str):
auto_reload = auto_reload.lower() in ('1', 'on', 'yes', 'true')
search_path = [p for p in
options.get('genshi.search_path', '').split(':') if p]
@@ -168,7 +168,7 @@ class TextTemplateEnginePlugin(AbstractTemplateEngineP
options = {}
new_syntax = options.get('genshi.new_text_syntax')
- if isinstance(new_syntax, basestring):
+ if isinstance(new_syntax, str):
new_syntax = new_syntax.lower() in ('1', 'on', 'yes', 'true')
if new_syntax:
self.template_class = NewTextTemplate
--- genshi/template/tests/directives.py.orig 2019-05-27 21:03:08 UTC
+++ genshi/template/tests/directives.py
@@ -426,7 +426,7 @@ class ForDirectiveTestCase(unittest.TestCase):
3
4
5
- """, tmpl.generate(items=range(1, 6)).render(encoding=None))
+ """, tmpl.generate(items=list(range(1, 6))).render(encoding=None))
def test_as_element(self):
"""
@@ -443,7 +443,7 @@ class ForDirectiveTestCase(unittest.TestCase):
3
4
5
- """, tmpl.generate(items=range(1, 6)).render(encoding=None))
+ """, tmpl.generate(items=list(range(1, 6))).render(encoding=None))
def test_multi_assignment(self):
"""
@@ -487,7 +487,7 @@ class ForDirectiveTestCase(unittest.TestCase):
try:
list(tmpl.generate(foo=12))
self.fail('Expected TemplateRuntimeError')
- except TypeError, e:
+ except TypeError as e:
assert (str(e) == "iteration over non-sequence" or
str(e) == "'int' object is not iterable")
exc_type, exc_value, exc_traceback = sys.exc_info()
@@ -513,7 +513,7 @@ class ForDirectiveTestCase(unittest.TestCase):
""", filename='test.html').generate()
self.fail('ExpectedTemplateSyntaxError')
- except TemplateSyntaxError, e:
+ except TemplateSyntaxError as e:
self.assertEqual('test.html', e.filename)
if sys.version_info[:2] > (2,4):
self.assertEqual(2, e.lineno)
@@ -1050,7 +1050,7 @@ class ContentDirectiveTestCase(unittest.TestCase):
Foo
""", filename='test.html').generate()
self.fail('Expected TemplateSyntaxError')
- except TemplateSyntaxError, e:
+ except TemplateSyntaxError as e:
self.assertEqual('test.html', e.filename)
self.assertEqual(2, e.lineno)
@@ -1068,7 +1068,7 @@ class ReplaceDirectiveTestCase(unittest.TestCase):
Foo
""", filename='test.html').generate()
self.fail('Expected TemplateSyntaxError')
- except TemplateSyntaxError, e:
+ except TemplateSyntaxError as e:
self.assertEqual('test.html', e.filename)
self.assertEqual(2, e.lineno)
@@ -1190,12 +1190,12 @@ class WithDirectiveTestCase(unittest.TestCase):
""", tmpl.generate(foo={'bar': 42}).render(encoding=None))
def test_unicode_expr(self):
- tmpl = MarkupTemplate(u"""