123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- 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
|