Commits

Ned Batchelder committed 5b49a4e

Fix IndentationErrors when parsing non-Python files. #82.

Comments (0)

Files changed (3)

   HTML report would fail with a UnicodeDecodeError. This issue (`issue 193`_)
   is now fixed.
 
+- Fixed yet another error trying to parse non-Python files as Python, this
+  time an IndentationError, closing `issue 82`_ for the fourth time...
+
 - If `coverage xml` fails because there is no data to report, it used to
   create a zero-length XML file.  Now it doesn't, fixing `issue 210`_.
 
 
 - Other minor bugs fixed: `issue 153`_.
 
+.. _issue 82: https://bitbucket.org/ned/coveragepy/issue/82/tokenerror-when-generating-html-report
 .. _issue 89: https://bitbucket.org/ned/coveragepy/issue/89/on-windows-all-packages-are-reported-in
 .. _issue 111: https://bitbucket.org/ned/coveragepy/issue/111/when-installing-coverage-with-pip-not
 .. _issue 137: https://bitbucket.org/ned/coveragepy/issue/137/provide-docs-with-source-distribution

coverage/parser.py

         """
         try:
             self._raw_parse()
-        except tokenize.TokenError:
+        except (tokenize.TokenError, IndentationError):
             _, tokerr, _ = sys.exc_info()
             msg, lineno = tokerr.args
             raise NotPython(

test/test_html.py

         output = self.run_command("coverage html")
         self.assertEqual(output.strip(), "No data to report.")
 
-    def test_dothtml_not_python_indentation_error(self):
-        # We run a .html file, and when reporting, we can't parse it as
-        # Python.  Since it wasn't .py, no error is reported.
-
-        # Run an "html" file
-        self.make_file("innocuous.html", "a = 1")
-        self.run_command("coverage run innocuous.html")
-        # Before reporting, change it to be an indentation error.
-        self.make_file("innocuous.html", "  hello\n bye\n")
-        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
 
     def test_execed_liar_ignored_indentation_error(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.
+        # If that file contains untokenizable code, we shouldn't get an
+        # exception.
         if sys.version_info < (3, 0):
-            source = "exec compile('','','exec') in {'__file__': 'liar.jinja2'}"
+            source = "exec compile('','','exec') in {'__file__': 'liar.html'}"
         else:
-            source = "exec(compile('','','exec'), {'__file__': 'liar.jinja2'})"
+            source = "exec(compile('','','exec'), {'__file__': 'liar.html'})"
         self.make_file("liar.py", source)
-        self.make_file("liar.jinja2", "  hello\n bye\n")
+        # Tokenize will raise an IndentationError if it can't dedent.
+        self.make_file("liar.html", "0\n  2\n 1\n")
         cov = coverage.coverage()
         cov.start()
         self.import_local_file("liar")