aboutsummaryrefslogtreecommitdiffstats
path: root/mako/runtime.py
diff options
context:
space:
mode:
Diffstat (limited to 'mako/runtime.py')
-rw-r--r--mako/runtime.py164
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)