mirror of
https://github.com/rembo10/headphones.git
synced 2026-07-20 16:03:59 +01:00
Upgrade mako to 1.0.1
This commit is contained in:
+98
-83
@@ -1,5 +1,5 @@
|
||||
# mako/codegen.py
|
||||
# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
|
||||
# Copyright (C) 2006-2015 the Mako authors and contributors <see AUTHORS file>
|
||||
#
|
||||
# This module is part of Mako and is released under
|
||||
# the MIT License: http://www.opensource.org/licenses/mit-license.php
|
||||
@@ -14,7 +14,7 @@ from mako import util, ast, parsetree, filters, exceptions
|
||||
from mako import compat
|
||||
|
||||
|
||||
MAGIC_NUMBER = 9
|
||||
MAGIC_NUMBER = 10
|
||||
|
||||
# names which are hardwired into the
|
||||
# template and are not accessed via the
|
||||
@@ -99,7 +99,6 @@ class _GenerateRenderMethod(object):
|
||||
"""
|
||||
def __init__(self, printer, compiler, node):
|
||||
self.printer = printer
|
||||
self.last_source_line = -1
|
||||
self.compiler = compiler
|
||||
self.node = node
|
||||
self.identifier_stack = [None]
|
||||
@@ -146,6 +145,26 @@ class _GenerateRenderMethod(object):
|
||||
for node in defs:
|
||||
_GenerateRenderMethod(printer, compiler, node)
|
||||
|
||||
if not self.in_def:
|
||||
self.write_metadata_struct()
|
||||
|
||||
def write_metadata_struct(self):
|
||||
self.printer.source_map[self.printer.lineno] = \
|
||||
max(self.printer.source_map)
|
||||
struct = {
|
||||
"filename": self.compiler.filename,
|
||||
"uri": self.compiler.uri,
|
||||
"source_encoding": self.compiler.source_encoding,
|
||||
"line_map": self.printer.source_map,
|
||||
}
|
||||
self.printer.writelines(
|
||||
'"""',
|
||||
'__M_BEGIN_METADATA',
|
||||
compat.json.dumps(struct),
|
||||
'__M_END_METADATA\n'
|
||||
'"""'
|
||||
)
|
||||
|
||||
@property
|
||||
def identifiers(self):
|
||||
return self.identifier_stack[-1]
|
||||
@@ -187,7 +206,7 @@ class _GenerateRenderMethod(object):
|
||||
|
||||
# module-level names, python code
|
||||
if self.compiler.generate_magic_comment and \
|
||||
self.compiler.source_encoding:
|
||||
self.compiler.source_encoding:
|
||||
self.printer.writeline("# -*- coding:%s -*-" %
|
||||
self.compiler.source_encoding)
|
||||
|
||||
@@ -232,7 +251,7 @@ class _GenerateRenderMethod(object):
|
||||
[n.name for n in
|
||||
main_identifiers.topleveldefs.values()]
|
||||
)
|
||||
self.printer.write("\n\n")
|
||||
self.printer.write_blanks(2)
|
||||
|
||||
if len(module_code):
|
||||
self.write_module_code(module_code)
|
||||
@@ -255,8 +274,9 @@ class _GenerateRenderMethod(object):
|
||||
decorator = node.decorator
|
||||
if decorator:
|
||||
self.printer.writeline(
|
||||
"@runtime._decorate_toplevel(%s)" % decorator)
|
||||
"@runtime._decorate_toplevel(%s)" % decorator)
|
||||
|
||||
self.printer.start_source(node.lineno)
|
||||
self.printer.writelines(
|
||||
"def %s(%s):" % (name, ','.join(args)),
|
||||
# push new frame, assign current frame to __M_caller
|
||||
@@ -267,7 +287,7 @@ class _GenerateRenderMethod(object):
|
||||
self.printer.writeline("context._push_buffer()")
|
||||
|
||||
self.identifier_stack.append(
|
||||
self.compiler.identifiers.branch(self.node))
|
||||
self.compiler.identifiers.branch(self.node))
|
||||
if (not self.in_def or self.node.is_block) and '**pageargs' in args:
|
||||
self.identifier_stack[-1].argument_declared.add('pageargs')
|
||||
|
||||
@@ -288,7 +308,7 @@ class _GenerateRenderMethod(object):
|
||||
|
||||
self.write_def_finish(self.node, buffered, filtered, cached)
|
||||
self.printer.writeline(None)
|
||||
self.printer.write("\n\n")
|
||||
self.printer.write_blanks(2)
|
||||
if cached:
|
||||
self.write_cache_decorator(
|
||||
node, name,
|
||||
@@ -299,7 +319,7 @@ class _GenerateRenderMethod(object):
|
||||
"""write module-level template code, i.e. that which
|
||||
is enclosed in <%! %> tags in the template."""
|
||||
for n in module_code:
|
||||
self.write_source_comment(n)
|
||||
self.printer.start_source(n.lineno)
|
||||
self.printer.write_indented_block(n.text)
|
||||
|
||||
def write_inherit(self, node):
|
||||
@@ -309,9 +329,9 @@ class _GenerateRenderMethod(object):
|
||||
"def _mako_inherit(template, context):",
|
||||
"_mako_generate_namespaces(context)",
|
||||
"return runtime._inherit_from(context, %s, _template_uri)" %
|
||||
(node.parsed_attributes['file']),
|
||||
(node.parsed_attributes['file']),
|
||||
None
|
||||
)
|
||||
)
|
||||
|
||||
def write_namespaces(self, namespaces):
|
||||
"""write the module-level namespace-generating callable."""
|
||||
@@ -323,14 +343,14 @@ class _GenerateRenderMethod(object):
|
||||
"_mako_generate_namespaces(context)",
|
||||
"return context.namespaces[(__name__, name)]",
|
||||
None, None
|
||||
)
|
||||
)
|
||||
self.printer.writeline("def _mako_generate_namespaces(context):")
|
||||
|
||||
|
||||
for node in namespaces.values():
|
||||
if 'import' in node.attributes:
|
||||
self.compiler.has_ns_imports = True
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
if len(node.nodes):
|
||||
self.printer.writeline("def make_namespace():")
|
||||
export = []
|
||||
@@ -369,9 +389,9 @@ class _GenerateRenderMethod(object):
|
||||
" templateuri=%s, callables=%s, "
|
||||
" calling_uri=_template_uri)" %
|
||||
(
|
||||
node.name,
|
||||
node.parsed_attributes.get('file', 'None'),
|
||||
callable_name,
|
||||
node.name,
|
||||
node.parsed_attributes.get('file', 'None'),
|
||||
callable_name,
|
||||
)
|
||||
)
|
||||
elif 'module' in node.parsed_attributes:
|
||||
@@ -381,9 +401,10 @@ class _GenerateRenderMethod(object):
|
||||
" callables=%s, calling_uri=_template_uri,"
|
||||
" module=%s)" %
|
||||
(
|
||||
node.name,
|
||||
callable_name,
|
||||
node.parsed_attributes.get('module', 'None')
|
||||
node.name,
|
||||
callable_name,
|
||||
node.parsed_attributes.get(
|
||||
'module', 'None')
|
||||
)
|
||||
)
|
||||
else:
|
||||
@@ -400,8 +421,8 @@ class _GenerateRenderMethod(object):
|
||||
self.printer.writeline("context['self'].%s = ns" % (node.name))
|
||||
|
||||
self.printer.writeline(
|
||||
"context.namespaces[(__name__, %s)] = ns" % repr(node.name))
|
||||
self.printer.write("\n")
|
||||
"context.namespaces[(__name__, %s)] = ns" % repr(node.name))
|
||||
self.printer.write_blanks(1)
|
||||
if not len(namespaces):
|
||||
self.printer.writeline("pass")
|
||||
self.printer.writeline(None)
|
||||
@@ -466,7 +487,7 @@ class _GenerateRenderMethod(object):
|
||||
for ident, ns in self.compiler.namespaces.items():
|
||||
if 'import' in ns.attributes:
|
||||
self.printer.writeline(
|
||||
"_mako_get_namespace(context, %r)."\
|
||||
"_mako_get_namespace(context, %r)."
|
||||
"_populate(_import_ns, %r)" %
|
||||
(
|
||||
ident,
|
||||
@@ -532,18 +553,11 @@ class _GenerateRenderMethod(object):
|
||||
|
||||
self.printer.writeline("__M_writer = context.writer()")
|
||||
|
||||
def write_source_comment(self, node):
|
||||
"""write a source comment containing the line number of the
|
||||
corresponding template line."""
|
||||
if self.last_source_line != node.lineno:
|
||||
self.printer.writeline("# SOURCE LINE %d" % node.lineno)
|
||||
self.last_source_line = node.lineno
|
||||
|
||||
def write_def_decl(self, node, identifiers):
|
||||
"""write a locally-available callable referencing a top-level def"""
|
||||
funcname = node.funcname
|
||||
namedecls = node.get_argument_expressions()
|
||||
nameargs = node.get_argument_expressions(include_defaults=False)
|
||||
nameargs = node.get_argument_expressions(as_call=True)
|
||||
|
||||
if not self.in_def and (
|
||||
len(self.identifiers.locally_assigned) > 0 or
|
||||
@@ -553,7 +567,7 @@ class _GenerateRenderMethod(object):
|
||||
nameargs.insert(0, 'context')
|
||||
self.printer.writeline("def %s(%s):" % (funcname, ",".join(namedecls)))
|
||||
self.printer.writeline(
|
||||
"return render_%s(%s)" % (funcname, ",".join(nameargs)))
|
||||
"return render_%s(%s)" % (funcname, ",".join(nameargs)))
|
||||
self.printer.writeline(None)
|
||||
|
||||
def write_inline_def(self, node, identifiers, nested):
|
||||
@@ -564,9 +578,9 @@ class _GenerateRenderMethod(object):
|
||||
decorator = node.decorator
|
||||
if decorator:
|
||||
self.printer.writeline(
|
||||
"@runtime._decorate_inline(context, %s)" % decorator)
|
||||
"@runtime._decorate_inline(context, %s)" % decorator)
|
||||
self.printer.writeline(
|
||||
"def %s(%s):" % (node.funcname, ",".join(namedecls)))
|
||||
"def %s(%s):" % (node.funcname, ",".join(namedecls)))
|
||||
filtered = len(node.filter_args.args) > 0
|
||||
buffered = eval(node.attributes.get('buffered', 'False'))
|
||||
cached = eval(node.attributes.get('cached', 'False'))
|
||||
@@ -574,11 +588,11 @@ class _GenerateRenderMethod(object):
|
||||
# push new frame, assign current frame to __M_caller
|
||||
"__M_caller = context.caller_stack._push_frame()",
|
||||
"try:"
|
||||
)
|
||||
)
|
||||
if buffered or filtered or cached:
|
||||
self.printer.writelines(
|
||||
"context._push_buffer()",
|
||||
)
|
||||
)
|
||||
|
||||
identifiers = identifiers.branch(node, nested=nested)
|
||||
|
||||
@@ -627,8 +641,8 @@ class _GenerateRenderMethod(object):
|
||||
)
|
||||
else:
|
||||
self.printer.writelines(
|
||||
"finally:",
|
||||
"__M_buf, __M_writer = context._pop_buffer_and_writer()"
|
||||
"finally:",
|
||||
"__M_buf, __M_writer = context._pop_buffer_and_writer()"
|
||||
)
|
||||
|
||||
if callstack:
|
||||
@@ -684,7 +698,7 @@ class _GenerateRenderMethod(object):
|
||||
|
||||
# form "arg1, arg2, arg3=arg3, arg4=arg4", etc.
|
||||
pass_args = [
|
||||
'=' in a and "%s=%s" % ((a.split('=')[0],)*2) or a
|
||||
"%s=%s" % ((a.split('=')[0],) * 2) if '=' in a else a
|
||||
for a in args
|
||||
]
|
||||
|
||||
@@ -696,11 +710,11 @@ class _GenerateRenderMethod(object):
|
||||
if buffered:
|
||||
s = "context.get('local')."\
|
||||
"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
|
||||
"%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
|
||||
)
|
||||
# apply buffer_filters
|
||||
s = self.create_filter_callable(self.compiler.buffer_filters, s,
|
||||
@@ -709,12 +723,13 @@ class _GenerateRenderMethod(object):
|
||||
else:
|
||||
self.printer.writelines(
|
||||
"__M_writer(context.get('local')."
|
||||
"cache._ctx_get_or_create("\
|
||||
"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)
|
||||
(
|
||||
cachekey, name, ','.join(pass_args),
|
||||
''.join(["%s=%s, " % (k, v)
|
||||
for k, v in cache_args.items()]),
|
||||
name,
|
||||
name,
|
||||
),
|
||||
"return ''",
|
||||
None
|
||||
@@ -745,18 +760,17 @@ class _GenerateRenderMethod(object):
|
||||
continue
|
||||
m = re.match(r'(.+?)(\(.*\))', e)
|
||||
if m:
|
||||
(ident, fargs) = m.group(1,2)
|
||||
ident, fargs = m.group(1, 2)
|
||||
f = locate_encode(ident)
|
||||
e = f + fargs
|
||||
else:
|
||||
x = e
|
||||
e = locate_encode(e)
|
||||
assert e is not None
|
||||
target = "%s(%s)" % (e, target)
|
||||
return target
|
||||
|
||||
def visitExpression(self, node):
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
if len(node.escapes) or \
|
||||
(
|
||||
self.compiler.pagetag is not None and
|
||||
@@ -778,7 +792,7 @@ class _GenerateRenderMethod(object):
|
||||
self.printer.writeline("loop = __M_loop._exit()")
|
||||
self.printer.writeline(None)
|
||||
else:
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
if self.compiler.enable_loop and node.keyword == 'for':
|
||||
text = mangle_mako_loop(node, self.printer)
|
||||
else:
|
||||
@@ -800,7 +814,7 @@ class _GenerateRenderMethod(object):
|
||||
self.printer.writeline("pass")
|
||||
|
||||
def visitText(self, node):
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
self.printer.writeline("__M_writer(%s)" % repr(node.content))
|
||||
|
||||
def visitTextTag(self, node):
|
||||
@@ -822,11 +836,11 @@ class _GenerateRenderMethod(object):
|
||||
"__M_buf.getvalue()",
|
||||
False),
|
||||
None
|
||||
)
|
||||
)
|
||||
|
||||
def visitCode(self, node):
|
||||
if not node.ismodule:
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
self.printer.write_indented_block(node.text)
|
||||
|
||||
if not self.in_def and len(self.identifiers.locally_assigned) > 0:
|
||||
@@ -835,20 +849,20 @@ class _GenerateRenderMethod(object):
|
||||
# which is used for def calls within the same template,
|
||||
# to simulate "enclosing scope"
|
||||
self.printer.writeline(
|
||||
'__M_locals_builtin_stored = __M_locals_builtin()')
|
||||
'__M_locals_builtin_stored = __M_locals_builtin()')
|
||||
self.printer.writeline(
|
||||
'__M_locals.update(__M_dict_builtin([(__M_key,'
|
||||
' __M_locals_builtin_stored[__M_key]) for __M_key in'
|
||||
' [%s] if __M_key in __M_locals_builtin_stored]))' %
|
||||
','.join([repr(x) for x in node.declared_identifiers()]))
|
||||
'__M_locals.update(__M_dict_builtin([(__M_key,'
|
||||
' __M_locals_builtin_stored[__M_key]) for __M_key in'
|
||||
' [%s] if __M_key in __M_locals_builtin_stored]))' %
|
||||
','.join([repr(x) for x in node.declared_identifiers()]))
|
||||
|
||||
def visitIncludeTag(self, node):
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
args = node.attributes.get('args')
|
||||
if args:
|
||||
self.printer.writeline(
|
||||
"runtime._include_file(context, %s, _template_uri, %s)" %
|
||||
(node.parsed_attributes['file'], args))
|
||||
"runtime._include_file(context, %s, _template_uri, %s)" %
|
||||
(node.parsed_attributes['file'], args))
|
||||
else:
|
||||
self.printer.writeline(
|
||||
"runtime._include_file(context, %s, _template_uri)" %
|
||||
@@ -864,7 +878,7 @@ class _GenerateRenderMethod(object):
|
||||
if node.is_anonymous:
|
||||
self.printer.writeline("%s()" % node.funcname)
|
||||
else:
|
||||
nameargs = node.get_argument_expressions(include_defaults=False)
|
||||
nameargs = node.get_argument_expressions(as_call=True)
|
||||
nameargs += ['**pageargs']
|
||||
self.printer.writeline("if 'parent' not in context._data or "
|
||||
"not hasattr(context._data['parent'], '%s'):"
|
||||
@@ -941,9 +955,9 @@ class _GenerateRenderMethod(object):
|
||||
# push on caller for nested call
|
||||
"context.caller_stack.nextcaller = "
|
||||
"runtime.Namespace('caller', context, "
|
||||
"callables=ccall(__M_caller))",
|
||||
"callables=ccall(__M_caller))",
|
||||
"try:")
|
||||
self.write_source_comment(node)
|
||||
self.printer.start_source(node.lineno)
|
||||
self.printer.writelines(
|
||||
"__M_writer(%s)" % self.create_filter_callable(
|
||||
[], node.expression, True),
|
||||
@@ -966,9 +980,9 @@ class _Identifiers(object):
|
||||
# things that have already been declared
|
||||
# in an enclosing namespace (i.e. names we can just use)
|
||||
self.declared = set(parent.declared).\
|
||||
union([c.name for c in parent.closuredefs.values()]).\
|
||||
union(parent.locally_declared).\
|
||||
union(parent.argument_declared)
|
||||
union([c.name for c in parent.closuredefs.values()]).\
|
||||
union(parent.locally_declared).\
|
||||
union(parent.argument_declared)
|
||||
|
||||
# if these identifiers correspond to a "nested"
|
||||
# scope, it means whatever the parent identifiers
|
||||
@@ -1012,7 +1026,7 @@ class _Identifiers(object):
|
||||
node.accept_visitor(self)
|
||||
|
||||
illegal_names = self.compiler.reserved_names.intersection(
|
||||
self.locally_declared)
|
||||
self.locally_declared)
|
||||
if illegal_names:
|
||||
raise exceptions.NameConflictError(
|
||||
"Reserved words declared in template: %s" %
|
||||
@@ -1047,7 +1061,7 @@ class _Identifiers(object):
|
||||
|
||||
for ident in node.undeclared_identifiers():
|
||||
if ident != 'context' and\
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
self.undeclared.add(ident)
|
||||
for ident in node.declared_identifiers():
|
||||
self.locally_declared.add(ident)
|
||||
@@ -1067,7 +1081,7 @@ class _Identifiers(object):
|
||||
if not node.ismodule:
|
||||
self.check_declared(node)
|
||||
self.locally_assigned = self.locally_assigned.union(
|
||||
node.declared_identifiers())
|
||||
node.declared_identifiers())
|
||||
|
||||
def visitNamespaceTag(self, node):
|
||||
# only traverse into the sub-elements of a
|
||||
@@ -1095,8 +1109,8 @@ class _Identifiers(object):
|
||||
self._check_name_exists(self.closuredefs, node)
|
||||
|
||||
for ident in node.undeclared_identifiers():
|
||||
if ident != 'context' and\
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
if ident != 'context' and \
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
self.undeclared.add(ident)
|
||||
|
||||
# visit defs only one level deep
|
||||
@@ -1108,8 +1122,7 @@ class _Identifiers(object):
|
||||
n.accept_visitor(self)
|
||||
|
||||
def visitBlockTag(self, node):
|
||||
if node is not self.node and \
|
||||
not node.is_anonymous:
|
||||
if node is not self.node and not node.is_anonymous:
|
||||
|
||||
if isinstance(self.node, parsetree.DefTag):
|
||||
raise exceptions.CompileException(
|
||||
@@ -1123,7 +1136,7 @@ class _Identifiers(object):
|
||||
|
||||
for ident in node.undeclared_identifiers():
|
||||
if ident != 'context' and \
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
self.undeclared.add(ident)
|
||||
|
||||
if not node.is_anonymous:
|
||||
@@ -1139,7 +1152,7 @@ class _Identifiers(object):
|
||||
def visitTextTag(self, node):
|
||||
for ident in node.undeclared_identifiers():
|
||||
if ident != 'context' and \
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
self.undeclared.add(ident)
|
||||
|
||||
def visitIncludeTag(self, node):
|
||||
@@ -1156,8 +1169,9 @@ class _Identifiers(object):
|
||||
def visitCallTag(self, node):
|
||||
if node is self.node:
|
||||
for ident in node.undeclared_identifiers():
|
||||
if ident != 'context' and\
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
if ident != 'context' and \
|
||||
ident not in self.declared.union(
|
||||
self.locally_declared):
|
||||
self.undeclared.add(ident)
|
||||
for ident in node.declared_identifiers():
|
||||
self.argument_declared.add(ident)
|
||||
@@ -1165,15 +1179,16 @@ class _Identifiers(object):
|
||||
n.accept_visitor(self)
|
||||
else:
|
||||
for ident in node.undeclared_identifiers():
|
||||
if ident != 'context' and\
|
||||
ident not in self.declared.union(self.locally_declared):
|
||||
if ident != 'context' and \
|
||||
ident not in self.declared.union(
|
||||
self.locally_declared):
|
||||
self.undeclared.add(ident)
|
||||
|
||||
|
||||
_FOR_LOOP = re.compile(
|
||||
r'^for\s+((?:\(?)\s*[A-Za-z_][A-Za-z_0-9]*'
|
||||
r'(?:\s*,\s*(?:[A-Za-z_][A-Za-z0-9_]*),??)*\s*(?:\)?))\s+in\s+(.*):'
|
||||
)
|
||||
)
|
||||
|
||||
def mangle_mako_loop(node, printer):
|
||||
"""converts a for loop into a context manager wrapped around a for loop
|
||||
@@ -1189,7 +1204,7 @@ def mangle_mako_loop(node, printer):
|
||||
'loop = __M_loop._enter(%s)' % match.group(2),
|
||||
'try:'
|
||||
#'with __M_loop(%s) as loop:' % match.group(2)
|
||||
)
|
||||
)
|
||||
text = 'for %s in loop:' % match.group(1)
|
||||
else:
|
||||
raise SyntaxError("Couldn't apply loop context: %s" % node.text)
|
||||
|
||||
Reference in New Issue
Block a user