Tornado update
This commit is contained in:
+20
-14
@@ -179,9 +179,8 @@ with ``{# ... #}``.
|
||||
``{% continue %}`` may be used inside the loop.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import, division, with_statement
|
||||
from __future__ import absolute_import, division, print_function, with_statement
|
||||
|
||||
import cStringIO
|
||||
import datetime
|
||||
import linecache
|
||||
import os.path
|
||||
@@ -191,7 +190,12 @@ import threading
|
||||
|
||||
from tornado import escape
|
||||
from tornado.log import app_log
|
||||
from tornado.util import bytes_type, ObjectDict
|
||||
from tornado.util import bytes_type, ObjectDict, exec_in, unicode_type
|
||||
|
||||
try:
|
||||
from cStringIO import StringIO # py2
|
||||
except ImportError:
|
||||
from io import StringIO # py3
|
||||
|
||||
_DEFAULT_AUTOESCAPE = "xhtml_escape"
|
||||
_UNSET = object()
|
||||
@@ -226,10 +230,12 @@ class Template(object):
|
||||
try:
|
||||
# Under python2.5, the fake filename used here must match
|
||||
# the module name used in __name__ below.
|
||||
# The dont_inherit flag prevents template.py's future imports
|
||||
# from being applied to the generated code.
|
||||
self.compiled = compile(
|
||||
escape.to_unicode(self.code),
|
||||
"%s.generated.py" % self.name.replace('.', '_'),
|
||||
"exec")
|
||||
"exec", dont_inherit=True)
|
||||
except Exception:
|
||||
formatted_code = _format_code(self.code).rstrip()
|
||||
app_log.error("%s code:\n%s", self.name, formatted_code)
|
||||
@@ -246,7 +252,7 @@ class Template(object):
|
||||
"linkify": escape.linkify,
|
||||
"datetime": datetime,
|
||||
"_utf8": escape.utf8, # for internal use
|
||||
"_string_types": (unicode, bytes_type),
|
||||
"_string_types": (unicode_type, bytes_type),
|
||||
# __name__ and __loader__ allow the traceback mechanism to find
|
||||
# the generated source code.
|
||||
"__name__": self.name.replace('.', '_'),
|
||||
@@ -254,7 +260,7 @@ class Template(object):
|
||||
}
|
||||
namespace.update(self.namespace)
|
||||
namespace.update(kwargs)
|
||||
exec self.compiled in namespace
|
||||
exec_in(self.compiled, namespace)
|
||||
execute = namespace["_execute"]
|
||||
# Clear the traceback module's cache of source data now that
|
||||
# we've generated a new template (mainly for this module's
|
||||
@@ -263,7 +269,7 @@ class Template(object):
|
||||
return execute()
|
||||
|
||||
def _generate_python(self, loader, compress_whitespace):
|
||||
buffer = cStringIO.StringIO()
|
||||
buffer = StringIO()
|
||||
try:
|
||||
# named_blocks maps from names to _NamedBlock objects
|
||||
named_blocks = {}
|
||||
@@ -346,8 +352,8 @@ class Loader(BaseLoader):
|
||||
|
||||
def resolve_path(self, name, parent_path=None):
|
||||
if parent_path and not parent_path.startswith("<") and \
|
||||
not parent_path.startswith("/") and \
|
||||
not name.startswith("/"):
|
||||
not parent_path.startswith("/") and \
|
||||
not name.startswith("/"):
|
||||
current_path = os.path.join(self.root, parent_path)
|
||||
file_dir = os.path.dirname(os.path.abspath(current_path))
|
||||
relative_path = os.path.abspath(os.path.join(file_dir, name))
|
||||
@@ -371,8 +377,8 @@ class DictLoader(BaseLoader):
|
||||
|
||||
def resolve_path(self, name, parent_path=None):
|
||||
if parent_path and not parent_path.startswith("<") and \
|
||||
not parent_path.startswith("/") and \
|
||||
not name.startswith("/"):
|
||||
not parent_path.startswith("/") and \
|
||||
not name.startswith("/"):
|
||||
file_dir = posixpath.dirname(parent_path)
|
||||
name = posixpath.normpath(posixpath.join(file_dir, name))
|
||||
return name
|
||||
@@ -620,7 +626,7 @@ class _CodeWriter(object):
|
||||
ancestors = ["%s:%d" % (tmpl.name, lineno)
|
||||
for (tmpl, lineno) in self.include_stack]
|
||||
line_comment += ' (via %s)' % ', '.join(reversed(ancestors))
|
||||
print >> self.file, " " * indent + line + line_comment
|
||||
print(" " * indent + line + line_comment, file=self.file)
|
||||
|
||||
|
||||
class _TemplateReader(object):
|
||||
@@ -708,7 +714,7 @@ def _parse(reader, template, in_block=None, in_loop=None):
|
||||
# innermost ones. This is useful when generating languages
|
||||
# like latex where curlies are also meaningful
|
||||
if (curly + 2 < reader.remaining() and
|
||||
reader[curly + 1] == '{' and reader[curly + 2] == '{'):
|
||||
reader[curly + 1] == '{' and reader[curly + 2] == '{'):
|
||||
curly += 1
|
||||
continue
|
||||
break
|
||||
@@ -775,7 +781,7 @@ def _parse(reader, template, in_block=None, in_loop=None):
|
||||
if allowed_parents is not None:
|
||||
if not in_block:
|
||||
raise ParseError("%s outside %s block" %
|
||||
(operator, allowed_parents))
|
||||
(operator, allowed_parents))
|
||||
if in_block not in allowed_parents:
|
||||
raise ParseError("%s block cannot be attached to %s block" % (operator, in_block))
|
||||
body.chunks.append(_IntermediateControlBlock(contents, line))
|
||||
|
||||
Reference in New Issue
Block a user