Approaching python3 compatibility
authorArmin Ronacher <armin.ronacher@active-4.com>
Tue, 9 Feb 2010 23:05:46 +0000 (00:05 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Tue, 9 Feb 2010 23:05:46 +0000 (00:05 +0100)
--HG--
branch : trunk

MANIFEST.in
custom_fixers/fix_alt_unicode.py
custom_fixers/fix_xrange2.py [new file with mode: 0644]
jinja2/environment.py
jinja2/exceptions.py
jinja2/sandbox.py
jinja2/testsuite/__init__.py
jinja2/utils.py
setup.py

index 2aa5b4e0ec16f70d222f1f76ec32cd3c62394136..b341589cfa5b2ff06acc797035ccda8cdec2ae3a 100644 (file)
@@ -4,4 +4,5 @@ recursive-include tests *
 recursive-include ext *
 recursive-include artwork *
 recursive-include examples *
+recursive-include jinja2/testsuite/res *
 recursive-exclude docs/_build/doctrees *
index 82e91b39d795641e10ff65f3f43e970b7b5181c2..96a81c16eb26aaefdd6796faafc06ddd69ed2a1b 100644 (file)
@@ -4,21 +4,10 @@ from lib2to3.fixer_util import Name, BlankLine
 
 class FixAltUnicode(fixer_base.BaseFix):
     PATTERN = """
-    func=funcdef< 'def' name=NAME
+    func=funcdef< 'def' name='__unicode__'
                   parameters< '(' NAME ')' > any+ >
     """
 
-    run_order = 5
-
     def transform(self, node, results):
         name = results['name']
-
-        # rename __unicode__ to __str__
-        if name.value == '__unicode__':
-            name.replace(Name('__str__', prefix=name.prefix))
-
-        # get rid of other __str__'s
-        elif name.value == '__str__':
-            next = BlankLine()
-            next.prefix = results['func'].prefix
-            return next
+        name.replace(Name('__str__', prefix=name.prefix))
diff --git a/custom_fixers/fix_xrange2.py b/custom_fixers/fix_xrange2.py
new file mode 100644 (file)
index 0000000..5d35e50
--- /dev/null
@@ -0,0 +1,11 @@
+from lib2to3 import fixer_base
+from lib2to3.fixer_util import Name, BlankLine
+
+
+# whyever this is necessary..
+
+class FixXrange2(fixer_base.BaseFix):
+    PATTERN = "'xrange'"
+
+    def transform(self, node, results):
+        node.replace(Name('range', prefix=node.prefix))
index cda6171343481fc665b83af07c3d27e609a3cb64..965b0582349e21ba2bb33b95454a155f2a0358cf 100644 (file)
@@ -808,15 +808,15 @@ class TemplateModule(object):
         self.__dict__.update(context.get_exported())
         self.__name__ = template.name
 
-    def __unicode__(self):
-        return concat(self._body_stream)
-
     def __html__(self):
         return Markup(concat(self._body_stream))
 
     def __str__(self):
         return unicode(self).encode('utf-8')
 
+    def __unicode__(self):
+        return concat(self._body_stream)
+
     def __repr__(self):
         if self.__name__ is None:
             name = 'memory:%x' % id(self)
index 37071ed07d5677f8d8991f2a40106b49c2df6871..4df8324d3350c699ae6cec428bb866b86d0907e3 100644 (file)
@@ -41,12 +41,12 @@ class TemplateNotFound(IOError, LookupError, TemplateError):
         self.name = name
         self.templates = [name]
 
-    def __unicode__(self):
-        return self.message
-
     def __str__(self):
         return self.message.encode('utf-8')
 
+    def __unicode__(self):
+        return self.message
+
 
 class TemplatesNotFound(TemplateNotFound):
     """Like :class:`TemplateNotFound` but raised if multiple templates
@@ -78,6 +78,9 @@ class TemplateSyntaxError(TemplateError):
         # function translated the syntax error into a new traceback
         self.translated = False
 
+    def __str__(self):
+        return unicode(self).encode('utf-8')
+
     def __unicode__(self):
         # for translated errors we only return the message
         if self.translated:
@@ -101,9 +104,6 @@ class TemplateSyntaxError(TemplateError):
 
         return u'\n'.join(lines)
 
-    def __str__(self):
-        return unicode(self).encode('utf-8')
-
 
 class TemplateAssertionError(TemplateSyntaxError):
     """Like a template syntax error, but covers cases where something in the
index 98873102c855997fcb4c1e2fea0d0aa250096413..749719548af8c69f896cf43da807f354020411ee 100644 (file)
@@ -37,13 +37,21 @@ import warnings
 warnings.filterwarnings('ignore', 'the sets module', DeprecationWarning,
                         module='jinja2.sandbox')
 
-
 from collections import deque
-from UserDict import UserDict, DictMixin
-from UserList import UserList
+
 _mutable_set_types = (set,)
-_mutable_mapping_types = (UserDict, DictMixin, dict)
-_mutable_sequence_types = (UserList, list)
+_mutable_mapping_types = (dict,)
+_mutable_sequence_types = (list,)
+
+
+# on python 2.x we can register the user collection types
+try:
+    from UserDict import UserDict, DictMixin
+    from UserList import UserList
+    _mutable_mapping_types += (UserDict, DictMixin)
+    _mutable_set_types += (UserList,)
+except ImportError:
+    pass
 
 # if sets is still available, register the mutable set from there as well
 try:
index a2227770d6d025664ab9a9b1196c610a4c322ff2..7099355431530ab8f2d4530733b28a3edbf75bf0 100644 (file)
@@ -11,8 +11,8 @@
     :license: BSD, see LICENSE for more details.
 """
 import os
-import sys
 import re
+import sys
 import unittest
 from traceback import format_exception
 from jinja2 import loaders
@@ -74,5 +74,10 @@ def suite():
     suite.addTest(regression.suite())
     suite.addTest(debug.suite())
     suite.addTest(utils.suite())
-    suite.addTest(doctests.suite())
+
+    # doctests will not run on python 3 currently.  Too many issues
+    # with that, do not test that on that platform.
+    if sys.version_info < (3, 0):
+        suite.addTest(doctests.suite())
+
     return suite
index f43743c55800e32d12b824e3d2fdc4bfe6f3cdec..57fd3c514c4012ba643990d890b7e8d511e6e85c 100644 (file)
@@ -203,7 +203,7 @@ def open_if_exists(filename, mode='rb'):
     otherwise `None`.
     """
     try:
-        return file(filename, mode)
+        return open(filename, mode)
     except IOError, e:
         if e.errno not in (errno.ENOENT, errno.EISDIR):
             raise
@@ -506,8 +506,8 @@ class _MarkupEscapeHelper(object):
         self.obj = obj
 
     __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x])
-    __unicode__ = lambda s: unicode(escape(s.obj))
     __str__ = lambda s: str(escape(s.obj))
+    __unicode__ = lambda s: unicode(escape(s.obj))
     __repr__ = lambda s: str(escape(repr(s.obj)))
     __int__ = lambda s: int(s.obj)
     __float__ = lambda s: float(s.obj)
index 3125599f15830240eb8875166cbefb44d74e30c2..a4f0f9dd7a25c73f39e622b4e822adb93b706ca0 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -87,6 +87,7 @@ setup(
     },
     extras_require={'i18n': ['Babel>=0.8']},
     test_suite='jinja2.testsuite.suite',
+    include_package_data=True,
     entry_points="""
     [babel.extractors]
     jinja2 = jinja2.ext:babel_extract[i18n]