Index: third_party/google-endpoints/dogpile/cache/plugins/mako_cache.py |
diff --git a/third_party/google-endpoints/dogpile/cache/plugins/mako_cache.py b/third_party/google-endpoints/dogpile/cache/plugins/mako_cache.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..61f4ffaf327b21b11c6d0e0e9c9368dd85e90f72 |
--- /dev/null |
+++ b/third_party/google-endpoints/dogpile/cache/plugins/mako_cache.py |
@@ -0,0 +1,90 @@ |
+""" |
+Mako Integration |
+---------------- |
+ |
+dogpile.cache includes a `Mako <http://www.makotemplates.org>`_ plugin |
+that replaces `Beaker <http://beaker.groovie.org>`_ |
+as the cache backend. |
+Setup a Mako template lookup using the "dogpile.cache" cache implementation |
+and a region dictionary:: |
+ |
+ from dogpile.cache import make_region |
+ from mako.lookup import TemplateLookup |
+ |
+ my_regions = { |
+ "local":make_region().configure( |
+ "dogpile.cache.dbm", |
+ expiration_time=360, |
+ arguments={"filename":"file.dbm"} |
+ ), |
+ "memcached":make_region().configure( |
+ "dogpile.cache.pylibmc", |
+ expiration_time=3600, |
+ arguments={"url":["127.0.0.1"]} |
+ ) |
+ } |
+ |
+ mako_lookup = TemplateLookup( |
+ directories=["/myapp/templates"], |
+ cache_impl="dogpile.cache", |
+ cache_args={ |
+ 'regions':my_regions |
+ } |
+ ) |
+ |
+To use the above configuration in a template, use the ``cached=True`` |
+argument on any Mako tag which accepts it, in conjunction with the |
+name of the desired region as the ``cache_region`` argument:: |
+ |
+ <%def name="mysection()" cached="True" cache_region="memcached"> |
+ some content that's cached |
+ </%def> |
+ |
+ |
+""" |
+from mako.cache import CacheImpl |
+ |
+ |
+class MakoPlugin(CacheImpl): |
+ """A Mako ``CacheImpl`` which talks to dogpile.cache.""" |
+ |
+ def __init__(self, cache): |
+ super(MakoPlugin, self).__init__(cache) |
+ try: |
+ self.regions = self.cache.template.cache_args['regions'] |
+ except KeyError: |
+ raise KeyError( |
+ "'cache_regions' argument is required on the " |
+ "Mako Lookup or Template object for usage " |
+ "with the dogpile.cache plugin.") |
+ |
+ def _get_region(self, **kw): |
+ try: |
+ region = kw['region'] |
+ except KeyError: |
+ raise KeyError( |
+ "'cache_region' argument must be specified with 'cache=True'" |
+ "within templates for usage with the dogpile.cache plugin.") |
+ try: |
+ return self.regions[region] |
+ except KeyError: |
+ raise KeyError("No such region '%s'" % region) |
+ |
+ def get_and_replace(self, key, creation_function, **kw): |
+ expiration_time = kw.pop("timeout", None) |
+ return self._get_region(**kw).get_or_create( |
+ key, creation_function, |
+ expiration_time=expiration_time) |
+ |
+ def get_or_create(self, key, creation_function, **kw): |
+ return self.get_and_replace(key, creation_function, **kw) |
+ |
+ def put(self, key, value, **kw): |
+ self._get_region(**kw).put(key, value) |
+ |
+ def get(self, key, **kw): |
+ expiration_time = kw.pop("timeout", None) |
+ return self._get_region(**kw).get(key, expiration_time=expiration_time) |
+ |
+ def invalidate(self, key, **kw): |
+ self._get_region(**kw).delete(key) |