summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/html.py47
-rw-r--r--test/test_html.py36
2 files changed, 68 insertions, 15 deletions
diff --git a/coverage/html.py b/coverage/html.py
index e4404de4..802327d2 100644
--- a/coverage/html.py
+++ b/coverage/html.py
@@ -2,7 +2,7 @@
import os, re, shutil
-from coverage import __url__, __version__ # pylint: disable=W0611
+import coverage
from coverage.backward import pickle
from coverage.misc import CoverageException, Hasher
from coverage.phystokens import source_token_lines
@@ -39,11 +39,19 @@ class HtmlReporter(Reporter):
"coverage_html.js",
]
- def __init__(self, coverage, ignore_errors=False):
- super(HtmlReporter, self).__init__(coverage, ignore_errors)
+ def __init__(self, cov, ignore_errors=False):
+ super(HtmlReporter, self).__init__(cov, ignore_errors)
self.directory = None
- self.source_tmpl = Templite(data("htmlfiles/pyfile.html"), globals())
- self.coverage = coverage
+ self.template_globals = {
+ 'escape': escape,
+ '__url__': coverage.__url__,
+ '__version__': coverage.__version__,
+ }
+ self.source_tmpl = Templite(
+ data("htmlfiles/pyfile.html"), self.template_globals
+ )
+
+ self.coverage = cov
self.files = []
self.arcs = self.coverage.data.has_arcs()
@@ -195,7 +203,9 @@ class HtmlReporter(Reporter):
def index_file(self):
"""Write the index.html file for this report."""
- index_tmpl = Templite(data("htmlfiles/index.html"), globals())
+ index_tmpl = Templite(
+ data("htmlfiles/index.html"), self.template_globals
+ )
files = self.files
arcs = self.arcs
@@ -215,8 +225,8 @@ class HtmlReporter(Reporter):
class HtmlStatus(object):
"""The status information we keep to support incremental reporting."""
- STATUS_FILE = "latest.dat"
- STATUS_VERSION = 1
+ STATUS_FILE = "status.dat"
+ STATUS_FORMAT = 1
def __init__(self):
self.reset()
@@ -228,22 +238,31 @@ class HtmlStatus(object):
def read(self, directory):
"""Read the last status in `directory`."""
- self.reset()
+ usable = False
try:
status_file = os.path.join(directory, self.STATUS_FILE)
status = pickle.load(open(status_file, "rb"))
except IOError:
- pass
+ usable = False
+ else:
+ usable = True
+ if status['format'] != self.STATUS_FORMAT:
+ usable = False
+ elif status['version'] != coverage.__version__:
+ usable = False
+
+ if usable:
+ self.files = status['files']
+ self.settings = status['settings']
else:
- if status['version'] == self.STATUS_VERSION:
- self.files = status['files']
- self.settings = status['settings']
+ self.reset()
def write(self, directory):
"""Write the current status to `directory`."""
status_file = os.path.join(directory, self.STATUS_FILE)
status = {
- 'version': self.STATUS_VERSION,
+ 'format': self.STATUS_FORMAT,
+ 'version': coverage.__version__,
'settings': self.settings,
'files': self.files,
}
diff --git a/test/test_html.py b/test/test_html.py
index ad03f054..c7b56576 100644
--- a/test/test_html.py
+++ b/test/test_html.py
@@ -8,6 +8,17 @@ from coveragetest import CoverageTest
class HtmlTest(CoverageTest):
"""HTML!"""
+ def setUp(self):
+ super(HtmlTest, self).setUp()
+
+ # At least one of our tests monkey-patches the version of coverage,
+ # so grab it here to restore it later.
+ self.real_coverage_version = coverage.__version__
+
+ def tearDown(self):
+ coverage.__version__ = self.real_coverage_version
+ super(HtmlTest, self).tearDown()
+
def create_initial_files(self):
"""Create the source files we need to run these tests."""
self.make_file("main_file.py", """\
@@ -111,7 +122,7 @@ class HtmlTest(CoverageTest):
self.run_coverage(timid=True)
- # Only the changed files should have been created.
+ # All the files have been reported again.
self.assert_exists("htmlcov/index.html")
self.assert_exists("htmlcov/helper1.html")
self.assert_exists("htmlcov/main_file.html")
@@ -119,3 +130,26 @@ class HtmlTest(CoverageTest):
index2 = open("htmlcov/index.html").read()
self.assertMultiLineEqual(index1, index2)
+ def test_html_delta_from_coverage_version_change(self):
+ # HTML generation can create only the files that have changed.
+ # In this case, everything changes because the coverage version has
+ # changed.
+ self.create_initial_files()
+ self.run_coverage()
+ index1 = open("htmlcov/index.html").read()
+ self.remove_html_files()
+
+ # "Upgrade" coverage.py!
+ coverage.__version__ = "XYZZY"
+
+ self.run_coverage()
+
+ # All the files have been reported again.
+ self.assert_exists("htmlcov/index.html")
+ self.assert_exists("htmlcov/helper1.html")
+ self.assert_exists("htmlcov/main_file.html")
+ self.assert_exists("htmlcov/helper2.html")
+ index2 = open("htmlcov/index.html").read()
+ fixed_index2 = index2.replace("XYZZY", self.real_coverage_version)
+ self.assertMultiLineEqual(index1, fixed_index2)
+