| Index: third_party/google-endpoints/dogpile/cache/proxy.py
|
| diff --git a/third_party/google-endpoints/dogpile/cache/proxy.py b/third_party/google-endpoints/dogpile/cache/proxy.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..15c6b5746f5479bd4d81e65841fd227db7e157cd
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/dogpile/cache/proxy.py
|
| @@ -0,0 +1,95 @@
|
| +"""
|
| +Proxy Backends
|
| +------------------
|
| +
|
| +Provides a utility and a decorator class that allow for modifying the behavior
|
| +of different backends without altering the class itself or having to extend the
|
| +base backend.
|
| +
|
| +.. versionadded:: 0.5.0 Added support for the :class:`.ProxyBackend` class.
|
| +
|
| +"""
|
| +
|
| +from .api import CacheBackend
|
| +
|
| +
|
| +class ProxyBackend(CacheBackend):
|
| + """A decorator class for altering the functionality of backends.
|
| +
|
| + Basic usage::
|
| +
|
| + from dogpile.cache import make_region
|
| + from dogpile.cache.proxy import ProxyBackend
|
| +
|
| + class MyFirstProxy(ProxyBackend):
|
| + def get(self, key):
|
| + # ... custom code goes here ...
|
| + return self.proxied.get(key)
|
| +
|
| + def set(self, key, value):
|
| + # ... custom code goes here ...
|
| + self.proxied.set(key)
|
| +
|
| + class MySecondProxy(ProxyBackend):
|
| + def get(self, key):
|
| + # ... custom code goes here ...
|
| + return self.proxied.get(key)
|
| +
|
| +
|
| + region = make_region().configure(
|
| + 'dogpile.cache.dbm',
|
| + expiration_time = 3600,
|
| + arguments = {
|
| + "filename":"/path/to/cachefile.dbm"
|
| + },
|
| + wrap = [ MyFirstProxy, MySecondProxy ]
|
| + )
|
| +
|
| + Classes that extend :class:`.ProxyBackend` can be stacked
|
| + together. The ``.proxied`` property will always
|
| + point to either the concrete backend instance or
|
| + the next proxy in the chain that a method can be
|
| + delegated towards.
|
| +
|
| + .. versionadded:: 0.5.0
|
| +
|
| + """
|
| +
|
| + def __init__(self, *args, **kwargs):
|
| + self.proxied = None
|
| +
|
| + def wrap(self, backend):
|
| + ''' Take a backend as an argument and setup the self.proxied property.
|
| + Return an object that be used as a backend by a :class:`.CacheRegion`
|
| + object.
|
| + '''
|
| + assert(
|
| + isinstance(backend, CacheBackend) or
|
| + isinstance(backend, ProxyBackend))
|
| + self.proxied = backend
|
| + return self
|
| +
|
| + #
|
| + # Delegate any functions that are not already overridden to
|
| + # the proxies backend
|
| + #
|
| + def get(self, key):
|
| + return self.proxied.get(key)
|
| +
|
| + def set(self, key, value):
|
| + self.proxied.set(key, value)
|
| +
|
| + def delete(self, key):
|
| + self.proxied.delete(key)
|
| +
|
| + def get_multi(self, keys):
|
| + return self.proxied.get_multi(keys)
|
| +
|
| + def set_multi(self, mapping):
|
| + self.proxied.set_multi(mapping)
|
| +
|
| + def delete_multi(self, keys):
|
| + self.proxied.delete_multi(keys)
|
| +
|
| + def get_mutex(self, key):
|
| + return self.proxied.get_mutex(key)
|
|
|