From cf2886166f3265712f7ff3170126da3ba1e00654 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 25 Apr 2009 23:54:16 -0400 Subject: HTML report now has an index.html. --- coverage/html.py | 43 +++++++++++++++++++++++++++++---- coverage/htmlfiles/index.html | 54 ++++++++++++++++++++++++++++++++++++++++++ coverage/htmlfiles/pyfile.html | 8 ------- coverage/htmlfiles/style.css | 48 ++++++++++++++++++++++++++++++++++--- 4 files changed, 138 insertions(+), 15 deletions(-) create mode 100644 coverage/htmlfiles/index.html (limited to 'coverage') diff --git a/coverage/html.py b/coverage/html.py index 41901b45..b88f89f1 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -25,6 +25,8 @@ class HtmlReporter(Reporter): self.directory = None self.source_tmpl = Templite(data("htmlfiles/pyfile.html"), globals()) + self.files = [] + def report(self, morfs, directory=None, omit_prefixes=None): assert directory, "must provide a directory for html reporting" @@ -45,6 +47,9 @@ class HtmlReporter(Reporter): # Process all the files. self.report_files(self.html_file, morfs, directory, omit_prefixes) + # Write the index file. + self.index_file() + def html_file(self, cu, statements, excluded, missing): """Generate an HTML file for one source file.""" @@ -57,7 +62,7 @@ class HtmlReporter(Reporter): n_mis = len(missing) n_run = n_stm - n_mis if n_stm > 0: - pc_cov = 100.0 * float(n_run) / n_stm + pc_cov = 100.0 * n_run / n_stm else: pc_cov = 100.0 @@ -88,12 +93,42 @@ class HtmlReporter(Reporter): } lines.append(lineinfo) - html_filename = os.path.join(self.directory, cu.flat_rootname()) - html_filename += ".html" - fhtml = open(html_filename, 'w') + # Write the HTML page for this file. + html_filename = cu.flat_rootname() + ".html" + html_path = os.path.join(self.directory, html_filename) + fhtml = open(html_path, 'w') fhtml.write(self.source_tmpl.render(locals())) fhtml.close() + # Save this file's information for the index file. + self.files.append({ + 'stm': n_stm, + 'run': n_run, + 'exc': n_exc, + 'mis': n_mis, + 'pc_cov': pc_cov, + 'html_filename': html_filename, + 'cu': cu, + }) + + def index_file(self): + """Write the index.html file for this report.""" + index_tmpl = Templite(data("htmlfiles/index.html"), globals()) + + files = self.files + + total_stm = sum([f['stm'] for f in files]) + total_run = sum([f['run'] for f in files]) + total_exc = sum([f['exc'] for f in files]) + if total_stm: + total_cov = 100.0 * total_run / total_stm + else: + total_cov = 100.0 + + fhtml = open(os.path.join(self.directory, "index.html"), "w") + fhtml.write(index_tmpl.render(locals())) + fhtml.close() + # Helpers for templates diff --git a/coverage/htmlfiles/index.html b/coverage/htmlfiles/index.html new file mode 100644 index 00000000..b6715c14 --- /dev/null +++ b/coverage/htmlfiles/index.html @@ -0,0 +1,54 @@ + + + +Coverage report + + + + + + +
+ + + + + + + + +{% for file in files %} + + + + + + + +{% endfor %} + + + + + + + +
Modulestatementsrunexcludedcoverage
{{file.cu.name}}{{file.stm}}{{file.run}}{{file.exc}}{{file.pc_cov|format_pct}}%
Total{{total_stm}}{{total_run}}{{total_exc}}{{total_cov|format_pct}}%
+
+ + + + + diff --git a/coverage/htmlfiles/pyfile.html b/coverage/htmlfiles/pyfile.html index d4c15c6a..afcb4a5e 100644 --- a/coverage/htmlfiles/pyfile.html +++ b/coverage/htmlfiles/pyfile.html @@ -50,13 +50,5 @@ function toggle_lines(btn, cls) { - - diff --git a/coverage/htmlfiles/style.css b/coverage/htmlfiles/style.css index 1a08b78e..5290bbd3 100644 --- a/coverage/htmlfiles/style.css +++ b/coverage/htmlfiles/style.css @@ -1,6 +1,6 @@ /* CSS styles for coverage.py */ /* Page-wide styles */ -html, body, h1, h2, h3, p, td { +html, body, h1, h2, h3, p, td, th { margin: 0; padding: 0; border: 0; @@ -14,6 +14,7 @@ html, body, h1, h2, h3, p, td { /* Set baseline grid to 16 pt. */ body { + font-family: georgia, serif; font-size: 1em; } @@ -27,6 +28,10 @@ p { line-height: 1.3333em; /* 16/12 */ } +table { + border-collapse: collapse; + } + a.nav { text-decoration: none; color: inherit; @@ -40,7 +45,6 @@ a.nav:hover { #header { background: #f8f8f8; width: 100%; - font-family: georgia, serif; border-bottom: 1px solid #eee; } @@ -56,9 +60,13 @@ a.nav:hover { font-style: italic; } +#index { + margin: 1em 0 0 3em; + } + /* Header styles */ .content { - padding: 1em 3em .5em 3em; + padding: 1em 3em; } h1 { @@ -115,3 +123,37 @@ td.text { .text p.hide { background: inherit; } + +/* index styles */ +#index td, #index th { + text-align: right; + width: 6em; + padding: .25em 0; + border-bottom: 1px solid #eee; + } +#index th { + font-style: italic; + color: #333; + border-bottom: 1px solid #ccc; + } +#index td.name, #index th.name { + text-align: left; + width: auto; + height: 1.5em; + } +#index td.name a { + text-decoration: none; + color: #000; + } +#index td.name a:hover { + text-decoration: underline; + color: #000; + } +#index tr.total { + font-weight: bold; + } +#index tr.total td { + padding: .25em 0; + border-top: 1px solid #ccc; + border-bottom: none; + } -- cgit v1.2.1