diff options
Diffstat (limited to 'coverage/html.py')
-rw-r--r-- | coverage/html.py | 185 |
1 files changed, 19 insertions, 166 deletions
diff --git a/coverage/html.py b/coverage/html.py index 416c6879..40ed3168 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -1,10 +1,20 @@ """HTML reporting for coverage.py""" -import os +import os, shutil from coverage import __version__ # pylint: disable-msg=W0611 from coverage.report import Reporter from coverage.templite import Templite + +def data_filename(fname): + """Return the path to a data file of ours.""" + return os.path.join(os.path.split(__file__)[0], fname) + +def data(fname): + """Return the contents of a data file of ours.""" + return open(data_filename(fname)).read() + + class HtmlReporter(Reporter): """HTML reporting. @@ -13,10 +23,17 @@ class HtmlReporter(Reporter): def __init__(self, coverage, ignore_errors=False): super(HtmlReporter, self).__init__(coverage, ignore_errors) self.directory = None - self.source_tmpl = Templite(SOURCE, globals()) + self.source_tmpl = Templite(data("htmlfiles/pyfile.html"), globals()) def report(self, morfs, directory=None, omit_prefixes=None): assert directory, "must provide a directory for html reporting" + # Create the once-per-directory files. + shutil.copyfile( + data_filename("htmlfiles/style.css"), + os.path.join(directory, "style.css") + ) + + # Process all the files. self.report_files(self.html_file, morfs, directory, omit_prefixes) def html_file(self, cu, statements, excluded, missing): @@ -79,167 +96,3 @@ def not_empty(t): def format_pct(p): return "%.0f" % p - -# Templates - -# For making line numbers and text different fonts: -# http://24ways.org/2006/compose-to-a-vertical-rhythm - -SOURCE = """\ -<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<title>Coverage for {{cu.name|escape}}</title> -<style> -/* Page-wide styles */ -html, body, p, td { - margin: 0; - padding: 0; - } - -/* Set baseline grid to 14 pt. */ -body { - font-size: .875em; /* 14/16 */ - } - -html>body { - font-size: 14px; - } - -/* Set base font size to 12/14 */ -p { - font-size: .85714em; /* 12/14 */ - line-height: 1.16667em; /* 14/12 */ - } - -a.nav { - text-decoration: none; - color: inherit; - } -a.nav:hover { - text-decoration: underline; - color: inherit; - } - -/* Page structure */ -#header { - background: #ffd472; - width: 100%; - font-family: verdana, sans-serif; - } - -#source { - padding: 1em; - font-family: "courier new", monospace; - } - -#footer { - background: #ffe9b8; - font-size: 85%; - font-family: verdana, sans-serif; - color: #666666; - font-style: italic; - } - -/* Header styles */ -.content { - padding: 1em; - } - -#file_stats { - float: right; - } - -.stats .number { - text-align: right; - font-weight: bold; - } - -/* Source file styles */ -.linenos { - background: #eeeeee; - } -.linenos p { - text-align: right; - margin: 0; - padding: 0 .5em; - color: #999999; - font-size: .75em; /* 9/12 */ - line-height: 1.3333em; /* 12/9, why isn't it 14/9? */ - } -td.text { - width: 100%; - } -.text p { - margin: 0; - padding: 0 0 0 .5em; - white-space: nowrap; - } - -.linenos p.mis { - background: #ffcccc; - } -.linenos p.run { - background: #ccffcc; - } -.linenos p.exc { - background: #e2e2e2; - } - -.text p.mis { - background: #ffdddd; - } -.text p.run { - background: #ddffdd; - } -.text p.exc { - background: #eeeeee; - } -</style> -</head> -<body> -<div id='header'> - <div class='content'> - <div id='file_stats'> - <table class='stats'> - <tr><td class='label'>Lines</td><td class='number'>{{n_lin}}</td></tr> - <tr><td class='label'>Statements</td><td class='number'>{{n_stm}}</td></tr> - <tr><td class='label'>Excluded</td><td class='number'>{{n_exc}}</td></tr> - <tr><td class='label'>Missing</td><td class='number'>{{n_mis}}</td></tr> - </table> - </div> - <p>Coverage for <b>{{cu.filename|escape}}</b>: - <span class='pc_cov'>{{pc_cov|format_pct}}%</span> - </p> - <div style='clear:both'></div> - </div> -</div> - -<div id='source'> -<table cellspacing='0' cellpadding='0'> -<tr> -<td class='linenos' valign='top'> - {% for line in lines %} - <p class='{{line.class}}'>{{line.number}}</p> - {% endfor %} -</td> -<td class='text' valign='top'> - {% for line in lines %} - <p class='{{line.class}}'>{{line.text.rstrip|escape|not_empty}}</p> - {% endfor %} -</td> -</tr> -</table> -</div> - -<div id='footer'> - <div class='content'> - <p> - <a class='nav' href='http://bitbucket.org/ned/coveragepy/'>coverage.py v{{__version__}}</a> - </p> - </div> -</div> - -</body> -</html> -""" |