diff options
Diffstat (limited to 'mako/runtime.py')
-rw-r--r-- | mako/runtime.py | 164 |
1 files changed, 82 insertions, 82 deletions
diff --git a/mako/runtime.py b/mako/runtime.py index 640bc89..f890c80 100644 --- a/mako/runtime.py +++ b/mako/runtime.py @@ -19,21 +19,21 @@ class Context(object): :class:`.Context`. """ - + def __init__(self, buffer, **data): self._buffer_stack = [buffer] - + self._data = data self._kwargs = data.copy() self._with_template = None self._outputting_as_unicode = None self.namespaces = {} - - # "capture" function which proxies to the + + # "capture" function which proxies to the # generic "capture" function self._data['capture'] = util.partial(capture, self) - + # "caller" stack used by def calls with content self.caller_stack = self._data['caller'] = CallerStack() @@ -42,7 +42,7 @@ class Context(object): illegal_names = t.reserved_names.intersection(self._data) if illegal_names: raise exceptions.NameConflictError( - "Reserved words passed to render(): %s" % + "Reserved words passed to render(): %s" % ", ".join(illegal_names)) @property @@ -52,7 +52,7 @@ class Context(object): """ return self._with_template.lookup - + @property def kwargs(self): """Return the dictionary of keyword arguments associated with this @@ -60,25 +60,25 @@ class Context(object): """ return self._kwargs.copy() - + def push_caller(self, caller): """Push a ``caller`` callable onto the callstack for this :class:`.Context`.""" - - + + self.caller_stack.append(caller) - + def pop_caller(self): """Pop a ``caller`` callable onto the callstack for this :class:`.Context`.""" del self.caller_stack[-1] - + def keys(self): """Return a list of all names established in this :class:`.Context`.""" return self._data.keys() - + def __getitem__(self, key): if key in self._data: return self._data[key] @@ -88,43 +88,43 @@ class Context(object): def _push_writer(self): """push a capturing buffer onto this Context and return the new writer function.""" - + buf = util.FastEncodingBuffer() self._buffer_stack.append(buf) return buf.write def _pop_buffer_and_writer(self): - """pop the most recent capturing buffer from this Context + """pop the most recent capturing buffer from this Context and return the current writer after the pop. - + """ buf = self._buffer_stack.pop() return buf, self._buffer_stack[-1].write - + def _push_buffer(self): """push a capturing buffer onto this Context.""" - + self._push_writer() - + def _pop_buffer(self): """pop the most recent capturing buffer from this Context.""" - + return self._buffer_stack.pop() - + def get(self, key, default=None): """Return a value from this :class:`.Context`.""" - - return self._data.get(key, + + return self._data.get(key, __builtin__.__dict__.get(key, default) ) - + def write(self, string): """Write a string to this :class:`.Context` object's underlying output buffer.""" - + self._buffer_stack[-1].write(string) - + def writer(self): """Return the current writer function.""" @@ -140,17 +140,17 @@ class Context(object): c.namespaces = self.namespaces c.caller_stack = self.caller_stack return c - + def locals_(self, d): """Create a new :class:`.Context` with a copy of this :class:`.Context`'s current state, updated with the given dictionary.""" - + if len(d) == 0: return self c = self._copy() c._data.update(d) return c - + def _clean_inheritance_tokens(self): """create a new copy of this :class:`.Context`. with tokens related to inheritance state removed.""" @@ -180,8 +180,8 @@ class CallerStack(list): return frame def _pop_frame(self): self.nextcaller = self.pop() - - + + class Undefined(object): """Represents an undefined value in a template. @@ -311,8 +311,8 @@ class _NSAttr(object): return getattr(ns.module, key) else: ns = ns.inherits - raise AttributeError(key) - + raise AttributeError(key) + class Namespace(object): """Provides access to collections of rendering methods, which can be local, from other templates, or from imported modules. @@ -328,9 +328,9 @@ class Namespace(object): described here. """ - - def __init__(self, name, context, - callables=None, inherits=None, + + def __init__(self, name, context, + callables=None, inherits=None, populate_self=True, calling_uri=None): self.name = name self.context = context @@ -365,7 +365,7 @@ class Namespace(object): one-another. """ - + filename = None """The path of the filesystem file used for this :class:`.Namespace`'s module or template. @@ -376,7 +376,7 @@ class Namespace(object): template file location. """ - + uri = None """The URI for this :class:`.Namespace`'s template. @@ -424,12 +424,12 @@ class Namespace(object): if key in self.context.namespaces: return self.context.namespaces[key] else: - ns = TemplateNamespace(uri, self.context._copy(), - templateuri=uri, - calling_uri=self._templateuri) + ns = TemplateNamespace(uri, self.context._copy(), + templateuri=uri, + calling_uri=self._templateuri) self.context.namespaces[key] = ns return ns - + def get_template(self, uri): """Return a :class:`.Template` from the given ``uri``. @@ -438,7 +438,7 @@ class Namespace(object): """ return _lookup_template(self.context, uri, self._templateuri) - + def get_cached(self, key, **kwargs): """Return a value from the :class:`.Cache` referenced by this :class:`.Namespace` object's :class:`.Template`. @@ -452,7 +452,7 @@ class Namespace(object): """ return self.cache.get(key, **kwargs) - + @property def cache(self): """Return the :class:`.Cache` object referenced @@ -461,12 +461,12 @@ class Namespace(object): """ return self.template.cache - + def include_file(self, uri, **kwargs): """Include a file at the given ``uri``.""" - + _include_file(self.context, uri, self._templateuri, **kwargs) - + def _populate(self, d, l): for ident in l: if ident == '*': @@ -474,7 +474,7 @@ class Namespace(object): d[k] = v else: d[ident] = getattr(self, ident) - + def _get_star(self): if self.callables: for key in self.callables: @@ -487,7 +487,7 @@ class Namespace(object): val = getattr(self.inherits, key) else: raise AttributeError( - "Namespace '%s' has no member '%s'" % + "Namespace '%s' has no member '%s'" % (self.name, key)) setattr(self, key, val) return val @@ -495,8 +495,8 @@ class Namespace(object): class TemplateNamespace(Namespace): """A :class:`.Namespace` specific to a :class:`.Template` instance.""" - def __init__(self, name, context, template=None, templateuri=None, - callables=None, inherits=None, + def __init__(self, name, context, template=None, templateuri=None, + callables=None, inherits=None, populate_self=True, calling_uri=None): self.name = name self.context = context @@ -505,7 +505,7 @@ class TemplateNamespace(Namespace): self.callables = dict([(c.func_name, c) for c in callables]) if templateuri is not None: - self.template = _lookup_template(context, templateuri, + self.template = _lookup_template(context, templateuri, calling_uri) self._templateuri = self.template.module._template_uri elif template is not None: @@ -516,7 +516,7 @@ class TemplateNamespace(Namespace): if populate_self: lclcallable, lclcontext = \ - _populate_self_namespace(context, self.template, + _populate_self_namespace(context, self.template, self_ns=self) @property @@ -569,7 +569,7 @@ class TemplateNamespace(Namespace): else: raise AttributeError( - "Namespace '%s' has no member '%s'" % + "Namespace '%s' has no member '%s'" % (self.name, key)) setattr(self, key, val) return val @@ -577,8 +577,8 @@ class TemplateNamespace(Namespace): class ModuleNamespace(Namespace): """A :class:`.Namespace` specific to a Python module instance.""" - def __init__(self, name, context, module, - callables=None, inherits=None, + def __init__(self, name, context, module, + callables=None, inherits=None, populate_self=True, calling_uri=None): self.name = name self.context = context @@ -619,7 +619,7 @@ class ModuleNamespace(Namespace): val = getattr(self.inherits, key) else: raise AttributeError( - "Namespace '%s' has no member '%s'" % + "Namespace '%s' has no member '%s'" % (self.name, key)) setattr(self, key, val) return val @@ -631,7 +631,7 @@ def supports_caller(func): See the example in :ref:`namespaces_python_modules`. """ - + def wrap_stackframe(context, *args, **kwargs): context.caller_stack._push_frame() try: @@ -639,7 +639,7 @@ def supports_caller(func): finally: context.caller_stack._pop_frame() return wrap_stackframe - + def capture(context, callable_, *args, **kwargs): """Execute the given template def, capturing the output into a buffer. @@ -647,7 +647,7 @@ def capture(context, callable_, *args, **kwargs): See the example in :ref:`namespaces_python_modules`. """ - + if not callable(callable_): raise exceptions.RuntimeException( "capture() function expects a callable as " @@ -673,7 +673,7 @@ def _decorate_toplevel(fn): return fn(y)(context, *args, **kw) return go return decorate_render - + def _decorate_inline(context, fn): def decorate_render(render_fn): dec = fn(render_fn) @@ -681,17 +681,17 @@ def _decorate_inline(context, fn): return dec(context, *args, **kw) return go return decorate_render - + def _include_file(context, uri, calling_uri, **kwargs): """locate the template from the given uri and include it in the current output.""" - + template = _lookup_template(context, uri, calling_uri) (callable_, ctx) = _populate_self_namespace( - context._clean_inheritance_tokens(), + context._clean_inheritance_tokens(), template) callable_(ctx, **_kwargs_for_include(callable_, context._data, **kwargs)) - + def _inherit_from(context, uri, calling_uri): """called by the _inherit method in template modules to set up the inheritance chain at the start of a template's @@ -705,9 +705,9 @@ def _inherit_from(context, uri, calling_uri): while ih.inherits is not None: ih = ih.inherits lclcontext = context.locals_({'next':ih}) - ih.inherits = TemplateNamespace("self:%s" % template.uri, - lclcontext, - template = template, + ih.inherits = TemplateNamespace("self:%s" % template.uri, + lclcontext, + template = template, populate_self=False) context._data['parent'] = lclcontext._data['local'] = ih.inherits callable_ = getattr(template.module, '_mako_inherit', None) @@ -725,7 +725,7 @@ def _lookup_template(context, uri, relativeto): lookup = context._with_template.lookup if lookup is None: raise exceptions.TemplateLookupException( - "Template '%s' has no TemplateLookup associated" % + "Template '%s' has no TemplateLookup associated" % context._with_template.uri) uri = lookup.adjust_uri(uri, relativeto) try: @@ -735,8 +735,8 @@ def _lookup_template(context, uri, relativeto): def _populate_self_namespace(context, template, self_ns=None): if self_ns is None: - self_ns = TemplateNamespace('self:%s' % template.uri, - context, template=template, + self_ns = TemplateNamespace('self:%s' % template.uri, + context, template=template, populate_self=False) context._data['self'] = context._data['local'] = self_ns if hasattr(template.module, '_mako_inherit'): @@ -746,7 +746,7 @@ def _populate_self_namespace(context, template, self_ns=None): return (template.callable_, context) def _render(template, callable_, args, data, as_unicode=False): - """create a Context and return the string + """create a Context and return the string output of the given template and template callable.""" if as_unicode: @@ -755,14 +755,14 @@ def _render(template, callable_, args, data, as_unicode=False): buf = util.StringIO() else: buf = util.FastEncodingBuffer( - unicode=as_unicode, - encoding=template.output_encoding, + unicode=as_unicode, + encoding=template.output_encoding, errors=template.encoding_errors) context = Context(buf, **data) context._outputting_as_unicode = as_unicode context._set_with_template(template) - - _render_context(template, callable_, context, *args, + + _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data)) return context._pop_buffer().getvalue() @@ -771,7 +771,7 @@ def _kwargs_for_callable(callable_, data): # for normal pages, **pageargs is usually present if argspec[2]: return data - + # for rendering defs from the top level, figure out the args namedargs = argspec[0] + [v for v in argspec[1:3] if v is not None] kwargs = {} @@ -787,10 +787,10 @@ def _kwargs_for_include(callable_, data, **kwargs): if arg != 'context' and arg in data and arg not in kwargs: kwargs[arg] = data[arg] return kwargs - + def _render_context(tmpl, callable_, context, *args, **kwargs): import mako.template as template - # create polymorphic 'self' namespace for this + # create polymorphic 'self' namespace for this # template with possibly updated context if not isinstance(tmpl, template.DefTemplate): # if main render method, call from the base of the inheritance stack @@ -800,7 +800,7 @@ def _render_context(tmpl, callable_, context, *args, **kwargs): # otherwise, call the actual rendering method specified (inherit, lclcontext) = _populate_self_namespace(context, tmpl.parent) _exec_template(callable_, context, args=args, kwargs=kwargs) - + def _exec_template(callable_, context, args=None, kwargs=None): """execute a rendering callable given the callable, a Context, and optional explicit arguments @@ -817,7 +817,7 @@ def _exec_template(callable_, context, args=None, kwargs=None): callable_(context, *args, **kwargs) except Exception, e: _render_error(template, context, e) - except: + except: e = sys.exc_info()[0] _render_error(template, context, e) else: @@ -836,6 +836,6 @@ def _render_error(template, context, error): context._buffer_stack[:] = [util.FastEncodingBuffer( error_template.output_encoding, error_template.encoding_errors)] - + context._set_with_template(error_template) error_template.render_context(context, error=error) |