aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MANIFEST.in1
-rw-r--r--custom_fixers/fix_alt_unicode.py15
-rw-r--r--custom_fixers/fix_xrange2.py11
-rw-r--r--jinja2/environment.py6
-rw-r--r--jinja2/exceptions.py12
-rw-r--r--jinja2/sandbox.py18
-rw-r--r--jinja2/testsuite/__init__.py9
-rw-r--r--jinja2/utils.py4
-rw-r--r--setup.py1
9 files changed, 46 insertions, 31 deletions
diff --git a/MANIFEST.in b/MANIFEST.in
index 2aa5b4e0..b341589c 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -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 *
diff --git a/custom_fixers/fix_alt_unicode.py b/custom_fixers/fix_alt_unicode.py
index 82e91b39..96a81c16 100644
--- a/custom_fixers/fix_alt_unicode.py
+++ b/custom_fixers/fix_alt_unicode.py
@@ -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
index 00000000..5d35e505
--- /dev/null
+++ b/custom_fixers/fix_xrange2.py
@@ -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))
diff --git a/jinja2/environment.py b/jinja2/environment.py
index cda61713..965b0582 100644
--- a/jinja2/environment.py
+++ b/jinja2/environment.py
@@ -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)
diff --git a/jinja2/exceptions.py b/jinja2/exceptions.py
index 37071ed0..4df8324d 100644
--- a/jinja2/exceptions.py
+++ b/jinja2/exceptions.py
@@ -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
diff --git a/jinja2/sandbox.py b/jinja2/sandbox.py
index 98873102..74971954 100644
--- a/jinja2/sandbox.py
+++ b/jinja2/sandbox.py
@@ -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:
diff --git a/jinja2/testsuite/__init__.py b/jinja2/testsuite/__init__.py
index a2227770..70993554 100644
--- a/jinja2/testsuite/__init__.py
+++ b/jinja2/testsuite/__init__.py
@@ -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
diff --git a/jinja2/utils.py b/jinja2/utils.py
index f43743c5..57fd3c51 100644
--- a/jinja2/utils.py
+++ b/jinja2/utils.py
@@ -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)
diff --git a/setup.py b/setup.py
index 3125599f..a4f0f9dd 100644
--- 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]