From 790b8a897c74518b02bc2f1ffa1d109802aa7f8f Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Wed, 10 Feb 2010 00:05:46 +0100 Subject: [PATCH] Approaching python3 compatibility --HG-- branch : trunk --- MANIFEST.in | 1 + custom_fixers/fix_alt_unicode.py | 15 ++------------- custom_fixers/fix_xrange2.py | 11 +++++++++++ jinja2/environment.py | 6 +++--- jinja2/exceptions.py | 12 ++++++------ jinja2/sandbox.py | 18 +++++++++++++----- jinja2/testsuite/__init__.py | 9 +++++++-- jinja2/utils.py | 4 ++-- setup.py | 1 + 9 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 custom_fixers/fix_xrange2.py diff --git a/MANIFEST.in b/MANIFEST.in index 2aa5b4e..b341589 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 82e91b3..96a81c1 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 0000000..5d35e50 --- /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 cda6171..965b058 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 37071ed..4df8324 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 9887310..7497195 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 a222777..7099355 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 f43743c..57fd3c5 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 3125599..a4f0f9d 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] -- 2.26.2