diff options
Diffstat (limited to 'lib/mako')
-rw-r--r-- | lib/mako/cache.py | 7 | ||||
-rw-r--r-- | lib/mako/codegen.py | 16 | ||||
-rw-r--r-- | lib/mako/lookup.py | 4 | ||||
-rw-r--r-- | lib/mako/parsetree.py | 4 | ||||
-rw-r--r-- | lib/mako/runtime.py | 8 | ||||
-rw-r--r-- | lib/mako/template.py | 4 |
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""") |