mirror of
https://github.com/janeczku/calibre-web
synced 2024-09-06 04:26:49 +00:00
![OzzieIsaacs](/assets/img/avatar_default.png)
Bugfix for feeds - removed categories related and up - load new books now working - category random now working login page is free of non accessible elements boolean custom column is vivible in UI books with only with certain languages can be shown book shelfs can be deleted from UI Anonymous user view is more resticted Added browse of series in sidebar Dependencys in vendor folder are updated to newer versions (licencs files are now present) Bugfix editing Authors names Made upload on windows working
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
flask._compat
|
|
~~~~~~~~~~~~~
|
|
|
|
Some py2/py3 compatibility support based on a stripped down
|
|
version of six so we don't have to depend on a specific version
|
|
of it.
|
|
|
|
:copyright: (c) 2015 by Armin Ronacher.
|
|
:license: BSD, see LICENSE for more details.
|
|
"""
|
|
import sys
|
|
|
|
PY2 = sys.version_info[0] == 2
|
|
_identity = lambda x: x
|
|
|
|
|
|
if not PY2:
|
|
text_type = str
|
|
string_types = (str,)
|
|
integer_types = (int,)
|
|
|
|
iterkeys = lambda d: iter(d.keys())
|
|
itervalues = lambda d: iter(d.values())
|
|
iteritems = lambda d: iter(d.items())
|
|
|
|
from io import StringIO
|
|
|
|
def reraise(tp, value, tb=None):
|
|
if value.__traceback__ is not tb:
|
|
raise value.with_traceback(tb)
|
|
raise value
|
|
|
|
implements_to_string = _identity
|
|
|
|
else:
|
|
text_type = unicode
|
|
string_types = (str, unicode)
|
|
integer_types = (int, long)
|
|
|
|
iterkeys = lambda d: d.iterkeys()
|
|
itervalues = lambda d: d.itervalues()
|
|
iteritems = lambda d: d.iteritems()
|
|
|
|
from cStringIO import StringIO
|
|
|
|
exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')
|
|
|
|
def implements_to_string(cls):
|
|
cls.__unicode__ = cls.__str__
|
|
cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
|
|
return cls
|
|
|
|
|
|
def with_metaclass(meta, *bases):
|
|
"""Create a base class with a metaclass."""
|
|
# This requires a bit of explanation: the basic idea is to make a
|
|
# dummy metaclass for one level of class instantiation that replaces
|
|
# itself with the actual metaclass.
|
|
class metaclass(type):
|
|
def __new__(cls, name, this_bases, d):
|
|
return meta(name, bases, d)
|
|
return type.__new__(metaclass, 'temporary_class', (), {})
|
|
|
|
|
|
# Certain versions of pypy have a bug where clearing the exception stack
|
|
# breaks the __exit__ function in a very peculiar way. This is currently
|
|
# true for pypy 2.2.1 for instance. The second level of exception blocks
|
|
# is necessary because pypy seems to forget to check if an exception
|
|
# happened until the next bytecode instruction?
|
|
BROKEN_PYPY_CTXMGR_EXIT = False
|
|
if hasattr(sys, 'pypy_version_info'):
|
|
class _Mgr(object):
|
|
def __enter__(self):
|
|
return self
|
|
def __exit__(self, *args):
|
|
sys.exc_clear()
|
|
try:
|
|
try:
|
|
with _Mgr():
|
|
raise AssertionError()
|
|
except:
|
|
raise
|
|
except TypeError:
|
|
BROKEN_PYPY_CTXMGR_EXIT = True
|
|
except AssertionError:
|
|
pass
|