Index: third_party/jinja2/environment.py |
diff --git a/third_party/jinja2/environment.py b/third_party/jinja2/environment.py |
index 45fabada2eb238504e1c0ccda6e42fd9cf2e707e..8b2572bb8c176ea89c9ecdf15466642be6ab9e6f 100644 |
--- a/third_party/jinja2/environment.py |
+++ b/third_party/jinja2/environment.py |
@@ -21,8 +21,8 @@ from jinja2.lexer import get_lexer, TokenStream |
from jinja2.parser import Parser |
from jinja2.nodes import EvalContext |
from jinja2.optimizer import optimize |
-from jinja2.compiler import generate |
-from jinja2.runtime import Undefined, new_context |
+from jinja2.compiler import generate, CodeGenerator |
+from jinja2.runtime import Undefined, new_context, Context |
from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \ |
TemplatesNotFound, TemplateRuntimeError |
from jinja2.utils import import_string, LRUCache, Markup, missing, \ |
@@ -90,13 +90,13 @@ def load_extensions(environment, extensions): |
def _environment_sanity_check(environment): |
"""Perform a sanity check on the environment.""" |
assert issubclass(environment.undefined, Undefined), 'undefined must ' \ |
- 'be a subclass of undefined because filters depend on it.' |
+ 'be a subclass of undefined because filters depend on it.' |
assert environment.block_start_string != \ |
- environment.variable_start_string != \ |
- environment.comment_start_string, 'block, variable and comment ' \ |
- 'start strings must be different' |
+ environment.variable_start_string != \ |
+ environment.comment_start_string, 'block, variable and comment ' \ |
+ 'start strings must be different' |
assert environment.newline_sequence in ('\r', '\r\n', '\n'), \ |
- 'newline_sequence set to unknown line ending string.' |
+ 'newline_sequence set to unknown line ending string.' |
return environment |
@@ -108,16 +108,16 @@ class Environment(object): |
Modifications on environments after the first template was loaded |
will lead to surprising effects and undefined behavior. |
- Here the possible initialization parameters: |
+ Here are the possible initialization parameters: |
`block_start_string` |
- The string marking the begin of a block. Defaults to ``'{%'``. |
+ The string marking the beginning of a block. Defaults to ``'{%'``. |
`block_end_string` |
The string marking the end of a block. Defaults to ``'%}'``. |
`variable_start_string` |
- The string marking the begin of a print statement. |
+ The string marking the beginning of a print statement. |
Defaults to ``'{{'``. |
`variable_end_string` |
@@ -125,7 +125,7 @@ class Environment(object): |
``'}}'``. |
`comment_start_string` |
- The string marking the begin of a comment. Defaults to ``'{#'``. |
+ The string marking the beginning of a comment. Defaults to ``'{#'``. |
`comment_end_string` |
The string marking the end of a comment. Defaults to ``'#}'``. |
@@ -136,7 +136,7 @@ class Environment(object): |
`line_comment_prefix` |
If given and a string, this will be used as prefix for line based |
- based comments. See also :ref:`line-statements`. |
+ comments. See also :ref:`line-statements`. |
.. versionadded:: 2.2 |
@@ -180,7 +180,7 @@ class Environment(object): |
`autoescape` |
If set to true the XML/HTML autoescaping feature is enabled by |
- default. For more details about auto escaping see |
+ default. For more details about autoescaping see |
:class:`~jinja2.utils.Markup`. As of Jinja 2.4 this can also |
be a callable that is passed the template name and has to |
return `True` or `False` depending on autoescape should be |
@@ -193,12 +193,15 @@ class Environment(object): |
The template loader for this environment. |
`cache_size` |
- The size of the cache. Per default this is ``50`` which means |
- that if more than 50 templates are loaded the loader will clean |
+ The size of the cache. Per default this is ``400`` which means |
+ that if more than 400 templates are loaded the loader will clean |
out the least recently used template. If the cache size is set to |
``0`` templates are recompiled all the time, if the cache size is |
``-1`` the cache will not be cleaned. |
+ .. versionchanged:: 2.8 |
+ The cache size was increased to 400 from a low 50. |
+ |
`auto_reload` |
Some loaders load templates from locations where the template |
sources may change (ie: file system or database). If |
@@ -235,6 +238,14 @@ class Environment(object): |
exception_handler = None |
exception_formatter = None |
+ #: the class that is used for code generation. See |
+ #: :class:`~jinja2.compiler.CodeGenerator` for more information. |
+ code_generator_class = CodeGenerator |
+ |
+ #: the context class thatis used for templates. See |
+ #: :class:`~jinja2.runtime.Context` for more information. |
+ context_class = Context |
+ |
def __init__(self, |
block_start_string=BLOCK_START_STRING, |
block_end_string=BLOCK_END_STRING, |
@@ -254,7 +265,7 @@ class Environment(object): |
finalize=None, |
autoescape=False, |
loader=None, |
- cache_size=50, |
+ cache_size=400, |
auto_reload=True, |
bytecode_cache=None): |
# !!Important notice!! |
@@ -330,7 +341,7 @@ class Environment(object): |
loader=missing, cache_size=missing, auto_reload=missing, |
bytecode_cache=missing): |
"""Create a new overlay environment that shares all the data with the |
- current environment except of cache and the overridden attributes. |
+ current environment except for cache and the overridden attributes. |
Extensions cannot be removed for an overlayed environment. An overlayed |
environment automatically gets all the extensions of the environment it |
is linked to plus optional extra extensions. |
@@ -551,7 +562,7 @@ class Environment(object): |
return self._compile(source, filename) |
except TemplateSyntaxError: |
exc_info = sys.exc_info() |
- self.handle_exception(exc_info, source_hint=source) |
+ self.handle_exception(exc_info, source_hint=source_hint) |
def compile_expression(self, source, undefined_to_none=True): |
"""A handy helper method that returns a callable that accepts keyword |
@@ -603,8 +614,8 @@ class Environment(object): |
ignore_errors=True, py_compile=False): |
"""Finds all the templates the loader can find, compiles them |
and stores them in `target`. If `zip` is `None`, instead of in a |
- zipfile, the templates will be will be stored in a directory. |
- By default a deflate zip algorithm is used, to switch to |
+ zipfile, the templates will be stored in a directory. |
+ By default a deflate zip algorithm is used. To switch to |
the stored algorithm, `zip` can be set to ``'stored'``. |
`extensions` and `filter_func` are passed to :meth:`list_templates`. |
@@ -634,7 +645,8 @@ class Environment(object): |
warn(Warning('py_compile has no effect on pypy or Python 3')) |
py_compile = False |
else: |
- import imp, marshal |
+ import imp |
+ import marshal |
py_header = imp.get_magic() + \ |
u'\xff\xff\xff\xff'.encode('iso-8859-15') |
@@ -716,7 +728,7 @@ class Environment(object): |
filter_func = lambda x: '.' in x and \ |
x.rsplit('.', 1)[1] in extensions |
if filter_func is not None: |
- x = ifilter(filter_func, x) |
+ x = list(ifilter(filter_func, x)) |
return x |
def handle_exception(self, exc_info=None, rendered=False, source_hint=None): |
@@ -757,14 +769,23 @@ class Environment(object): |
def _load_template(self, name, globals): |
if self.loader is None: |
raise TypeError('no loader for this environment specified') |
+ try: |
+ # use abs path for cache key |
+ cache_key = self.loader.get_source(self, name)[1] |
+ except RuntimeError: |
+ # if loader does not implement get_source() |
+ cache_key = None |
+ # if template is not file, use name for cache key |
+ if cache_key is None: |
+ cache_key = name |
if self.cache is not None: |
- template = self.cache.get(name) |
- if template is not None and (not self.auto_reload or \ |
+ template = self.cache.get(cache_key) |
+ if template is not None and (not self.auto_reload or |
template.is_up_to_date): |
return template |
template = self.loader.load(self, name, globals) |
if self.cache is not None: |
- self.cache[name] = template |
+ self.cache[cache_key] = template |
return template |
@internalcode |
@@ -866,13 +887,12 @@ class Template(object): |
and compatible settings. |
>>> template = Template('Hello {{ name }}!') |
- >>> template.render(name='John Doe') |
- u'Hello John Doe!' |
- |
+ >>> template.render(name='John Doe') == u'Hello John Doe!' |
+ True |
>>> stream = template.stream(name='John Doe') |
- >>> stream.next() |
- u'Hello John Doe!' |
- >>> stream.next() |
+ >>> next(stream) == u'Hello John Doe!' |
+ True |
+ >>> next(stream) |
Traceback (most recent call last): |
... |
StopIteration |
@@ -1019,10 +1039,10 @@ class Template(object): |
exported template variables from the Python layer: |
>>> t = Template('{% macro foo() %}42{% endmacro %}23') |
- >>> unicode(t.module) |
- u'23' |
- >>> t.module.foo() |
- u'42' |
+ >>> str(t.module) |
+ '23' |
+ >>> t.module.foo() == u'42' |
+ True |
""" |
if self._module is not None: |
return self._module |
@@ -1131,7 +1151,9 @@ class TemplateStream(object): |
""" |
close = False |
if isinstance(fp, string_types): |
- fp = open(fp, encoding is None and 'w' or 'wb') |
+ if encoding is None: |
+ encoding = 'utf-8' |
+ fp = open(fp, 'wb') |
close = True |
try: |
if encoding is not None: |