|
@@ -0,0 +1,114 @@
|
|
|
+class LocalProxy(object):
|
|
|
+ """Code stolen from werkzeug.local.LocalProxy."""
|
|
|
+ __slots__ = ('__local', '__dict__', '__name__')
|
|
|
+
|
|
|
+ def __init__(self, local, name=None):
|
|
|
+ object.__setattr__(self, '_LocalProxy__local', local)
|
|
|
+ object.__setattr__(self, '__name__', name)
|
|
|
+
|
|
|
+ def _get_current_object(self):
|
|
|
+ """Return the current object. This is useful if you want the real
|
|
|
+ object behind the proxy at a time for performance reasons or because
|
|
|
+ you want to pass the object into a different context.
|
|
|
+ """
|
|
|
+ if not hasattr(self.__local, '__release_local__'):
|
|
|
+ return self.__local()
|
|
|
+ try:
|
|
|
+ return getattr(self.__local, self.__name__)
|
|
|
+ except AttributeError:
|
|
|
+ raise RuntimeError('no object bound to %s' % self.__name__)
|
|
|
+
|
|
|
+ @property
|
|
|
+ def __dict__(self):
|
|
|
+ try:
|
|
|
+ return self._get_current_object().__dict__
|
|
|
+ except RuntimeError:
|
|
|
+ raise AttributeError('__dict__')
|
|
|
+
|
|
|
+ def __repr__(self):
|
|
|
+ try:
|
|
|
+ obj = self._get_current_object()
|
|
|
+ except RuntimeError:
|
|
|
+ return '<%s unbound>' % self.__class__.__name__
|
|
|
+ return repr(obj)
|
|
|
+
|
|
|
+ def __nonzero__(self):
|
|
|
+ try:
|
|
|
+ return bool(self._get_current_object())
|
|
|
+ except RuntimeError:
|
|
|
+ return False
|
|
|
+
|
|
|
+ def __unicode__(self):
|
|
|
+ try:
|
|
|
+ return unicode(self._get_current_object())
|
|
|
+ except RuntimeError:
|
|
|
+ return repr(self)
|
|
|
+
|
|
|
+ def __dir__(self):
|
|
|
+ try:
|
|
|
+ return dir(self._get_current_object())
|
|
|
+ except RuntimeError:
|
|
|
+ return []
|
|
|
+
|
|
|
+ def __getattr__(self, name):
|
|
|
+ if name == '__members__':
|
|
|
+ return dir(self._get_current_object())
|
|
|
+ return getattr(self._get_current_object(), name)
|
|
|
+
|
|
|
+ def __setitem__(self, key, value):
|
|
|
+ self._get_current_object()[key] = value
|
|
|
+
|
|
|
+ def __delitem__(self, key):
|
|
|
+ del self._get_current_object()[key]
|
|
|
+
|
|
|
+ def __setslice__(self, i, j, seq):
|
|
|
+ self._get_current_object()[i:j] = seq
|
|
|
+
|
|
|
+ def __delslice__(self, i, j):
|
|
|
+ del self._get_current_object()[i:j]
|
|
|
+
|
|
|
+ __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v)
|
|
|
+ __delattr__ = lambda x, n: delattr(x._get_current_object(), n)
|
|
|
+ __str__ = lambda x: str(x._get_current_object())
|
|
|
+ __lt__ = lambda x, o: x._get_current_object() < o
|
|
|
+ __le__ = lambda x, o: x._get_current_object() <= o
|
|
|
+ __eq__ = lambda x, o: x._get_current_object() == o
|
|
|
+ __ne__ = lambda x, o: x._get_current_object() != o
|
|
|
+ __gt__ = lambda x, o: x._get_current_object() > o
|
|
|
+ __ge__ = lambda x, o: x._get_current_object() >= o
|
|
|
+ __cmp__ = lambda x, o: cmp(x._get_current_object(), o)
|
|
|
+ __hash__ = lambda x: hash(x._get_current_object())
|
|
|
+ __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw)
|
|
|
+ __len__ = lambda x: len(x._get_current_object())
|
|
|
+ __getitem__ = lambda x, i: x._get_current_object()[i]
|
|
|
+ __iter__ = lambda x: iter(x._get_current_object())
|
|
|
+ __contains__ = lambda x, i: i in x._get_current_object()
|
|
|
+ __getslice__ = lambda x, i, j: x._get_current_object()[i:j]
|
|
|
+ __add__ = lambda x, o: x._get_current_object() + o
|
|
|
+ __sub__ = lambda x, o: x._get_current_object() - o
|
|
|
+ __mul__ = lambda x, o: x._get_current_object() * o
|
|
|
+ __floordiv__ = lambda x, o: x._get_current_object() // o
|
|
|
+ __mod__ = lambda x, o: x._get_current_object() % o
|
|
|
+ __divmod__ = lambda x, o: x._get_current_object().__divmod__(o)
|
|
|
+ __pow__ = lambda x, o: x._get_current_object() ** o
|
|
|
+ __lshift__ = lambda x, o: x._get_current_object() << o
|
|
|
+ __rshift__ = lambda x, o: x._get_current_object() >> o
|
|
|
+ __and__ = lambda x, o: x._get_current_object() & o
|
|
|
+ __xor__ = lambda x, o: x._get_current_object() ^ o
|
|
|
+ __or__ = lambda x, o: x._get_current_object() | o
|
|
|
+ __div__ = lambda x, o: x._get_current_object().__div__(o)
|
|
|
+ __truediv__ = lambda x, o: x._get_current_object().__truediv__(o)
|
|
|
+ __neg__ = lambda x: -(x._get_current_object())
|
|
|
+ __pos__ = lambda x: +(x._get_current_object())
|
|
|
+ __abs__ = lambda x: abs(x._get_current_object())
|
|
|
+ __invert__ = lambda x: ~(x._get_current_object())
|
|
|
+ __complex__ = lambda x: complex(x._get_current_object())
|
|
|
+ __int__ = lambda x: int(x._get_current_object())
|
|
|
+ __long__ = lambda x: long(x._get_current_object())
|
|
|
+ __float__ = lambda x: float(x._get_current_object())
|
|
|
+ __oct__ = lambda x: oct(x._get_current_object())
|
|
|
+ __hex__ = lambda x: hex(x._get_current_object())
|
|
|
+ __index__ = lambda x: x._get_current_object().__index__()
|
|
|
+ __coerce__ = lambda x, o: x.__coerce__(x, o)
|
|
|
+ __enter__ = lambda x: x.__enter__()
|
|
|
+ __exit__ = lambda x, *a, **kw: x.__exit__(*a, **kw)
|