| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- # -*- coding: utf-8 -*-
- """
- jinja2._compat
- ~~~~~~~~~~~~~~
- 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 sys
- PY2 = sys.version_info[0] == 2
- PYPY = hasattr(sys, 'pypy_translation_info')
- _identity = lambda x: x
- if not PY2:
- unichr = chr
- range_type = range
- text_type = str
- string_types = (str,)
- iterkeys = lambda d: iter(d.keys())
- itervalues = lambda d: iter(d.values())
- iteritems = lambda d: iter(d.items())
- import pickle
- from io import BytesIO, StringIO
- NativeStringIO = StringIO
- def reraise(tp, value, tb=None):
- if value.__traceback__ is not tb:
- raise value.with_traceback(tb)
- raise value
- ifilter = filter
- imap = map
- izip = zip
- intern = sys.intern
- implements_iterator = _identity
- implements_to_string = _identity
- encode_filename = _identity
- get_next = lambda x: x.__next__
- else:
- unichr = unichr
- text_type = unicode
- range_type = xrange
- string_types = (str, unicode)
- iterkeys = lambda d: d.iterkeys()
- itervalues = lambda d: d.itervalues()
- iteritems = lambda d: d.iteritems()
- import cPickle as pickle
- from cStringIO import StringIO as BytesIO, StringIO
- NativeStringIO = BytesIO
- exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')
- from itertools import imap, izip, ifilter
- intern = intern
- def implements_iterator(cls):
- cls.next = cls.__next__
- del cls.__next__
- return cls
- def implements_to_string(cls):
- cls.__unicode__ = cls.__str__
- cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
- return cls
- get_next = lambda x: x.next
- def encode_filename(filename):
- if isinstance(filename, unicode):
- return filename.encode('utf-8')
- return filename
- try:
- next = next
- except NameError:
- def next(it):
- return it.next()
- def with_metaclass(meta, *bases):
- # This requires a bit of explanation: the basic idea is to make a
- # dummy metaclass for one level of class instanciation that replaces
- # itself with the actual metaclass. Because of internal type checks
- # we also need to make sure that we downgrade the custom metaclass
- # for one level to something closer to type (that's why __call__ and
- # __init__ comes back from type etc.).
- #
- # This has the advantage over six.with_metaclass in that it does not
- # introduce dummy classes into the final MRO.
- class metaclass(meta):
- __call__ = type.__call__
- __init__ = type.__init__
- def __new__(cls, name, this_bases, d):
- if this_bases is None:
- return type.__new__(cls, name, (), d)
- return meta(name, bases, d)
- return metaclass('temporary_class', None, {})
- try:
- from collections import Mapping as mapping_types
- except ImportError:
- import UserDict
- mapping_types = (UserDict.UserDict, UserDict.DictMixin, dict)
- # common types. These do exist in the special types module too which however
- # does not exist in IronPython out of the box. Also that way we don't have
- # to deal with implementation specific stuff here
- class _C(object):
- def method(self): pass
- def _func():
- yield None
- function_type = type(_func)
- generator_type = type(_func())
- method_type = type(_C().method)
- code_type = type(_C.method.__code__)
- try:
- raise TypeError()
- except TypeError:
- _tb = sys.exc_info()[2]
- traceback_type = type(_tb)
- frame_type = type(_tb.tb_frame)
- try:
- from urllib.parse import quote_from_bytes as url_quote
- except ImportError:
- from urllib import quote as url_quote
- try:
- from thread import allocate_lock
- except ImportError:
- try:
- from threading import Lock as allocate_lock
- except ImportError:
- from dummy_thread import allocate_lock
|