1*635a8641SAndroid Build Coastguard Worker# -*- coding: utf-8 -*- 2*635a8641SAndroid Build Coastguard Worker""" 3*635a8641SAndroid Build Coastguard Worker jinja2._compat 4*635a8641SAndroid Build Coastguard Worker ~~~~~~~~~~~~~~ 5*635a8641SAndroid Build Coastguard Worker 6*635a8641SAndroid Build Coastguard Worker Some py2/py3 compatibility support based on a stripped down 7*635a8641SAndroid Build Coastguard Worker version of six so we don't have to depend on a specific version 8*635a8641SAndroid Build Coastguard Worker of it. 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker :copyright: Copyright 2013 by the Jinja team, see AUTHORS. 11*635a8641SAndroid Build Coastguard Worker :license: BSD, see LICENSE for details. 12*635a8641SAndroid Build Coastguard Worker""" 13*635a8641SAndroid Build Coastguard Workerimport sys 14*635a8641SAndroid Build Coastguard Worker 15*635a8641SAndroid Build Coastguard WorkerPY2 = sys.version_info[0] == 2 16*635a8641SAndroid Build Coastguard WorkerPYPY = hasattr(sys, 'pypy_translation_info') 17*635a8641SAndroid Build Coastguard Worker_identity = lambda x: x 18*635a8641SAndroid Build Coastguard Worker 19*635a8641SAndroid Build Coastguard Worker 20*635a8641SAndroid Build Coastguard Workerif not PY2: 21*635a8641SAndroid Build Coastguard Worker unichr = chr 22*635a8641SAndroid Build Coastguard Worker range_type = range 23*635a8641SAndroid Build Coastguard Worker text_type = str 24*635a8641SAndroid Build Coastguard Worker string_types = (str,) 25*635a8641SAndroid Build Coastguard Worker integer_types = (int,) 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker iterkeys = lambda d: iter(d.keys()) 28*635a8641SAndroid Build Coastguard Worker itervalues = lambda d: iter(d.values()) 29*635a8641SAndroid Build Coastguard Worker iteritems = lambda d: iter(d.items()) 30*635a8641SAndroid Build Coastguard Worker 31*635a8641SAndroid Build Coastguard Worker import pickle 32*635a8641SAndroid Build Coastguard Worker from io import BytesIO, StringIO 33*635a8641SAndroid Build Coastguard Worker NativeStringIO = StringIO 34*635a8641SAndroid Build Coastguard Worker 35*635a8641SAndroid Build Coastguard Worker def reraise(tp, value, tb=None): 36*635a8641SAndroid Build Coastguard Worker if value.__traceback__ is not tb: 37*635a8641SAndroid Build Coastguard Worker raise value.with_traceback(tb) 38*635a8641SAndroid Build Coastguard Worker raise value 39*635a8641SAndroid Build Coastguard Worker 40*635a8641SAndroid Build Coastguard Worker ifilter = filter 41*635a8641SAndroid Build Coastguard Worker imap = map 42*635a8641SAndroid Build Coastguard Worker izip = zip 43*635a8641SAndroid Build Coastguard Worker intern = sys.intern 44*635a8641SAndroid Build Coastguard Worker 45*635a8641SAndroid Build Coastguard Worker implements_iterator = _identity 46*635a8641SAndroid Build Coastguard Worker implements_to_string = _identity 47*635a8641SAndroid Build Coastguard Worker encode_filename = _identity 48*635a8641SAndroid Build Coastguard Worker 49*635a8641SAndroid Build Coastguard Workerelse: 50*635a8641SAndroid Build Coastguard Worker unichr = unichr 51*635a8641SAndroid Build Coastguard Worker text_type = unicode 52*635a8641SAndroid Build Coastguard Worker range_type = xrange 53*635a8641SAndroid Build Coastguard Worker string_types = (str, unicode) 54*635a8641SAndroid Build Coastguard Worker integer_types = (int, long) 55*635a8641SAndroid Build Coastguard Worker 56*635a8641SAndroid Build Coastguard Worker iterkeys = lambda d: d.iterkeys() 57*635a8641SAndroid Build Coastguard Worker itervalues = lambda d: d.itervalues() 58*635a8641SAndroid Build Coastguard Worker iteritems = lambda d: d.iteritems() 59*635a8641SAndroid Build Coastguard Worker 60*635a8641SAndroid Build Coastguard Worker import cPickle as pickle 61*635a8641SAndroid Build Coastguard Worker from cStringIO import StringIO as BytesIO, StringIO 62*635a8641SAndroid Build Coastguard Worker NativeStringIO = BytesIO 63*635a8641SAndroid Build Coastguard Worker 64*635a8641SAndroid Build Coastguard Worker exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') 65*635a8641SAndroid Build Coastguard Worker 66*635a8641SAndroid Build Coastguard Worker from itertools import imap, izip, ifilter 67*635a8641SAndroid Build Coastguard Worker intern = intern 68*635a8641SAndroid Build Coastguard Worker 69*635a8641SAndroid Build Coastguard Worker def implements_iterator(cls): 70*635a8641SAndroid Build Coastguard Worker cls.next = cls.__next__ 71*635a8641SAndroid Build Coastguard Worker del cls.__next__ 72*635a8641SAndroid Build Coastguard Worker return cls 73*635a8641SAndroid Build Coastguard Worker 74*635a8641SAndroid Build Coastguard Worker def implements_to_string(cls): 75*635a8641SAndroid Build Coastguard Worker cls.__unicode__ = cls.__str__ 76*635a8641SAndroid Build Coastguard Worker cls.__str__ = lambda x: x.__unicode__().encode('utf-8') 77*635a8641SAndroid Build Coastguard Worker return cls 78*635a8641SAndroid Build Coastguard Worker 79*635a8641SAndroid Build Coastguard Worker def encode_filename(filename): 80*635a8641SAndroid Build Coastguard Worker if isinstance(filename, unicode): 81*635a8641SAndroid Build Coastguard Worker return filename.encode('utf-8') 82*635a8641SAndroid Build Coastguard Worker return filename 83*635a8641SAndroid Build Coastguard Worker 84*635a8641SAndroid Build Coastguard Worker 85*635a8641SAndroid Build Coastguard Workerdef with_metaclass(meta, *bases): 86*635a8641SAndroid Build Coastguard Worker """Create a base class with a metaclass.""" 87*635a8641SAndroid Build Coastguard Worker # This requires a bit of explanation: the basic idea is to make a 88*635a8641SAndroid Build Coastguard Worker # dummy metaclass for one level of class instantiation that replaces 89*635a8641SAndroid Build Coastguard Worker # itself with the actual metaclass. 90*635a8641SAndroid Build Coastguard Worker class metaclass(type): 91*635a8641SAndroid Build Coastguard Worker def __new__(cls, name, this_bases, d): 92*635a8641SAndroid Build Coastguard Worker return meta(name, bases, d) 93*635a8641SAndroid Build Coastguard Worker return type.__new__(metaclass, 'temporary_class', (), {}) 94*635a8641SAndroid Build Coastguard Worker 95*635a8641SAndroid Build Coastguard Worker 96*635a8641SAndroid Build Coastguard Workertry: 97*635a8641SAndroid Build Coastguard Worker from urllib.parse import quote_from_bytes as url_quote 98*635a8641SAndroid Build Coastguard Workerexcept ImportError: 99*635a8641SAndroid Build Coastguard Worker from urllib import quote as url_quote 100