From: Armin Ronacher Date: Sun, 19 May 2013 13:34:54 +0000 (+0100) Subject: PY3 -> PY2 macro X-Git-Tag: 2.7~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e245e26788d140d661034047f1f59619436ad4b;p=thirdparty%2Fjinja.git PY3 -> PY2 macro --- diff --git a/jinja2/_compat.py b/jinja2/_compat.py index 13b13826..d770f1a6 100644 --- a/jinja2/_compat.py +++ b/jinja2/_compat.py @@ -3,54 +3,88 @@ jinja2._compat ~~~~~~~~~~~~~~ - Some py2/py3 compatibility support that is not yet available in - "six" 1.3.0. Generally all uses of six should go through this module - so that we have one central place to remove stuff from when we - eventually drop 2.x. + Some py2/py3 compatibility support based on a stripped down + version of six so we don't have to depend on a specific version + of it. :copyright: Copyright 2013 by the Jinja team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import six import sys -PY3 = six.PY3 +PY2 = sys.version_info[0] == 2 -# https://bitbucket.org/gutworth/six/issue/25/add-unichr -try: - unichr = unichr # py2 -except NameError: - unichr = chr # py3 -range_type = six.moves.xrange -next = six.advance_iterator -imap = six.moves.map -izip = six.moves.zip -text_type = six.text_type -string_types = six.string_types +if not PY2: + unichr = chr + range_type = range + text_type = str + string_types = (str,) -iteritems = six.iteritems -iterkeys = six.iterkeys -itervalues = six.itervalues + _iterkeys = 'keys' + _itervalues = 'values' + _iteritems = 'items' -if six.PY3: from io import BytesIO, StringIO NativeStringIO = StringIO + + ifilter = filter + imap = map + izip = zip + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + Iterator = object else: + text_type = unicode + unichr = unichr + string_types = (str, unicode) + + _iterkeys = 'iterkeys' + _itervalues = 'itervalues' + _iteritems = 'iteritems' + + from itertools import imap, izip, ifilter + range_type = xrange + from cStringIO import StringIO as BytesIO from StringIO import StringIO NativeStringIO = BytesIO + exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') + + class Iterator(object): + def next(self): + return self.__next__() + +try: + next = next +except NameError: + def next(it): + return it.next() + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + return meta('NewBase', bases, {}) + +def iterkeys(d, **kw): + return iter(getattr(d, _iterkeys)(**kw)) + +def itervalues(d, **kw): + return iter(getattr(d, _itervalues)(**kw)) + +def iteritems(d, **kw): + return iter(getattr(d, _iteritems)(**kw)) + try: import cPickle as pickle except ImportError: import pickle -ifilter = six.moves.filter -reraise = six.reraise -Iterator = six.Iterator -with_metaclass = six.with_metaclass - try: from collections import Mapping as mapping_types except ImportError: diff --git a/jinja2/bccache.py b/jinja2/bccache.py index a3bb0023..b534e271 100644 --- a/jinja2/bccache.py +++ b/jinja2/bccache.py @@ -21,11 +21,11 @@ import tempfile import fnmatch from hashlib import sha1 from jinja2.utils import open_if_exists -from jinja2._compat import BytesIO, pickle, PY3 +from jinja2._compat import BytesIO, pickle, PY2 # marshal works better on 3.x, one hack less required -if PY3: +if not PY2: marshal_dump = marshal.dump marshal_load = marshal.load else: diff --git a/jinja2/environment.py b/jinja2/environment.py index ee35b897..cbac8c1c 100644 --- a/jinja2/environment.py +++ b/jinja2/environment.py @@ -28,7 +28,7 @@ from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \ from jinja2.utils import import_string, LRUCache, Markup, missing, \ concat, consume, internalcode, _encode_filename from jinja2._compat import imap, ifilter, string_types, iteritems, \ - text_type, reraise, PY3, Iterator, next + text_type, reraise, PY2, Iterator, next from functools import reduce @@ -1065,13 +1065,16 @@ class TemplateModule(object): def __html__(self): return Markup(concat(self._body_stream)) - def __str__(self): - s = self.__unicode__() - return s if PY3 else s.encode('utf-8') - def __unicode__(self): return concat(self._body_stream) + if PY2: + def __str__(self): + return self.__unicode__().encode('utf-8') + else: + __str__ = __unicode__ + del __unicode__ + def __repr__(self): if self.__name__ is None: name = 'memory:%x' % id(self) diff --git a/jinja2/exceptions.py b/jinja2/exceptions.py index b137353b..1bbceeea 100644 --- a/jinja2/exceptions.py +++ b/jinja2/exceptions.py @@ -8,13 +8,13 @@ :copyright: (c) 2010 by the Jinja Team. :license: BSD, see LICENSE for more details. """ -from jinja2._compat import imap, text_type, PY3 +from jinja2._compat import imap, text_type, PY2 class TemplateError(Exception): """Baseclass for all template errors.""" - if not PY3: + if PY2: def __init__(self, message=None): if message is not None: message = text_type(message).encode('utf-8') @@ -115,12 +115,12 @@ class TemplateSyntaxError(TemplateError): return u'\n'.join(lines) - if PY3: - __str__ = __unicode__ - del __unicode__ - else: + if PY2: def __str__(self): return self.__unicode__().encode('utf-8') + else: + __str__ = __unicode__ + del __unicode__ class TemplateAssertionError(TemplateSyntaxError): diff --git a/jinja2/runtime.py b/jinja2/runtime.py index 489bcca7..b5e203ff 100644 --- a/jinja2/runtime.py +++ b/jinja2/runtime.py @@ -15,7 +15,7 @@ from jinja2.utils import Markup, soft_unicode, escape, missing, concat, \ from jinja2.exceptions import UndefinedError, TemplateRuntimeError, \ TemplateNotFound from jinja2._compat import next, imap, text_type, iteritems, Iterator, \ - string_types, PY3 + string_types, PY2 # these variables are exported to the template runtime @@ -501,12 +501,12 @@ class Undefined(object): def __unicode__(self): return u'' - if PY3: - __str__ = __unicode__ - del __unicode__ - else: + if PY2: def __str__(self): return self.__unicode__().encode('utf-8') + else: + __str__ = __unicode__ + del __unicode__ def __len__(self): return 0 @@ -547,7 +547,7 @@ class DebugUndefined(Undefined): ) return u'{{ undefined value printed: %s }}' % self._undefined_hint - if PY3: + if not PY2: __str__ = __unicode__ del __unicode__ @@ -575,7 +575,7 @@ class StrictUndefined(Undefined): __iter__ = __str__ = __len__ = __nonzero__ = __eq__ = \ __ne__ = __bool__ = Undefined._fail_with_undefined_error - if not PY3: + if PY2: __unicode__ = Undefined._fail_with_undefined_error diff --git a/jinja2/testsuite/__init__.py b/jinja2/testsuite/__init__.py index 95166f56..781a0e79 100644 --- a/jinja2/testsuite/__init__.py +++ b/jinja2/testsuite/__init__.py @@ -16,7 +16,7 @@ import sys import unittest from traceback import format_exception from jinja2 import loaders -from jinja2._compat import PY3 +from jinja2._compat import PY2 here = os.path.dirname(os.path.abspath(__file__)) @@ -90,7 +90,7 @@ def suite(): # doctests will not run on python 3 currently. Too many issues # with that, do not test that on that platform. - if not PY3: + if PY2: suite.addTest(doctests.suite()) return suite diff --git a/jinja2/testsuite/filters.py b/jinja2/testsuite/filters.py index 31c9559c..c1f32c3a 100644 --- a/jinja2/testsuite/filters.py +++ b/jinja2/testsuite/filters.py @@ -12,7 +12,7 @@ import unittest from jinja2.testsuite import JinjaTestCase from jinja2 import Markup, Environment -from jinja2._compat import text_type, PY3 +from jinja2._compat import text_type, PY2 env = Environment() @@ -299,12 +299,12 @@ class FilterTestCase(JinjaTestCase): self.value = value def __unicode__(self): return text_type(self.value) - if PY3: - __str__ = __unicode__ - del __unicode__ - else: + if PY2: def __str__(self): return self.__unicode__().encode('utf-8') + else: + __str__ = __unicode__ + del __unicode__ tmpl = env.from_string('''{{ items|sort(attribute='value')|join }}''') assert tmpl.render(items=map(Magic, [3, 2, 4, 1])) == '1234' diff --git a/jinja2/testsuite/lexnparse.py b/jinja2/testsuite/lexnparse.py index f8a8a8da..bd1c94cd 100644 --- a/jinja2/testsuite/lexnparse.py +++ b/jinja2/testsuite/lexnparse.py @@ -14,7 +14,7 @@ from jinja2.testsuite import JinjaTestCase from jinja2 import Environment, Template, TemplateSyntaxError, \ UndefinedError, nodes -from jinja2._compat import next, iteritems, text_type, PY3 +from jinja2._compat import next, iteritems, text_type, PY2 from jinja2.lexer import Token, TokenStream, TOKEN_EOF, \ TOKEN_BLOCK_BEGIN, TOKEN_BLOCK_END @@ -22,7 +22,7 @@ env = Environment() # how does a string look like in jinja syntax? -if not PY3: +if PY2: def jinja_string_repr(string): return repr(string)[1:] else: diff --git a/jinja2/utils.py b/jinja2/utils.py index d499d49b..610d8e38 100644 --- a/jinja2/utils.py +++ b/jinja2/utils.py @@ -23,7 +23,7 @@ except ImportError: except ImportError: from dummy_thread import allocate_lock from collections import deque -from jinja2._compat import text_type, string_types, Iterator, PY3 +from jinja2._compat import text_type, string_types, Iterator, PY2 _word_split_re = re.compile(r'(\s+)') @@ -53,7 +53,7 @@ concat = u''.join # This is used in a couple of places. As far as Jinja is concerned # filenames are unicode *or* bytestrings in 2.x and unicode only in # 3.x because compile cannot handle bytes -if not PY3: +if PY2: def _encode_filename(filename): if isinstance(filename, unicode): return filename.encode('utf-8') diff --git a/setup.py b/setup.py index b8dcfb5e..74d1ec39 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ setup( 'Topic :: Text Processing :: Markup :: HTML' ], packages=['jinja2', 'jinja2.testsuite', 'jinja2.testsuite.res'], - install_requires=['six>=1.3.0', 'markupsafe'], + install_requires=['markupsafe'], extras_require={'i18n': ['Babel>=0.8']}, test_suite='jinja2.testsuite.suite', include_package_data=True,