1e31aef6aSopenharmony_ci# -*- coding: utf-8 -*-
2e31aef6aSopenharmony_ci# flake8: noqa
3e31aef6aSopenharmony_ciimport marshal
4e31aef6aSopenharmony_ciimport sys
5e31aef6aSopenharmony_ci
6e31aef6aSopenharmony_ciPY2 = sys.version_info[0] == 2
7e31aef6aSopenharmony_ciPYPY = hasattr(sys, "pypy_translation_info")
8e31aef6aSopenharmony_ci_identity = lambda x: x
9e31aef6aSopenharmony_ci
10e31aef6aSopenharmony_ciif not PY2:
11e31aef6aSopenharmony_ci    unichr = chr
12e31aef6aSopenharmony_ci    range_type = range
13e31aef6aSopenharmony_ci    text_type = str
14e31aef6aSopenharmony_ci    string_types = (str,)
15e31aef6aSopenharmony_ci    integer_types = (int,)
16e31aef6aSopenharmony_ci
17e31aef6aSopenharmony_ci    iterkeys = lambda d: iter(d.keys())
18e31aef6aSopenharmony_ci    itervalues = lambda d: iter(d.values())
19e31aef6aSopenharmony_ci    iteritems = lambda d: iter(d.items())
20e31aef6aSopenharmony_ci
21e31aef6aSopenharmony_ci    import pickle
22e31aef6aSopenharmony_ci    from io import BytesIO, StringIO
23e31aef6aSopenharmony_ci
24e31aef6aSopenharmony_ci    NativeStringIO = StringIO
25e31aef6aSopenharmony_ci
26e31aef6aSopenharmony_ci    def reraise(tp, value, tb=None):
27e31aef6aSopenharmony_ci        if value.__traceback__ is not tb:
28e31aef6aSopenharmony_ci            raise value.with_traceback(tb)
29e31aef6aSopenharmony_ci        raise value
30e31aef6aSopenharmony_ci
31e31aef6aSopenharmony_ci    ifilter = filter
32e31aef6aSopenharmony_ci    imap = map
33e31aef6aSopenharmony_ci    izip = zip
34e31aef6aSopenharmony_ci    intern = sys.intern
35e31aef6aSopenharmony_ci
36e31aef6aSopenharmony_ci    implements_iterator = _identity
37e31aef6aSopenharmony_ci    implements_to_string = _identity
38e31aef6aSopenharmony_ci    encode_filename = _identity
39e31aef6aSopenharmony_ci
40e31aef6aSopenharmony_ci    marshal_dump = marshal.dump
41e31aef6aSopenharmony_ci    marshal_load = marshal.load
42e31aef6aSopenharmony_ci
43e31aef6aSopenharmony_cielse:
44e31aef6aSopenharmony_ci    unichr = unichr
45e31aef6aSopenharmony_ci    text_type = unicode
46e31aef6aSopenharmony_ci    range_type = xrange
47e31aef6aSopenharmony_ci    string_types = (str, unicode)
48e31aef6aSopenharmony_ci    integer_types = (int, long)
49e31aef6aSopenharmony_ci
50e31aef6aSopenharmony_ci    iterkeys = lambda d: d.iterkeys()
51e31aef6aSopenharmony_ci    itervalues = lambda d: d.itervalues()
52e31aef6aSopenharmony_ci    iteritems = lambda d: d.iteritems()
53e31aef6aSopenharmony_ci
54e31aef6aSopenharmony_ci    import cPickle as pickle
55e31aef6aSopenharmony_ci    from cStringIO import StringIO as BytesIO, StringIO
56e31aef6aSopenharmony_ci
57e31aef6aSopenharmony_ci    NativeStringIO = BytesIO
58e31aef6aSopenharmony_ci
59e31aef6aSopenharmony_ci    exec("def reraise(tp, value, tb=None):\n raise tp, value, tb")
60e31aef6aSopenharmony_ci
61e31aef6aSopenharmony_ci    from itertools import imap, izip, ifilter
62e31aef6aSopenharmony_ci
63e31aef6aSopenharmony_ci    intern = intern
64e31aef6aSopenharmony_ci
65e31aef6aSopenharmony_ci    def implements_iterator(cls):
66e31aef6aSopenharmony_ci        cls.next = cls.__next__
67e31aef6aSopenharmony_ci        del cls.__next__
68e31aef6aSopenharmony_ci        return cls
69e31aef6aSopenharmony_ci
70e31aef6aSopenharmony_ci    def implements_to_string(cls):
71e31aef6aSopenharmony_ci        cls.__unicode__ = cls.__str__
72e31aef6aSopenharmony_ci        cls.__str__ = lambda x: x.__unicode__().encode("utf-8")
73e31aef6aSopenharmony_ci        return cls
74e31aef6aSopenharmony_ci
75e31aef6aSopenharmony_ci    def encode_filename(filename):
76e31aef6aSopenharmony_ci        if isinstance(filename, unicode):
77e31aef6aSopenharmony_ci            return filename.encode("utf-8")
78e31aef6aSopenharmony_ci        return filename
79e31aef6aSopenharmony_ci
80e31aef6aSopenharmony_ci    def marshal_dump(code, f):
81e31aef6aSopenharmony_ci        if isinstance(f, file):
82e31aef6aSopenharmony_ci            marshal.dump(code, f)
83e31aef6aSopenharmony_ci        else:
84e31aef6aSopenharmony_ci            f.write(marshal.dumps(code))
85e31aef6aSopenharmony_ci
86e31aef6aSopenharmony_ci    def marshal_load(f):
87e31aef6aSopenharmony_ci        if isinstance(f, file):
88e31aef6aSopenharmony_ci            return marshal.load(f)
89e31aef6aSopenharmony_ci        return marshal.loads(f.read())
90e31aef6aSopenharmony_ci
91e31aef6aSopenharmony_ci
92e31aef6aSopenharmony_cidef with_metaclass(meta, *bases):
93e31aef6aSopenharmony_ci    """Create a base class with a metaclass."""
94e31aef6aSopenharmony_ci    # This requires a bit of explanation: the basic idea is to make a
95e31aef6aSopenharmony_ci    # dummy metaclass for one level of class instantiation that replaces
96e31aef6aSopenharmony_ci    # itself with the actual metaclass.
97e31aef6aSopenharmony_ci    class metaclass(type):
98e31aef6aSopenharmony_ci        def __new__(cls, name, this_bases, d):
99e31aef6aSopenharmony_ci            return meta(name, bases, d)
100e31aef6aSopenharmony_ci
101e31aef6aSopenharmony_ci    return type.__new__(metaclass, "temporary_class", (), {})
102e31aef6aSopenharmony_ci
103e31aef6aSopenharmony_ci
104e31aef6aSopenharmony_citry:
105e31aef6aSopenharmony_ci    from urllib.parse import quote_from_bytes as url_quote
106e31aef6aSopenharmony_ciexcept ImportError:
107e31aef6aSopenharmony_ci    from urllib import quote as url_quote
108e31aef6aSopenharmony_ci
109e31aef6aSopenharmony_ci
110e31aef6aSopenharmony_citry:
111e31aef6aSopenharmony_ci    from collections import abc
112e31aef6aSopenharmony_ciexcept ImportError:
113e31aef6aSopenharmony_ci    import collections as abc
114e31aef6aSopenharmony_ci
115e31aef6aSopenharmony_ci
116e31aef6aSopenharmony_citry:
117e31aef6aSopenharmony_ci    from os import fspath
118e31aef6aSopenharmony_ciexcept ImportError:
119e31aef6aSopenharmony_ci    try:
120e31aef6aSopenharmony_ci        from pathlib import PurePath
121e31aef6aSopenharmony_ci    except ImportError:
122e31aef6aSopenharmony_ci        PurePath = None
123e31aef6aSopenharmony_ci
124e31aef6aSopenharmony_ci    def fspath(path):
125e31aef6aSopenharmony_ci        if hasattr(path, "__fspath__"):
126e31aef6aSopenharmony_ci            return path.__fspath__()
127e31aef6aSopenharmony_ci
128e31aef6aSopenharmony_ci        # Python 3.5 doesn't have __fspath__ yet, use str.
129e31aef6aSopenharmony_ci        if PurePath is not None and isinstance(path, PurePath):
130e31aef6aSopenharmony_ci            return str(path)
131e31aef6aSopenharmony_ci
132e31aef6aSopenharmony_ci        return path
133