From 898591323ce60781e20007fe8598dbffd8bce75d Mon Sep 17 00:00:00 2001 From: Mike Bayer <mike_mp@zzzcomputing.com> Date: Fri, 17 Oct 2008 19:40:26 +0000 Subject: [PATCH] - caching now uses beaker.cache_manager directly. For best results use Beaker 1.0.4, just checked in. This version of Beaker stores no persistent state in memory for each key, allowing dynamically generated keys to work without using up available memory. --- CHANGES | 29 +++++++++++--------- lib/mako/cache.py | 67 ++++++++++++++++++++++------------------------- setup.py | 2 +- 3 files changed, 49 insertions(+), 49 deletions(-) diff --git a/CHANGES b/CHANGES index 1272e0a..2e2d893 100644 --- a/CHANGES +++ b/CHANGES @@ -1,12 +1,10 @@ 0.2.3 - added support for Jython 2.5. -- cache module now uses Beaker's clsmap to get at -container classes, so cache types such as -"ext:google", "ext:sqla", etc. are available. -memcached is available as both "ext:memcached" and -"memcached", the latter for backwards compatibility. -This requires Beaker>=1.0.1. +- cache module now uses Beaker's CacheManager + object directly, so that all cache types are included. + memcached is available as both "ext:memcached" and + "memcached", the latter for backwards compatibility. - added "cache" accessor to Template, Namespace. e.g. ${local.cache.get('somekey')} or @@ -19,16 +17,23 @@ This requires Beaker>=1.0.1. (i.e. storage type) are derived from whatever has been already persisted for that template. [ticket:92] + +- For cache changes to work fully, Beaker 1.0.4 is required. + 1.0.1 and up will work as well with the exception of + cache expiry. Note that Beaker 1.0.4 is **required** + for applications which use dynamically generated keys, + since previous versions will permanently store state in memory + for each individual key and thus use up all available memory. - fixed the html_error_template not handling tracebacks from -normal .py files with a magic encoding comment [ticket:88] + normal .py files with a magic encoding comment [ticket:88] - added ModuleTemplate class, which allows the construction -of a Template given a Python module generated by a previous -Template. This allows Python modules alone to be used -as templates with no compilation step. Source code -and template source are optional but allow error reporting -to work correctly. + of a Template given a Python module generated by a previous + Template. This allows Python modules alone to be used + as templates with no compilation step. Source code + and template source are optional but allow error reporting + to work correctly. - fixed Python 2.3 compat. in mako.pyparser [ticket:90] diff --git a/lib/mako/cache.py b/lib/mako/cache.py index 20ceba7..43f7317 100644 --- a/lib/mako/cache.py +++ b/lib/mako/cache.py @@ -1,60 +1,55 @@ from mako import exceptions try: - from beaker import container, exceptions, cache - clsmap = cache.clsmap - - if 'ext:memcached' in clsmap: - clsmap['memcached'] = clsmap['ext:memcached'] + from beaker import cache + cache = cache.CacheManager() except ImportError: - container = None - clsmap = {} + cache = None class Cache(object): def __init__(self, id, starttime): self.id = id self.starttime = starttime - if container is not None: - self.context = container.ContainerContext() self.def_regions = {} def put(self, key, value, **kwargs): - c = self._get_container(key, **kwargs) - if not c: - raise exceptions.RuntimeException("No cache container exists for key %r" % key) - c.set_value(value) + defname = kwargs.pop('defname', None) + expiretime = kwargs.pop('expiretime', None) + createfunc = kwargs.pop('createfunc', None) + + self._get_cache(defname, **kwargs).put_value(key, starttime=self.starttime, expiretime=expiretime) def get(self, key, **kwargs): - c = self._get_container(key, **kwargs) - if c: - return c.get_value() - else: - return None + defname = kwargs.pop('defname', None) + expiretime = kwargs.pop('expiretime', None) + createfunc = kwargs.pop('createfunc', None) - def invalidate(self, key, defname, **kwargs): - c = self._get_container(key, defname, **kwargs) - if c: - c.clear_value() + return self._get_cache(defname, **kwargs).get_value(key, starttime=self.starttime, expiretime=expiretime, createfunc=createfunc) + + def invalidate(self, key, **kwargs): + defname = kwargs.pop('defname', None) + expiretime = kwargs.pop('expiretime', None) + createfunc = kwargs.pop('createfunc', None) + + self._get_cache(defname, **kwargs).remove_value(key, starttime=self.starttime, expiretime=expiretime) def invalidate_body(self): - self.invalidate('render_body', 'render_body') + self.invalidate('render_body', defname='render_body') def invalidate_def(self, name): - self.invalidate('render_%s' % name, 'render_%s' % name) + self.invalidate('render_%s' % name, defname='render_%s' % name) def invalidate_closure(self, name): - self.invalidate(name, name) - - def _get_container(self, key, defname, **kwargs): - if not container: + self.invalidate(name, defname=name) + + def _get_cache(self, defname, type=None, **kw): + if not cache: raise exceptions.RuntimeException("the Beaker package is required to use cache functionality.") - - type = kwargs.pop('type', None) + if type == 'memcached': + type = 'ext:memcached' if not type: - type = self.def_regions.get(defname, 'memory') + (type, kw) = self.def_regions.get(defname, ('memory', {})) else: - self.def_regions[defname] = type - - return container.Value(key, self.context, self.id, clsmap[type], starttime=self.starttime, **kwargs) - - + self.def_regions[defname] = (type, kw) + return cache.get_cache(self.id, type=type, **kw) + \ No newline at end of file diff --git a/setup.py b/setup.py index bbf81db..df71741 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ SVN version: scripts=['scripts/mako-render'], zip_safe=False, install_requires=[ - 'Beaker>=1.0.1', + 'Beaker>=1.0.4', ], entry_points=""" [python.templating.engines] -- GitLab