Skip to content

support context passed to cacheimpl #185

@sqlalchemy-bot

Description

@sqlalchemy-bot

Migrated issue, originally created by Michael Bayer (@zzzeek)

possible patch:

diff -r 2f022a271212b220519305649e6a8490cf4399ff mako/cache.py
--- a/mako/cache.py	Tue Feb 21 09:49:40 2012 -0500
+++ b/mako/cache.py	Wed Mar 07 15:24:22 2012 -0500
@@ -85,6 +85,17 @@
                         creation_function, 
                         **self._get_cache_kw(kw))
 
+    def _ctx_get_or_create(self, key, creation_function, context, **kw):
+        """Retrieve a value from the cache, using the given creation function 
+        to generate a new value."""
+
+        if not self.template.cache_enabled:
+            return creation_function()
+
+        return self.impl.get_or_create(key, 
+                        creation_function, 
+                        **self._get_cache_kw(kw, context))
+
     def set(self, key, value, **kw):
         """Place a value in the cache.
  
@@ -151,18 +162,31 @@
  
         self.invalidate(name, __M_defname=name)
  
-    def _get_cache_kw(self, kw):
+    def _get_cache_kw(self, kw, context=None):
+        if context:
+            ctx_args = self.impl.get_template_arguments(context)
+        else:
+            ctx_args = None
         defname = kw.pop('__M_defname', None)
         if not defname:
             tmpl_kw = self.template.cache_args.copy()
             tmpl_kw.update(kw)
+            if ctx_args:
+                tmpl_kw.update(ctx_args)
             return tmpl_kw
         elif defname in self._def_regions:
-            return self._def_regions[defname]
+            tmpl_kw = self._def_regions[defname]
+            if ctx_args:
+                tmpl_kw = tmpl_kw.copy()
+                tmpl_kw.update(ctx_args)
+            return tmpl_kw
         else:
             tmpl_kw = self.template.cache_args.copy()
             tmpl_kw.update(kw)
             self._def_regions[defname] = tmpl_kw
+            if ctx_args:
+                tmpl_kw = tmpl_kw.copy()
+                tmpl_kw.update(ctx_args)
             return tmpl_kw
 
 class CacheImpl(object):
@@ -171,6 +195,9 @@
     def __init__(self, cache):
         self.cache = cache
 
+    def get_template_arguments(self, context):
+        return {}
+
     def get_or_create(self, key, creation_function, **kw):
         """Retrieve a value from the cache, using the given creation function 
         to generate a new value.
diff -r 2f022a271212b220519305649e6a8490cf4399ff mako/codegen.py
--- a/mako/codegen.py	Tue Feb 21 09:49:40 2012 -0500
+++ b/mako/codegen.py	Wed Mar 07 15:24:22 2012 -0500
@@ -633,7 +633,7 @@
                         )
         if buffered:
             s = "context.get('local')."\
-                "cache.get_or_create(%s, lambda:__M_%s(%s),  %s__M_defname=%r)" % \
+                "cache._ctx_get_or_create(%s, lambda:__M_%s(%s),  context, %s__M_defname=%r)" % \
                             (cachekey, name, ','.join(pass_args), 
                             ''.join(["%s=%s, " % (k,v) for k, v in cache_args.items()]), 
                             name
@@ -644,7 +644,7 @@
         else:
             self.printer.writelines(
                     "__M_writer(context.get('local')."
-                    "cache.get_or_create(%s, lambda:__M_%s(%s), %s__M_defname=%r))" % 
+                    "cache._ctx_get_or_create(%s, lambda:__M_%s(%s), context, %s__M_defname=%r))" % 
                     (cachekey, name, ','.join(pass_args), 
                     ''.join(["%s=%s, " % (k,v) for k, v in cache_args.items()]), 
                     name, 

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions