changeset 750:d007a0d7ba81

Remove some cruft for supporting Python 2.3.
author cmlenz
date Mon, 09 Jun 2008 15:19:59 +0000
parents 3a456053fa1a
children 3ac7b7964061
files genshi/builder.py genshi/filters/html.py genshi/filters/i18n.py genshi/filters/tests/html.py genshi/input.py genshi/output.py genshi/template/base.py genshi/template/directives.py genshi/template/eval.py genshi/template/tests/directives.py genshi/template/tests/eval.py genshi/template/tests/markup.py genshi/tests/input.py genshi/util.py
diffstat 14 files changed, 38 insertions(+), 110 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/builder.py
+++ b/genshi/builder.py
@@ -68,11 +68,6 @@
 Hello, <em>world</em>!
 """
 
-try:
-    set
-except NameError:
-    from sets import Set as set
-
 from genshi.core import Attrs, Markup, Namespace, QName, Stream, \
                         START, END, TEXT
 
--- a/genshi/filters/html.py
+++ b/genshi/filters/html.py
@@ -13,11 +13,6 @@
 
 """Implementation of a number of stream filters."""
 
-try:
-    set
-except NameError:
-    from sets import ImmutableSet as frozenset
-    from sets import Set as set
 import re
 
 from genshi.core import Attrs, QName, stripentities
--- a/genshi/filters/i18n.py
+++ b/genshi/filters/i18n.py
@@ -17,10 +17,6 @@
 """
 
 from compiler import ast
-try:
-    frozenset
-except NameError:
-    from sets import ImmutableSet as frozenset
 from gettext import gettext
 import re
 
--- a/genshi/filters/tests/html.py
+++ b/genshi/filters/tests/html.py
@@ -12,10 +12,6 @@
 # history and logs, available at http://genshi.edgewall.org/log/.
 
 import doctest
-try:
-    set
-except NameError:
-    from sets import Set as set
 import unittest
 
 from genshi.input import HTML, ParseError
--- a/genshi/input.py
+++ b/genshi/input.py
@@ -17,10 +17,6 @@
 
 from itertools import chain
 from xml.parsers import expat
-try:
-    frozenset
-except NameError:
-    from sets import ImmutableSet as frozenset
 import HTMLParser as html
 import htmlentitydefs
 from StringIO import StringIO
@@ -133,10 +129,6 @@
         parser.UseForeignDTD()
         parser.ExternalEntityRefHandler = self._build_foreign
 
-        # Location reporting is only support in Python >= 2.4
-        if not hasattr(parser, 'CurrentLineNumber'):
-            self._getpos = self._getpos_unknown
-
         self.expat = parser
         self._queue = []
 
--- a/genshi/output.py
+++ b/genshi/output.py
@@ -16,10 +16,6 @@
 """
 
 from itertools import chain
-try:
-    frozenset
-except NameError:
-    from sets import ImmutableSet as frozenset
 import re
 
 from genshi.core import escape, Attrs, Markup, Namespace, QName, StreamEventKind
--- a/genshi/template/base.py
+++ b/genshi/template/base.py
@@ -30,11 +30,6 @@
            'TemplateSyntaxError', 'BadDirectiveError']
 __docformat__ = 'restructuredtext en'
 
-if sys.version_info < (2, 4):
-    _ctxt2dict = lambda ctxt: ctxt.frames[0]
-else:
-    _ctxt2dict = lambda ctxt: ctxt
-
 
 class TemplateError(Exception):
     """Base exception class for errors related to template processing."""
@@ -299,7 +294,7 @@
     if vars:
         ctxt.push(vars)
         ctxt.push({})
-    suite.execute(_ctxt2dict(ctxt))
+    suite.execute(ctxt)
     if vars:
         top = ctxt.pop()
         ctxt.pop()
--- a/genshi/template/directives.py
+++ b/genshi/template/directives.py
@@ -14,10 +14,6 @@
 """Implementation of the various template directives."""
 
 import compiler
-try:
-    frozenset
-except NameError:
-    from sets import ImmutableSet as frozenset
 
 from genshi.core import QName, Stream
 from genshi.path import Path
@@ -316,11 +312,7 @@
             for event in _apply_directives(stream, directives, ctxt, **vars):
                 yield event
             ctxt.pop()
-        try:
-            function.__name__ = self.name
-        except TypeError:
-            # Function name can't be set in Python 2.3 
-            pass
+        function.__name__ = self.name
 
         # Store the function reference in the bottom context frame so that it
         # doesn't get popped off before processing the template has finished
--- a/genshi/template/eval.py
+++ b/genshi/template/eval.py
@@ -17,11 +17,6 @@
 from compiler import ast, parse
 from compiler.pycodegen import ExpressionCodeGenerator, ModuleCodeGenerator
 import new
-try:
-    set
-except NameError:
-    from sets import ImmutableSet as frozenset
-    from sets import Set as set
 from textwrap import dedent
 
 from genshi.core import Markup
@@ -40,8 +35,6 @@
     exec 'from sys import *' in {}, _FakeMapping()
 except SystemError:
     has_star_import_bug = True
-except TypeError:
-    pass # Python 2.3
 del _FakeMapping
 
 def _star_import_patch(mapping, modname):
@@ -484,8 +477,8 @@
         node = node.__class__(*args)
         if lineno is not None:
             node.lineno = lineno
-        if isinstance(node, (ast.Class, ast.Function, ast.Lambda)) or \
-                hasattr(ast, 'GenExpr') and isinstance(node, ast.GenExpr):
+        if isinstance(node, (ast.Class, ast.Function, ast.Lambda,
+                             ast.GenExpr)):
             node.filename = '<string>' # workaround for bug in pycodegen
         return node
 
@@ -520,13 +513,10 @@
             # This is a Python 2.4 bug. Only if we have a broken Python
             # version we have to apply the hack
             return node
-        new_node = ast.Discard(ast.CallFunc(
+        return ast.Discard(ast.CallFunc(
             ast.Name('_star_import_patch'),
             [ast.Name('__data__'), ast.Const(node.modname)], None, None
-        ))
-        if hasattr(node, 'lineno'): # No lineno in Python 2.3
-            new_node.lineno = node.lineno
-        return new_node
+        ), lineno=node.lineno)
 
     def visitFunction(self, node):
         args = []
--- a/genshi/template/tests/directives.py
+++ b/genshi/template/tests/directives.py
@@ -496,8 +496,7 @@
                              frames[-1].tb_frame.f_code.co_name)
             self.assertEqual('test.html',
                              frames[-1].tb_frame.f_code.co_filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(2, frames[-1].tb_lineno)
+            self.assertEqual(2, frames[-1].tb_lineno)
 
     def test_for_with_empty_value(self):
         """
@@ -970,8 +969,7 @@
             self.fail('Expected TemplateSyntaxError')
         except TemplateSyntaxError, e:
             self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(2, e.lineno)
+            self.assertEqual(2, e.lineno)
 
 
 class ReplaceDirectiveTestCase(unittest.TestCase):
@@ -989,8 +987,7 @@
             self.fail('Expected TemplateSyntaxError')
         except TemplateSyntaxError, e:
             self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(2, e.lineno)
+            self.assertEqual(2, e.lineno)
 
     def test_as_element(self):
         tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/">
--- a/genshi/template/tests/eval.py
+++ b/genshi/template/tests/eval.py
@@ -18,7 +18,7 @@
 import unittest
 
 from genshi.core import Markup
-from genshi.template.base import Context, _ctxt2dict
+from genshi.template.base import Context
 from genshi.template.eval import Expression, Suite, Undefined, UndefinedError, \
                                  UNDEFINED
 
@@ -241,11 +241,6 @@
         self.assertEqual(42, expr.evaluate({'foo': foo, 'bar': {"x": 42}}))
 
     def test_lambda(self):
-        # Define a custom `sorted` function cause the builtin isn't available
-        # on Python 2.3
-        def sorted(items, compfunc):
-            items.sort(compfunc)
-            return items
         data = {'items': [{'name': 'b', 'value': 0}, {'name': 'a', 'value': 1}],
                 'sorted': sorted}
         expr = Expression("sorted(items, lambda a, b: cmp(a.name, b.name))")
@@ -274,30 +269,27 @@
         expr = Expression("[i['name'] for i in items if i['value'] > 1]")
         self.assertEqual(['b'], expr.evaluate({'items': items}))
 
-    if sys.version_info >= (2, 4):
-        # Generator expressions only supported in Python 2.4 and up
-
-        def test_generator_expression(self):
-            expr = Expression("list(n for n in numbers if n < 2)")
-            self.assertEqual([0, 1], expr.evaluate({'numbers': range(5)}))
-
-            expr = Expression("list((i, n + 1) for i, n in enumerate(numbers))")
-            self.assertEqual([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)],
-                             expr.evaluate({'numbers': range(5)}))
+    def test_generator_expression(self):
+        expr = Expression("list(n for n in numbers if n < 2)")
+        self.assertEqual([0, 1], expr.evaluate({'numbers': range(5)}))
 
-            expr = Expression("list(offset + n for n in numbers)")
-            self.assertEqual([2, 3, 4, 5, 6],
-                             expr.evaluate({'numbers': range(5), 'offset': 2}))
+        expr = Expression("list((i, n + 1) for i, n in enumerate(numbers))")
+        self.assertEqual([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)],
+                         expr.evaluate({'numbers': range(5)}))
 
-        def test_generator_expression_with_getattr(self):
-            items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
-            expr = Expression("list(i.name for i in items if i.value > 1)")
-            self.assertEqual(['b'], expr.evaluate({'items': items}))
+        expr = Expression("list(offset + n for n in numbers)")
+        self.assertEqual([2, 3, 4, 5, 6],
+                         expr.evaluate({'numbers': range(5), 'offset': 2}))
 
-        def test_generator_expression_with_getitem(self):
-            items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
-            expr = Expression("list(i['name'] for i in items if i['value'] > 1)")
-            self.assertEqual(['b'], expr.evaluate({'items': items}))
+    def test_generator_expression_with_getattr(self):
+        items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
+        expr = Expression("list(i.name for i in items if i.value > 1)")
+        self.assertEqual(['b'], expr.evaluate({'items': items}))
+
+    def test_generator_expression_with_getitem(self):
+        items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
+        expr = Expression("list(i['name'] for i in items if i['value'] > 1)")
+        self.assertEqual(['b'], expr.evaluate({'items': items}))
 
     if sys.version_info >= (2, 5):
         def test_conditional_expression(self):
@@ -575,7 +567,7 @@
     def test_import_star(self):
         suite = Suite("from itertools import *")
         data = Context()
-        suite.execute(_ctxt2dict(data))
+        suite.execute(data)
         assert 'ifilter' in data
 
     def test_for(self):
--- a/genshi/template/tests/markup.py
+++ b/genshi/template/tests/markup.py
@@ -81,8 +81,7 @@
             tmpl = MarkupTemplate(xml, filename='test.html')
         except BadDirectiveError, e:
             self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(1, e.lineno)
+            self.assertEqual(1, e.lineno)
 
     def test_directive_value_syntax_error(self):
         xml = """<p xmlns:py="http://genshi.edgewall.org/" py:if="bar'" />"""
@@ -91,8 +90,7 @@
             self.fail('Expected SyntaxError')
         except TemplateSyntaxError, e:
             self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(1, e.lineno)
+            self.assertEqual(1, e.lineno)
 
     def test_expression_syntax_error(self):
         xml = """<p>
@@ -103,8 +101,7 @@
             self.fail('Expected SyntaxError')
         except TemplateSyntaxError, e:
             self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(2, e.lineno)
+            self.assertEqual(2, e.lineno)
 
     def test_expression_syntax_error_multi_line(self):
         xml = """<p><em></em>
@@ -117,8 +114,7 @@
             self.fail('Expected SyntaxError')
         except TemplateSyntaxError, e:
             self.assertEqual('test.html', e.filename)
-            if sys.version_info[:2] >= (2, 4):
-                self.assertEqual(3, e.lineno)
+            self.assertEqual(3, e.lineno)
 
     def test_markup_noescape(self):
         """
--- a/genshi/tests/input.py
+++ b/genshi/tests/input.py
@@ -28,8 +28,7 @@
         kind, data, pos = events[1]
         self.assertEqual(Stream.TEXT, kind)
         self.assertEqual(u'foo bar', data)
-        if sys.version_info[:2] >= (2, 4):
-            self.assertEqual((None, 1, 6), pos)
+        self.assertEqual((None, 1, 6), pos)
 
     def test_text_node_pos_multi_line(self):
         text = '''<elem>foo
@@ -38,8 +37,7 @@
         kind, data, pos = events[1]
         self.assertEqual(Stream.TEXT, kind)
         self.assertEqual(u'foo\nbar', data)
-        if sys.version_info[:2] >= (2, 4):
-            self.assertEqual((None, 1, -1), pos)
+        self.assertEqual((None, 1, -1), pos)
 
     def test_element_attribute_order(self):
         text = '<elem title="baz" id="foo" class="bar" />'
@@ -123,8 +121,7 @@
         kind, data, pos = events[1]
         self.assertEqual(Stream.TEXT, kind)
         self.assertEqual(u'foo bar', data)
-        if sys.version_info[:2] >= (2, 4):
-            self.assertEqual((None, 1, 6), pos)
+        self.assertEqual((None, 1, 6), pos)
 
     def test_text_node_pos_multi_line(self):
         text = '''<elem>foo
@@ -133,8 +130,7 @@
         kind, data, pos = events[1]
         self.assertEqual(Stream.TEXT, kind)
         self.assertEqual(u'foo\nbar', data)
-        if sys.version_info[:2] >= (2, 4):
-            self.assertEqual((None, 1, 6), pos)
+        self.assertEqual((None, 1, 6), pos)
 
     def test_input_encoding_text(self):
         text = u'<div>\xf6</div>'.encode('iso-8859-1')
--- a/genshi/util.py
+++ b/genshi/util.py
@@ -203,7 +203,7 @@
     
     If the `keepxmlentities` parameter is provided and is a truth value, the
     core XML entities (&amp;, &apos;, &gt;, &lt; and &quot;) are left intact.
-
+    
     >>> stripentities('1 &lt; 2 &hellip;', keepxmlentities=True)
     u'1 &lt; 2 \u2026'
     """
Copyright (C) 2012-2017 Edgewall Software