summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/parser.py11
-rw-r--r--test/test_html.py18
2 files changed, 28 insertions, 1 deletions
diff --git a/coverage/parser.py b/coverage/parser.py
index f868d357..a9cceb35 100644
--- a/coverage/parser.py
+++ b/coverage/parser.py
@@ -203,7 +203,16 @@ class CodeParser(object):
statements.
"""
- self._raw_parse()
+
+ try:
+ self._raw_parse()
+ except tokenize.TokenError:
+ _, tokerr, _ = sys.exc_info()
+ msg, lineno = tokerr.args
+ raise NotPython(
+ "Couldn't parse '%s' as Python source: '%s' at %s" %
+ (self.filename, msg, lineno)
+ )
excluded_lines = self.first_lines(self.excluded)
ignore = excluded_lines + list(self.docstrings)
diff --git a/test/test_html.py b/test/test_html.py
index c5c87d2a..96f98c83 100644
--- a/test/test_html.py
+++ b/test/test_html.py
@@ -195,3 +195,21 @@ class HtmlWithUnparsableFilesTest(CoverageTest):
self.make_file("innocuous.html", "<h1>This isn't python at all!</h1>")
output = self.run_command("coverage html")
self.assertEqual(output.strip(), "No data to report.")
+
+ def test_execed_liar_ignored(self):
+ """
+ Jinja2 sets __file__ to be a non-Python file, and then execs code.
+
+ If that file contains non-Python code, a TokenError shouldn't
+ have been raised when writing the HTML report.
+
+ """
+
+ source = "exec compile('', '', 'exec') in {'__file__' : 'liar.html'}"
+ self.make_file("liar.py", source)
+ self.make_file("liar.html", "{# Whoops, not python code #}")
+ cov = coverage.coverage()
+ cov.start()
+ self.import_local_file("liar")
+ cov.stop()
+ cov.html_report()