| import sys |
| import time |
| |
| py3k = sys.version_info >= (3, 0) |
| py33 = sys.version_info >= (3, 3) |
| py2k = sys.version_info < (3,) |
| py26 = sys.version_info >= (2, 6) |
| py27 = sys.version_info >= (2, 7) |
| jython = sys.platform.startswith('java') |
| win32 = sys.platform.startswith('win') |
| pypy = hasattr(sys, 'pypy_version_info') |
| |
| if py3k: |
| # create a "getargspec" from getfullargspec(), which is not deprecated |
| # in Py3K; getargspec() has started to emit warnings as of Py3.5. |
| # As of Py3.4, now they are trying to move from getfullargspec() |
| # to "signature()", but getfullargspec() is not deprecated, so stick |
| # with that for now. |
| |
| import collections |
| ArgSpec = collections.namedtuple( |
| "ArgSpec", |
| ["args", "varargs", "keywords", "defaults"]) |
| from inspect import getfullargspec as inspect_getfullargspec |
| |
| def inspect_getargspec(func): |
| return ArgSpec( |
| *inspect_getfullargspec(func)[0:4] |
| ) |
| else: |
| from inspect import getargspec as inspect_getargspec # noqa |
| |
| |
| if py3k: |
| from io import StringIO |
| import builtins as compat_builtins |
| from urllib.parse import quote_plus, unquote_plus |
| from html.entities import codepoint2name, name2codepoint |
| string_types = str, |
| binary_type = bytes |
| text_type = str |
| |
| from io import BytesIO as byte_buffer |
| |
| def u(s): |
| return s |
| |
| def b(s): |
| return s.encode("latin-1") |
| |
| def octal(lit): |
| return eval("0o" + lit) |
| |
| else: |
| import __builtin__ as compat_builtins # noqa |
| try: |
| from cStringIO import StringIO |
| except: |
| from StringIO import StringIO |
| |
| byte_buffer = StringIO |
| |
| from urllib import quote_plus, unquote_plus # noqa |
| from htmlentitydefs import codepoint2name, name2codepoint # noqa |
| string_types = basestring, # noqa |
| binary_type = str |
| text_type = unicode # noqa |
| |
| def u(s): |
| return unicode(s, "utf-8") # noqa |
| |
| def b(s): |
| return s |
| |
| def octal(lit): |
| return eval("0" + lit) |
| |
| |
| if py33: |
| from importlib import machinery |
| |
| def load_module(module_id, path): |
| return machinery.SourceFileLoader(module_id, path).load_module() |
| else: |
| import imp |
| |
| def load_module(module_id, path): |
| fp = open(path, 'rb') |
| try: |
| return imp.load_source(module_id, path, fp) |
| finally: |
| fp.close() |
| |
| |
| if py3k: |
| def reraise(tp, value, tb=None, cause=None): |
| if cause is not None: |
| value.__cause__ = cause |
| if value.__traceback__ is not tb: |
| raise value.with_traceback(tb) |
| raise value |
| else: |
| exec("def reraise(tp, value, tb=None, cause=None):\n" |
| " raise tp, value, tb\n") |
| |
| |
| def exception_as(): |
| return sys.exc_info()[1] |
| |
| try: |
| import threading |
| if py3k: |
| import _thread as thread |
| else: |
| import thread |
| except ImportError: |
| import dummy_threading as threading # noqa |
| if py3k: |
| import _dummy_thread as thread |
| else: |
| import dummy_thread as thread # noqa |
| |
| if win32 or jython: |
| time_func = time.clock |
| else: |
| time_func = time.time |
| |
| try: |
| from functools import partial |
| except: |
| def partial(func, *args, **keywords): |
| def newfunc(*fargs, **fkeywords): |
| newkeywords = keywords.copy() |
| newkeywords.update(fkeywords) |
| return func(*(args + fargs), **newkeywords) |
| return newfunc |
| |
| |
| all = all |
| import json # noqa |
| |
| |
| def exception_name(exc): |
| return exc.__class__.__name__ |
| |
| try: |
| from inspect import CO_VARKEYWORDS, CO_VARARGS |
| |
| def inspect_func_args(fn): |
| if py3k: |
| co = fn.__code__ |
| else: |
| co = fn.func_code |
| |
| nargs = co.co_argcount |
| names = co.co_varnames |
| args = list(names[:nargs]) |
| |
| varargs = None |
| if co.co_flags & CO_VARARGS: |
| varargs = co.co_varnames[nargs] |
| nargs = nargs + 1 |
| varkw = None |
| if co.co_flags & CO_VARKEYWORDS: |
| varkw = co.co_varnames[nargs] |
| |
| if py3k: |
| return args, varargs, varkw, fn.__defaults__ |
| else: |
| return args, varargs, varkw, fn.func_defaults |
| except ImportError: |
| import inspect |
| |
| def inspect_func_args(fn): |
| return inspect.getargspec(fn) |
| |
| if py3k: |
| def callable(fn): |
| return hasattr(fn, '__call__') |
| else: |
| callable = callable |
| |
| |
| ################################################ |
| # cross-compatible metaclass implementation |
| # Copyright (c) 2010-2012 Benjamin Peterson |
| def with_metaclass(meta, base=object): |
| """Create a base class with a metaclass.""" |
| return meta("%sBase" % meta.__name__, (base,), {}) |
| ################################################ |
| |
| |
| def arg_stringname(func_arg): |
| """Gets the string name of a kwarg or vararg |
| In Python3.4 a function's args are |
| of _ast.arg type not _ast.name |
| """ |
| if hasattr(func_arg, 'arg'): |
| return func_arg.arg |
| else: |
| return str(func_arg) |