diff options
author | David Lord <davidism@gmail.com> | 2017-07-07 09:40:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-07 09:40:35 -0700 |
commit | a361b74fda6bfd01f389b3e0110f607953e445e0 (patch) | |
tree | 1f8f56800cfb641c365d210b3397ad9863657525 | |
parent | 2c61df138ae2bfc475f9f1e531691d3f6474e209 (diff) | |
parent | 32afe631c2e4a05fbb4a35078dff46dfaf5e46eb (diff) | |
download | jinja2-a361b74fda6bfd01f389b3e0110f607953e445e0.tar.gz |
Merge pull request #618 from jackwilsdon/stricter-from-parsing
Add stricter checking to "from ... import ..."
-rw-r--r-- | CHANGES | 2 | ||||
-rw-r--r-- | jinja2/parser.py | 2 | ||||
-rw-r--r-- | tests/test_imports.py | 22 |
3 files changed, 23 insertions, 3 deletions
@@ -28,10 +28,12 @@ Version 2.10 - Add ``min`` and ``max`` filters. (`#475`_) - Add tests for all comparison operators: ``eq``, ``ne``, ``lt``, ``le``, ``gt``, ``ge``. (`#665`_) +- ``import`` statement cannot end with a trailing comma. (`#618`_) .. _#469: https://github.com/pallets/jinja/pull/469 .. _#475: https://github.com/pallets/jinja/pull/475 .. _#478: https://github.com/pallets/jinja/pull/478 +.. _#618: https://github.com/pallets/jinja/pull/618 .. _#665: https://github.com/pallets/jinja/pull/665 Version 2.9.6 diff --git a/jinja2/parser.py b/jinja2/parser.py index 6d1fff6..0823364 100644 --- a/jinja2/parser.py +++ b/jinja2/parser.py @@ -334,7 +334,7 @@ class Parser(object): if parse_context() or self.stream.current.type != 'comma': break else: - break + self.stream.expect('name') if not hasattr(node, 'with_context'): node.with_context = False self.stream.skip_if('comma') diff --git a/tests/test_imports.py b/tests/test_imports.py index a6d5161..4250eb9 100644 --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -11,7 +11,8 @@ import pytest from jinja2 import Environment, DictLoader -from jinja2.exceptions import TemplateNotFound, TemplatesNotFound +from jinja2.exceptions import TemplateNotFound, TemplatesNotFound, \ + TemplateSyntaxError @pytest.fixture @@ -50,7 +51,24 @@ class TestImports(object): ) assert t.render(foo=42) == '[42|23]' - def test_trailing_comma(self, test_env): + def test_import_needs_name(self, test_env): + test_env.from_string('{% from "foo" import bar %}') + test_env.from_string('{% from "foo" import bar, baz %}') + + with pytest.raises(TemplateSyntaxError): + test_env.from_string('{% from "foo" import %}') + + def test_no_trailing_comma(self, test_env): + with pytest.raises(TemplateSyntaxError): + test_env.from_string('{% from "foo" import bar, %}') + + with pytest.raises(TemplateSyntaxError): + test_env.from_string('{% from "foo" import bar,, %}') + + with pytest.raises(TemplateSyntaxError): + test_env.from_string('{% from "foo" import, %}') + + def test_trailing_comma_with_context(self, test_env): test_env.from_string('{% from "foo" import bar, baz with context %}') test_env.from_string('{% from "foo" import bar, baz, with context %}') test_env.from_string('{% from "foo" import bar, with context %}') |