158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# -*- coding: utf-8 -*-
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    jinja2._compat
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ~~~~~~~~~~~~~~
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Some py2/py3 compatibility support based on a stripped down
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    version of six so we don't have to depend on a specific version
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    of it.
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    :copyright: Copyright 2013 by the Jinja team, see AUTHORS.
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    :license: BSD, see LICENSE for details.
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import sys
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PY2 = sys.version_info[0] == 2
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PYPY = hasattr(sys, 'pypy_translation_info')
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)_identity = lambda x: x
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)if not PY2:
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unichr = chr
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    range_type = range
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    text_type = str
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    string_types = (str,)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    iterkeys = lambda d: iter(d.keys())
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    itervalues = lambda d: iter(d.values())
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    iteritems = lambda d: iter(d.items())
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    import pickle
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from io import BytesIO, StringIO
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    NativeStringIO = StringIO
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    def reraise(tp, value, tb=None):
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if value.__traceback__ is not tb:
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            raise value.with_traceback(tb)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        raise value
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ifilter = filter
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    imap = map
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    izip = zip
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    intern = sys.intern
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    implements_iterator = _identity
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    implements_to_string = _identity
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    encode_filename = _identity
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    get_next = lambda x: x.__next__
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)else:
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unichr = unichr
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    text_type = unicode
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    range_type = xrange
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    string_types = (str, unicode)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    iterkeys = lambda d: d.iterkeys()
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    itervalues = lambda d: d.itervalues()
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    iteritems = lambda d: d.iteritems()
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    import cPickle as pickle
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from cStringIO import StringIO as BytesIO, StringIO
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    NativeStringIO = BytesIO
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from itertools import imap, izip, ifilter
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    intern = intern
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    def implements_iterator(cls):
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        cls.next = cls.__next__
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        del cls.__next__
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        return cls
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    def implements_to_string(cls):
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        cls.__unicode__ = cls.__str__
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        return cls
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    get_next = lambda x: x.next
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    def encode_filename(filename):
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if isinstance(filename, unicode):
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            return filename.encode('utf-8')
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        return filename
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)try:
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    next = next
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)except NameError:
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    def next(it):
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        return it.next()
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)def with_metaclass(meta, *bases):
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # This requires a bit of explanation: the basic idea is to make a
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # dummy metaclass for one level of class instanciation that replaces
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # itself with the actual metaclass.  Because of internal type checks
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # we also need to make sure that we downgrade the custom metaclass
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # for one level to something closer to type (that's why __call__ and
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # __init__ comes back from type etc.).
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    #
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # This has the advantage over six.with_metaclass in that it does not
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    # introduce dummy classes into the final MRO.
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    class metaclass(meta):
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        __call__ = type.__call__
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        __init__ = type.__init__
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        def __new__(cls, name, this_bases, d):
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            if this_bases is None:
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                return type.__new__(cls, name, (), d)
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            return meta(name, bases, d)
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return metaclass('temporary_class', None, {})
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)try:
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from collections import Mapping as mapping_types
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)except ImportError:
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    import UserDict
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mapping_types = (UserDict.UserDict, UserDict.DictMixin, dict)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# common types.  These do exist in the special types module too which however
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# does not exist in IronPython out of the box.  Also that way we don't have
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# to deal with implementation specific stuff here
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class _C(object):
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    def method(self): pass
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)def _func():
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    yield None
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)function_type = type(_func)
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)generator_type = type(_func())
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)method_type = type(_C().method)
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)code_type = type(_C.method.__code__)
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)try:
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    raise TypeError()
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)except TypeError:
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    _tb = sys.exc_info()[2]
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    traceback_type = type(_tb)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame_type = type(_tb.tb_frame)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)try:
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from urllib.parse import quote_from_bytes as url_quote
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)except ImportError:
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from urllib import quote as url_quote
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)try:
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    from thread import allocate_lock
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)except ImportError:
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    try:
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        from threading import Lock as allocate_lock
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    except ImportError:
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        from dummy_thread import allocate_lock
151