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