mirror of https://github.com/evilhero/mylar
202 lines
4.8 KiB
Python
202 lines
4.8 KiB
Python
|
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)
|