aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mako
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mako')
-rw-r--r--lib/mako/cache.py7
-rw-r--r--lib/mako/codegen.py16
-rw-r--r--lib/mako/lookup.py4
-rw-r--r--lib/mako/parsetree.py4
-rw-r--r--lib/mako/runtime.py8
-rw-r--r--lib/mako/template.py4
6 files changed, 34 insertions, 9 deletions
diff --git a/lib/mako/cache.py b/lib/mako/cache.py
index 5a32c42..341e6aa 100644
--- a/lib/mako/cache.py
+++ b/lib/mako/cache.py
@@ -21,12 +21,13 @@ except ImportError:
clsmap = {}
class Cache(object):
- def __init__(self, id, starttime):
+ def __init__(self, id, starttime, **kwargs):
self.id = id
self.starttime = starttime
if container is not None:
self.context = container.ContainerContext()
self._containers = {}
+ self.kwargs = kwargs
def put(self, key, value, type='memory', **kwargs):
self._get_container(key, type, **kwargs).set_value(value)
def get(self, key, type='memory', **kwargs):
@@ -37,5 +38,7 @@ class Cache(object):
except KeyError:
if container is None:
raise exceptions.RuntimeException("myghtyutils package is required to use cache functionality.")
- return self._containers.setdefault(key, clsmap[type](key, self.context, self.id, starttime=self.starttime, **kwargs))
+ kw = self.kwargs.copy()
+ kw.update(kwargs)
+ return self._containers.setdefault(key, clsmap[type](key, self.context, self.id, starttime=self.starttime, **kw))
\ No newline at end of file
diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py
index 4de9f9b..81272ea 100644
--- a/lib/mako/codegen.py
+++ b/lib/mako/codegen.py
@@ -49,6 +49,7 @@ class _GenerateRenderMethod(object):
name = "render"
args = None
buffered = filtered = False
+ self.compiler.pagetag = pagetag
cached = pagetag is not None and eval(pagetag.attributes.get('cached', 'False'))
if args is None:
args = ['context']
@@ -337,17 +338,28 @@ class _GenerateRenderMethod(object):
"""write a post-function decorator to replace a rendering callable with a cached version of itself."""
self.printer.writeline("__%s = %s" % (name, name))
cachekey = node_or_pagetag.parsed_attributes.get('cache_key', repr(name))
+ cacheargs = {}
+ for arg in (('cache_type', 'type'), ('cache_dir', 'data_dir')):
+ val = node_or_pagetag.parsed_attributes.get(arg[0], None)
+ if val is not None:
+ cacheargs[arg[1]] = val
+ else:
+ if self.compiler.pagetag is not None:
+ val = self.compiler.pagetag.parsed_attributes.get(arg[0], None)
+ if val is not None:
+ cacheargs[arg[1]] = val
+
self.printer.writeline("def %s(context, *args, **kwargs):" % name)
self.write_variable_declares(identifiers, limit=node_or_pagetag.undeclared_identifiers())
if buffered:
self.printer.writelines(
- "return _template_cache.get(%s, createfunc=lambda:__%s(context, *args, **kwargs))" % (cachekey, name),
+ "return context.get('local').get_cached(%s, %screatefunc=lambda:__%s(context, *args, **kwargs))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name),
None
)
else:
self.printer.writelines(
- "context.write(_template_cache.get(%s, createfunc=lambda:__%s(context, *args, **kwargs)))" % (cachekey, name),
+ "context.write(context.get('local').get_cached(%s, %screatefunc=lambda:__%s(context, *args, **kwargs)))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name),
"return ''",
None
)
diff --git a/lib/mako/lookup.py b/lib/mako/lookup.py
index 76c80e7..6808e5a 100644
--- a/lib/mako/lookup.py
+++ b/lib/mako/lookup.py
@@ -37,12 +37,12 @@ class TemplateCollection(object):
return uri
class TemplateLookup(TemplateCollection):
- def __init__(self, directories=None, module_directory=None, filesystem_checks=False, collection_size=-1, format_exceptions=False, error_handler=None, output_encoding=None):
+ def __init__(self, directories=None, module_directory=None, filesystem_checks=False, collection_size=-1, format_exceptions=False, error_handler=None, output_encoding=None, cache_type=None, cache_dir=None):
self.directories = [posixpath.normpath(d) for d in directories or []]
self.module_directory = module_directory
self.filesystem_checks = filesystem_checks
self.collection_size = collection_size
- self.template_args = {'format_exceptions':format_exceptions, 'error_handler':error_handler, 'output_encoding':output_encoding, 'module_directory':module_directory}
+ self.template_args = {'format_exceptions':format_exceptions, 'error_handler':error_handler, 'output_encoding':output_encoding, 'module_directory':module_directory, 'cache_type':cache_type, 'cache_dir':cache_dir or module_directory}
if collection_size == -1:
self.__collection = {}
self._uri_cache = {}
diff --git a/lib/mako/parsetree.py b/lib/mako/parsetree.py
index 95e6f26..7986441 100644
--- a/lib/mako/parsetree.py
+++ b/lib/mako/parsetree.py
@@ -240,7 +240,7 @@ class TextTag(Tag):
class DefTag(Tag):
__keyword__ = 'def'
def __init__(self, keyword, attributes, **kwargs):
- super(DefTag, self).__init__(keyword, attributes, ('buffered', 'cached', 'cache_key', 'cache_timeout', 'cache_type'), ('name','filter'), ('name',), **kwargs)
+ super(DefTag, self).__init__(keyword, attributes, ('buffered', 'cached', 'cache_key', 'cache_timeout', 'cache_type', 'cache_dir'), ('name','filter'), ('name',), **kwargs)
name = attributes['name']
if re.match(r'^[\w_]+$',name):
name = name + "()"
@@ -274,5 +274,5 @@ class InheritTag(Tag):
class PageTag(Tag):
__keyword__ = 'page'
def __init__(self, keyword, attributes, **kwargs):
- super(PageTag, self).__init__(keyword, attributes, ('cached', 'cache_key', 'cache_timeout', 'cache_type'), (), (), **kwargs)
+ super(PageTag, self).__init__(keyword, attributes, ('cached', 'cache_key', 'cache_timeout', 'cache_type', 'cache_dir'), (), (), **kwargs)
\ No newline at end of file
diff --git a/lib/mako/runtime.py b/lib/mako/runtime.py
index 0b163fb..9ada09a 100644
--- a/lib/mako/runtime.py
+++ b/lib/mako/runtime.py
@@ -111,6 +111,14 @@ class Namespace(object):
self.context.namespaces[key] = ns
return ns
+ def get_cached(self, key, **kwargs):
+ if self.template:
+ if self.template.cache_dir:
+ kwargs.setdefault('data_dir', self.template.cache_dir)
+ if self.template.cache_type:
+ kwargs.setdefault('type', self.template.cache_type)
+ return self.template.module._template_cache.get(key, **kwargs)
+
def include_file(self, uri):
"""include a file at the given uri"""
_include_file(self.context, uri, self._templateuri)
diff --git a/lib/mako/template.py b/lib/mako/template.py
index 6caec95..5971742 100644
--- a/lib/mako/template.py
+++ b/lib/mako/template.py
@@ -16,7 +16,7 @@ import imp, time, weakref, tempfile, shutil, os, stat, posixpath, sys, re
class Template(object):
"""a compiled template"""
- def __init__(self, text=None, filename=None, uri=None, format_exceptions=False, error_handler=None, lookup=None, output_encoding=None, module_directory=None):
+ def __init__(self, text=None, filename=None, uri=None, format_exceptions=False, error_handler=None, lookup=None, output_encoding=None, module_directory=None, cache_type=None, cache_dir=None):
"""construct a new Template instance using either literal template text, or a previously loaded template module
text - textual template source, or None if a module is to be provided
@@ -77,6 +77,8 @@ class Template(object):
self.error_handler = error_handler
self.lookup = lookup
self.output_encoding = output_encoding
+ self.cache_type = cache_type
+ self.cache_dir = cache_dir
source = property(lambda self:_get_module_info_from_callable(self.callable_).source, doc="""return the template source code for this Template.""")
code = property(lambda self:_get_module_info_from_callable(self.callable_).code, doc="""return the module source code for this Template""")