aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Jinja2/py2/jinja2/_compat.py
blob: 0632a9e99ddf4f1c5b4e16086e64e1ce11257db5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# -*- coding: utf-8 -*- 
# flake8: noqa
import marshal
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,) 
    integer_types = (int,) 
 
    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 
 
    marshal_dump = marshal.dump
    marshal_load = marshal.load

else: 
    unichr = unichr 
    text_type = unicode 
    range_type = xrange 
    string_types = (str, unicode) 
    integer_types = (int, long) 
 
    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 
 
    def encode_filename(filename): 
        if isinstance(filename, unicode): 
            return filename.encode("utf-8")
        return filename 
 
    def marshal_dump(code, f):
        if isinstance(f, file):
            marshal.dump(code, f)
        else:
            f.write(marshal.dumps(code))
 
    def marshal_load(f):
        if isinstance(f, file):
            return marshal.load(f)
        return marshal.loads(f.read())


def with_metaclass(meta, *bases): 
    """Create a base class with a metaclass.""" 
    # This requires a bit of explanation: the basic idea is to make a 
    # dummy metaclass for one level of class instantiation that replaces 
    # itself with the actual metaclass. 
    class metaclass(type): 
        def __new__(cls, name, this_bases, d): 
            return meta(name, bases, d) 
 
    return type.__new__(metaclass, "temporary_class", (), {})
 

try: 
    from urllib.parse import quote_from_bytes as url_quote 
except ImportError: 
    from urllib import quote as url_quote 


try:
    from collections import abc
except ImportError:
    import collections as abc


try:
    from os import fspath
except ImportError:
    try:
        from pathlib import PurePath
    except ImportError:
        PurePath = None

    def fspath(path):
        if hasattr(path, "__fspath__"):
            return path.__fspath__()

        # Python 3.5 doesn't have __fspath__ yet, use str.
        if PurePath is not None and isinstance(path, PurePath):
            return str(path)

        return path