xref: /aosp_15_r20/external/libchrome/third_party/jinja2/_compat.py (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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