209 lines
5.2 KiB
Python
209 lines
5.2 KiB
Python
|
import array, sys
|
||
|
|
||
|
|
||
|
# Run time aliasing of Python2/3 differences
|
||
|
|
||
|
def htmlescape(s, quote=True):
|
||
|
# this is html.escape reimplemented with cgi.escape,
|
||
|
# so it works for python 2.x, 3.0 and 3.1
|
||
|
import cgi
|
||
|
s = cgi.escape(s, quote)
|
||
|
if quote:
|
||
|
# python 3.2 also replaces the single quotes:
|
||
|
s = s.replace("'", "'")
|
||
|
return s
|
||
|
|
||
|
if sys.version_info[0] < 3:
|
||
|
PY3 = False
|
||
|
|
||
|
def b(s):
|
||
|
return s
|
||
|
|
||
|
import cStringIO as StringIO
|
||
|
StringIO = BytesIO = StringIO.StringIO
|
||
|
callable = callable
|
||
|
integer_types = (int, long)
|
||
|
iteritems = lambda o: o.iteritems()
|
||
|
itervalues = lambda o: o.itervalues()
|
||
|
iterkeys = lambda o: o.iterkeys()
|
||
|
from itertools import izip
|
||
|
long_type = long
|
||
|
next = lambda o: o.next()
|
||
|
import cPickle as pickle
|
||
|
from cPickle import dumps, loads, dump, load
|
||
|
string_type = basestring
|
||
|
text_type = unicode
|
||
|
bytes_type = str
|
||
|
unichr = unichr
|
||
|
from urllib import urlretrieve
|
||
|
import Queue as queue
|
||
|
|
||
|
def byte(num):
|
||
|
return chr(num)
|
||
|
|
||
|
def u(s):
|
||
|
return unicode(s, "unicode_escape")
|
||
|
|
||
|
def with_metaclass(meta, base=object):
|
||
|
class _WhooshBase(base):
|
||
|
__metaclass__ = meta
|
||
|
return _WhooshBase
|
||
|
|
||
|
xrange = xrange
|
||
|
zip_ = zip
|
||
|
|
||
|
def memoryview_(source, offset=None, length=None):
|
||
|
if offset or length:
|
||
|
return buffer(source, offset, length)
|
||
|
else:
|
||
|
return buffer(source)
|
||
|
|
||
|
else:
|
||
|
PY3 = True
|
||
|
import collections
|
||
|
|
||
|
def b(s):
|
||
|
return s.encode("latin-1")
|
||
|
|
||
|
import io
|
||
|
BytesIO = io.BytesIO
|
||
|
callable = lambda o: isinstance(o, collections.Callable)
|
||
|
exec_ = eval("exec")
|
||
|
integer_types = (int,)
|
||
|
iteritems = lambda o: o.items()
|
||
|
itervalues = lambda o: o.values()
|
||
|
iterkeys = lambda o: iter(o.keys())
|
||
|
izip = zip
|
||
|
long_type = int
|
||
|
next = next
|
||
|
import pickle
|
||
|
from pickle import dumps, loads, dump, load
|
||
|
StringIO = io.StringIO
|
||
|
string_type = str
|
||
|
text_type = str
|
||
|
bytes_type = bytes
|
||
|
unichr = chr
|
||
|
from urllib.request import urlretrieve
|
||
|
import queue
|
||
|
|
||
|
def byte(num):
|
||
|
return bytes((num,))
|
||
|
|
||
|
def u(s):
|
||
|
if isinstance(s, bytes):
|
||
|
return s.decode("ascii")
|
||
|
return s
|
||
|
|
||
|
def with_metaclass(meta, base=object):
|
||
|
ns = dict(base=base, meta=meta)
|
||
|
exec_("""class _WhooshBase(base, metaclass=meta):
|
||
|
pass""", ns)
|
||
|
return ns["_WhooshBase"]
|
||
|
|
||
|
xrange = range
|
||
|
zip_ = lambda * args: list(zip(*args))
|
||
|
|
||
|
def memoryview_(source, offset=None, length=None):
|
||
|
mv = memoryview(source)
|
||
|
if offset or length:
|
||
|
return mv[offset:offset + length]
|
||
|
else:
|
||
|
return mv
|
||
|
|
||
|
try:
|
||
|
# for python >= 3.2, avoid DeprecationWarning for cgi.escape
|
||
|
from html import escape as htmlescape
|
||
|
except ImportError:
|
||
|
pass
|
||
|
|
||
|
|
||
|
if hasattr(array.array, "tobytes"):
|
||
|
def array_tobytes(arry):
|
||
|
return arry.tobytes()
|
||
|
|
||
|
def array_frombytes(arry, bs):
|
||
|
return arry.frombytes(bs)
|
||
|
else:
|
||
|
def array_tobytes(arry):
|
||
|
return arry.tostring()
|
||
|
|
||
|
def array_frombytes(arry, bs):
|
||
|
return arry.fromstring(bs)
|
||
|
|
||
|
|
||
|
# Implementations missing from older versions of Python
|
||
|
|
||
|
try:
|
||
|
from itertools import permutations # @UnusedImport
|
||
|
except ImportError:
|
||
|
# Python 2.5
|
||
|
def permutations(iterable, r=None):
|
||
|
pool = tuple(iterable)
|
||
|
n = len(pool)
|
||
|
r = n if r is None else r
|
||
|
if r > n:
|
||
|
return
|
||
|
indices = range(n)
|
||
|
cycles = range(n, n - r, -1)
|
||
|
yield tuple(pool[i] for i in indices[:r])
|
||
|
while n:
|
||
|
for i in reversed(range(r)):
|
||
|
cycles[i] -= 1
|
||
|
if cycles[i] == 0:
|
||
|
indices[i:] = indices[i + 1:] + indices[i:i + 1]
|
||
|
cycles[i] = n - i
|
||
|
else:
|
||
|
j = cycles[i]
|
||
|
indices[i], indices[-j] = indices[-j], indices[i]
|
||
|
yield tuple(pool[i] for i in indices[:r])
|
||
|
break
|
||
|
else:
|
||
|
return
|
||
|
|
||
|
|
||
|
try:
|
||
|
# Python 2.6-2.7
|
||
|
from itertools import izip_longest # @UnusedImport
|
||
|
except ImportError:
|
||
|
try:
|
||
|
# Python 3.0
|
||
|
from itertools import zip_longest as izip_longest # @UnusedImport
|
||
|
except ImportError:
|
||
|
# Python 2.5
|
||
|
from itertools import chain, izip, repeat
|
||
|
|
||
|
def izip_longest(*args, **kwds):
|
||
|
fillvalue = kwds.get('fillvalue')
|
||
|
|
||
|
def sentinel(counter=([fillvalue] * (len(args) - 1)).pop):
|
||
|
yield counter()
|
||
|
|
||
|
fillers = repeat(fillvalue)
|
||
|
iters = [chain(it, sentinel(), fillers) for it in args]
|
||
|
try:
|
||
|
for tup in izip(*iters):
|
||
|
yield tup
|
||
|
except IndexError:
|
||
|
pass
|
||
|
|
||
|
|
||
|
try:
|
||
|
from operator import methodcaller # @UnusedImport
|
||
|
except ImportError:
|
||
|
# Python 2.5
|
||
|
def methodcaller(name, *args, **kwargs):
|
||
|
def caller(obj):
|
||
|
return getattr(obj, name)(*args, **kwargs)
|
||
|
return caller
|
||
|
|
||
|
|
||
|
try:
|
||
|
from abc import abstractmethod # @UnusedImport
|
||
|
except ImportError:
|
||
|
# Python 2.5
|
||
|
def abstractmethod(funcobj):
|
||
|
"""A decorator indicating abstract methods.
|
||
|
"""
|
||
|
funcobj.__isabstractmethod__ = True
|
||
|
return funcobj
|