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