from jinja2.runtime import concat
from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError
from jinja2.utils import contextfunction, import_string, Markup
+from jinja2._compat import next
import six
def parse(self, parser):
"""Parse a translatable tag."""
- lineno = six.advance_iterator(parser.stream).lineno
+ lineno = next(parser.stream).lineno
num_called_num = False
# find all the variables referenced. Additionally a variable can be
# expressions
if parser.stream.current.type == 'assign':
- six.advance_iterator(parser.stream)
+ next(parser.stream)
variables[name.value] = var = parser.parse_expression()
else:
variables[name.value] = var = nodes.Name(name.value, 'load')
# if we have a pluralize block, we parse that too
if parser.stream.current.test('name:pluralize'):
have_plural = True
- six.advance_iterator(parser.stream)
+ next(parser.stream)
if parser.stream.current.type != 'block_end':
name = parser.stream.expect('name')
if name.value not in variables:
num_called_num = name.value == 'num'
parser.stream.expect('block_end')
plural_names, plural = self._parse_block(parser, False)
- six.advance_iterator(parser.stream)
+ next(parser.stream)
referenced.update(plural_names)
else:
- six.advance_iterator(parser.stream)
+ next(parser.stream)
# register free names as simple name expressions
for var in referenced:
while 1:
if parser.stream.current.type == 'data':
buf.append(parser.stream.current.value.replace('%', '%%'))
- six.advance_iterator(parser.stream)
+ next(parser.stream)
elif parser.stream.current.type == 'variable_begin':
- six.advance_iterator(parser.stream)
+ next(parser.stream)
name = parser.stream.expect('name').value
referenced.append(name)
buf.append('%%(%s)s' % name)
parser.stream.expect('variable_end')
elif parser.stream.current.type == 'block_begin':
- six.advance_iterator(parser.stream)
+ next(parser.stream)
if parser.stream.current.test('name:endtrans'):
break
elif parser.stream.current.test('name:pluralize'):
tags = set(['do'])
def parse(self, parser):
- node = nodes.ExprStmt(lineno=six.advance_iterator(parser.stream).lineno)
+ node = nodes.ExprStmt(lineno=next(parser.stream).lineno)
node.node = parser.parse_tuple()
return node
tags = set(['break', 'continue'])
def parse(self, parser):
- token = six.advance_iterator(parser.stream)
+ token = next(parser.stream)
if token.value == 'break':
return nodes.Break(lineno=token.lineno)
return nodes.Continue(lineno=token.lineno)
tags = set(['with'])
def parse(self, parser):
- node = nodes.Scope(lineno=six.advance_iterator(parser.stream).lineno)
+ node = nodes.Scope(lineno=next(parser.stream).lineno)
assignments = []
while parser.stream.current.type != 'block_end':
lineno = parser.stream.current.lineno
tags = set(['autoescape'])
def parse(self, parser):
- node = nodes.ScopedEvalContextModifier(lineno=six.advance_iterator(parser.stream).lineno)
+ node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno)
node.options = [
nodes.Keyword('autoescape', parser.parse_expression())
]
from jinja2 import nodes
from jinja2.exceptions import TemplateSyntaxError, TemplateAssertionError
from jinja2.lexer import describe_token, describe_token_expr
-import six
-from six.moves import map
+from jinja2._compat import next, imap
#: statements that callinto
def _fail_ut_eof(self, name, end_token_stack, lineno):
expected = []
for exprs in end_token_stack:
- expected.extend(map(describe_token_expr, exprs))
+ expected.extend(imap(describe_token_expr, exprs))
if end_token_stack:
currently_looking = ' or '.join(
"'%s'" % describe_token_expr(expr)
self.fail_eof(end_tokens)
if drop_needle:
- six.advance_iterator(self.stream)
+ next(self.stream)
return result
def parse_set(self):
"""Parse an assign statement."""
- lineno = six.advance_iterator(self.stream).lineno
+ lineno = next(self.stream).lineno
target = self.parse_assign_target()
self.stream.expect('assign')
expr = self.parse_tuple()
test = self.parse_expression()
recursive = self.stream.skip_if('name:recursive')
body = self.parse_statements(('name:endfor', 'name:else'))
- if six.advance_iterator(self.stream).value == 'endfor':
+ if next(self.stream).value == 'endfor':
else_ = []
else:
else_ = self.parse_statements(('name:endfor',), drop_needle=True)
node.test = self.parse_tuple(with_condexpr=False)
node.body = self.parse_statements(('name:elif', 'name:else',
'name:endif'))
- token = six.advance_iterator(self.stream)
+ token = next(self.stream)
if token.test('name:elif'):
new_node = nodes.If(lineno=self.stream.current.lineno)
node.else_ = [new_node]
return result
def parse_block(self):
- node = nodes.Block(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.Block(lineno=next(self.stream).lineno)
node.name = self.stream.expect('name').value
node.scoped = self.stream.skip_if('name:scoped')
return node
def parse_extends(self):
- node = nodes.Extends(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.Extends(lineno=next(self.stream).lineno)
node.template = self.parse_expression()
return node
def parse_import_context(self, node, default):
if self.stream.current.test_any('name:with', 'name:without') and \
self.stream.look().test('name:context'):
- node.with_context = six.advance_iterator(self.stream).value == 'with'
+ node.with_context = next(self.stream).value == 'with'
self.stream.skip()
else:
node.with_context = default
return node
def parse_include(self):
- node = nodes.Include(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.Include(lineno=next(self.stream).lineno)
node.template = self.parse_expression()
if self.stream.current.test('name:ignore') and \
self.stream.look().test('name:missing'):
return self.parse_import_context(node, True)
def parse_import(self):
- node = nodes.Import(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.Import(lineno=next(self.stream).lineno)
node.template = self.parse_expression()
self.stream.expect('name:as')
node.target = self.parse_assign_target(name_only=True).name
return self.parse_import_context(node, False)
def parse_from(self):
- node = nodes.FromImport(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.FromImport(lineno=next(self.stream).lineno)
node.template = self.parse_expression()
self.stream.expect('name:import')
node.names = []
def parse_context():
if self.stream.current.value in ('with', 'without') and \
self.stream.look().test('name:context'):
- node.with_context = six.advance_iterator(self.stream).value == 'with'
+ node.with_context = next(self.stream).value == 'with'
self.stream.skip()
return True
return False
self.stream.expect('rparen')
def parse_call_block(self):
- node = nodes.CallBlock(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.CallBlock(lineno=next(self.stream).lineno)
if self.stream.current.type == 'lparen':
self.parse_signature(node)
else:
return node
def parse_filter_block(self):
- node = nodes.FilterBlock(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.FilterBlock(lineno=next(self.stream).lineno)
node.filter = self.parse_filter(None, start_inline=True)
node.body = self.parse_statements(('name:endfilter',),
drop_needle=True)
return node
def parse_macro(self):
- node = nodes.Macro(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.Macro(lineno=next(self.stream).lineno)
node.name = self.parse_assign_target(name_only=True).name
self.parse_signature(node)
node.body = self.parse_statements(('name:endmacro',),
return node
def parse_print(self):
- node = nodes.Output(lineno=six.advance_iterator(self.stream).lineno)
+ node = nodes.Output(lineno=next(self.stream).lineno)
node.nodes = []
while self.stream.current.type != 'block_end':
if node.nodes:
def parse_not(self):
if self.stream.current.test('name:not'):
- lineno = six.advance_iterator(self.stream).lineno
+ lineno = next(self.stream).lineno
return nodes.Not(self.parse_not(), lineno=lineno)
return self.parse_compare()
while 1:
token_type = self.stream.current.type
if token_type in _compare_operators:
- six.advance_iterator(self.stream)
+ next(self.stream)
ops.append(nodes.Operand(token_type, self.parse_add()))
elif self.stream.skip_if('name:in'):
ops.append(nodes.Operand('in', self.parse_add()))
lineno = self.stream.current.lineno
left = self.parse_sub()
while self.stream.current.type == 'add':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_sub()
left = nodes.Add(left, right, lineno=lineno)
lineno = self.stream.current.lineno
lineno = self.stream.current.lineno
left = self.parse_concat()
while self.stream.current.type == 'sub':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_concat()
left = nodes.Sub(left, right, lineno=lineno)
lineno = self.stream.current.lineno
lineno = self.stream.current.lineno
args = [self.parse_mul()]
while self.stream.current.type == 'tilde':
- six.advance_iterator(self.stream)
+ next(self.stream)
args.append(self.parse_mul())
if len(args) == 1:
return args[0]
lineno = self.stream.current.lineno
left = self.parse_div()
while self.stream.current.type == 'mul':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_div()
left = nodes.Mul(left, right, lineno=lineno)
lineno = self.stream.current.lineno
lineno = self.stream.current.lineno
left = self.parse_floordiv()
while self.stream.current.type == 'div':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_floordiv()
left = nodes.Div(left, right, lineno=lineno)
lineno = self.stream.current.lineno
lineno = self.stream.current.lineno
left = self.parse_mod()
while self.stream.current.type == 'floordiv':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_mod()
left = nodes.FloorDiv(left, right, lineno=lineno)
lineno = self.stream.current.lineno
lineno = self.stream.current.lineno
left = self.parse_pow()
while self.stream.current.type == 'mod':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_pow()
left = nodes.Mod(left, right, lineno=lineno)
lineno = self.stream.current.lineno
lineno = self.stream.current.lineno
left = self.parse_unary()
while self.stream.current.type == 'pow':
- six.advance_iterator(self.stream)
+ next(self.stream)
right = self.parse_unary()
left = nodes.Pow(left, right, lineno=lineno)
lineno = self.stream.current.lineno
token_type = self.stream.current.type
lineno = self.stream.current.lineno
if token_type == 'sub':
- six.advance_iterator(self.stream)
+ next(self.stream)
node = nodes.Neg(self.parse_unary(False), lineno=lineno)
elif token_type == 'add':
- six.advance_iterator(self.stream)
+ next(self.stream)
node = nodes.Pos(self.parse_unary(False), lineno=lineno)
else:
node = self.parse_primary()
node = nodes.Const(None, lineno=token.lineno)
else:
node = nodes.Name(token.value, 'load', lineno=token.lineno)
- six.advance_iterator(self.stream)
+ next(self.stream)
elif token.type == 'string':
- six.advance_iterator(self.stream)
+ next(self.stream)
buf = [token.value]
lineno = token.lineno
while self.stream.current.type == 'string':
buf.append(self.stream.current.value)
- six.advance_iterator(self.stream)
+ next(self.stream)
node = nodes.Const(''.join(buf), lineno=lineno)
elif token.type in ('integer', 'float'):
- six.advance_iterator(self.stream)
+ next(self.stream)
node = nodes.Const(token.value, lineno=token.lineno)
elif token.type == 'lparen':
- six.advance_iterator(self.stream)
+ next(self.stream)
node = self.parse_tuple(explicit_parentheses=True)
self.stream.expect('rparen')
elif token.type == 'lbracket':
return node
def parse_subscript(self, node):
- token = six.advance_iterator(self.stream)
+ token = next(self.stream)
if token.type == 'dot':
attr_token = self.stream.current
- six.advance_iterator(self.stream)
+ next(self.stream)
if attr_token.type == 'name':
return nodes.Getattr(node, attr_token.value, 'load',
lineno=token.lineno)
lineno = self.stream.current.lineno
if self.stream.current.type == 'colon':
- six.advance_iterator(self.stream)
+ next(self.stream)
args = [None]
else:
node = self.parse_expression()
if self.stream.current.type != 'colon':
return node
- six.advance_iterator(self.stream)
+ next(self.stream)
args = [node]
if self.stream.current.type == 'colon':
args.append(None)
if self.stream.current.type == 'colon':
- six.advance_iterator(self.stream)
+ next(self.stream)
if self.stream.current.type not in ('rbracket', 'comma'):
args.append(self.parse_expression())
else:
break
if self.stream.current.type == 'mul':
ensure(dyn_args is None and dyn_kwargs is None)
- six.advance_iterator(self.stream)
+ next(self.stream)
dyn_args = self.parse_expression()
elif self.stream.current.type == 'pow':
ensure(dyn_kwargs is None)
- six.advance_iterator(self.stream)
+ next(self.stream)
dyn_kwargs = self.parse_expression()
else:
ensure(dyn_args is None and dyn_kwargs is None)
def parse_filter(self, node, start_inline=False):
while self.stream.current.type == 'pipe' or start_inline:
if not start_inline:
- six.advance_iterator(self.stream)
+ next(self.stream)
token = self.stream.expect('name')
name = token.value
while self.stream.current.type == 'dot':
- six.advance_iterator(self.stream)
+ next(self.stream)
name += '.' + self.stream.expect('name').value
if self.stream.current.type == 'lparen':
args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)
return node
def parse_test(self, node):
- token = six.advance_iterator(self.stream)
+ token = next(self.stream)
if self.stream.current.test('name:not'):
- six.advance_iterator(self.stream)
+ next(self.stream)
negated = True
else:
negated = False
name = self.stream.expect('name').value
while self.stream.current.type == 'dot':
- six.advance_iterator(self.stream)
+ next(self.stream)
name += '.' + self.stream.expect('name').value
dyn_args = dyn_kwargs = None
kwargs = []
if token.value:
add_data(nodes.TemplateData(token.value,
lineno=token.lineno))
- six.advance_iterator(self.stream)
+ next(self.stream)
elif token.type == 'variable_begin':
- six.advance_iterator(self.stream)
+ next(self.stream)
add_data(self.parse_tuple(with_condexpr=True))
self.stream.expect('variable_end')
elif token.type == 'block_begin':
flush_data()
- six.advance_iterator(self.stream)
+ next(self.stream)
if end_tokens is not None and \
self.stream.current.test_any(*end_tokens):
return body
import shutil
from jinja2.testsuite import JinjaTestCase
+from jinja2._compat import next
from jinja2 import Environment, Undefined, DebugUndefined, \
StrictUndefined, UndefinedError, meta, \
is_undefined, Template, DictLoader
from jinja2.utils import Cycler
-import six
env = Environment()
c = Cycler(*items)
for item in items + items:
assert c.current == item
- assert six.advance_iterator(c) == item
- six.advance_iterator(c)
+ assert next(c) == item
+ next(c)
assert c.current == 2
c.reset()
assert c.current == 1
def test_find_refererenced_templates(self):
ast = env.parse('{% extends "layout.html" %}{% include helper %}')
i = meta.find_referenced_templates(ast)
- assert six.advance_iterator(i) == 'layout.html'
- assert six.advance_iterator(i) is None
+ assert next(i) == 'layout.html'
+ assert next(i) is None
assert list(i) == []
ast = env.parse('{% extends "layout.html" %}'
tmpl = env.from_string("<ul>{% for item in seq %}<li>{{ loop.index "
"}} - {{ item }}</li>{%- endfor %}</ul>")
stream = tmpl.stream(seq=list(range(4)))
- self.assert_equal(six.advance_iterator(stream), '<ul>')
- self.assert_equal(six.advance_iterator(stream), '<li>1 - 0</li>')
- self.assert_equal(six.advance_iterator(stream), '<li>2 - 1</li>')
- self.assert_equal(six.advance_iterator(stream), '<li>3 - 2</li>')
- self.assert_equal(six.advance_iterator(stream), '<li>4 - 3</li>')
- self.assert_equal(six.advance_iterator(stream), '</ul>')
+ self.assert_equal(next(stream), '<ul>')
+ self.assert_equal(next(stream), '<li>1 - 0</li>')
+ self.assert_equal(next(stream), '<li>2 - 1</li>')
+ self.assert_equal(next(stream), '<li>3 - 2</li>')
+ self.assert_equal(next(stream), '<li>4 - 3</li>')
+ self.assert_equal(next(stream), '</ul>')
def test_buffered_streaming(self):
tmpl = env.from_string("<ul>{% for item in seq %}<li>{{ loop.index "
"}} - {{ item }}</li>{%- endfor %}</ul>")
stream = tmpl.stream(seq=list(range(4)))
stream.enable_buffering(size=3)
- self.assert_equal(six.advance_iterator(stream), u'<ul><li>1 - 0</li><li>2 - 1</li>')
- self.assert_equal(six.advance_iterator(stream), u'<li>3 - 2</li><li>4 - 3</li></ul>')
+ self.assert_equal(next(stream), u'<ul><li>1 - 0</li><li>2 - 1</li>')
+ self.assert_equal(next(stream), u'<li>3 - 2</li><li>4 - 3</li></ul>')
def test_streaming_behavior(self):
tmpl = env.from_string("")