diff options
-rw-r--r-- | coverage/parser.py | 11 | ||||
-rw-r--r-- | test/test_html.py | 18 |
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() |