diff options
-rw-r--r-- | coverage/cmdline.py | 5 | ||||
-rw-r--r-- | coverage/control.py | 59 | ||||
-rw-r--r-- | coverage/summary.py | 66 |
3 files changed, 75 insertions, 55 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 0561f327..ee82eca2 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -2,6 +2,8 @@ import getopt, os, sys +from coverage.summary import SummaryReporter + USAGE = r""" Coverage version %(__version__)s @@ -136,7 +138,8 @@ class CoverageScript: omit = omit.split(',') if settings.get('report'): - self.coverage.report_engine(args, show_missing, ignore_errors, omit_prefixes=omit) + reporter = SummaryReporter(self.coverage, show_missing, ignore_errors) + reporter.report(args, omit_prefixes=omit) if settings.get('annotate'): self.coverage.annotate(args, directory, ignore_errors, omit_prefixes=omit) diff --git a/coverage/control.py b/coverage/control.py index 3a3a3ee8..4f3a3f57 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -2,10 +2,11 @@ import os, re, sys -from coverage.data import CoverageData -from coverage.misc import format_lines, CoverageException from coverage.codeunit import code_unit_factory +from coverage.data import CoverageData from coverage.files import FileLocator +from coverage.misc import format_lines, CoverageException +from coverage.summary import SummaryReporter class coverage: def __init__(self): @@ -153,58 +154,8 @@ class coverage: # Programmatic entry point def report(self, morfs, show_missing=True, ignore_errors=False, file=None): - self.report_engine(morfs, show_missing=show_missing, ignore_errors=ignore_errors, outfile=file) - - def report_engine(self, morfs, show_missing=True, ignore_errors=False, outfile=None, omit_prefixes=None): - morfs = morfs or self.data.executed_files() - code_units = code_unit_factory(morfs, self.file_locator, omit_prefixes) - code_units.sort() - - max_name = max(5, max(map(lambda cu: len(cu.name), code_units))) - fmt_name = "%%- %ds " % max_name - fmt_err = fmt_name + "%s: %s" - header = fmt_name % "Name" + " Stmts Exec Cover" - fmt_coverage = fmt_name + "% 6d % 6d % 5d%%" - if show_missing: - header = header + " Missing" - fmt_coverage = fmt_coverage + " %s" - if not outfile: - outfile = sys.stdout - print >>outfile, header - print >>outfile, "-" * len(header) - total_statements = 0 - total_executed = 0 - for cu in code_units: - try: - _, statements, _, missing, readable = self.analyze(cu) - n = len(statements) - m = n - len(missing) - if n > 0: - pc = 100.0 * m / n - else: - pc = 100.0 - args = (cu.name, n, m, pc) - if show_missing: - args = args + (readable,) - print >>outfile, fmt_coverage % args - total_statements = total_statements + n - total_executed = total_executed + m - except KeyboardInterrupt: #pragma: no cover - raise - except: - if not ignore_errors: - typ, msg = sys.exc_info()[:2] - print >>outfile, fmt_err % (cu.name, typ, msg) - if len(code_units) > 1: - print >>outfile, "-" * len(header) - if total_statements > 0: - pc = 100.0 * total_executed / total_statements - else: - pc = 100.0 - args = ("TOTAL", total_statements, total_executed, pc) - if show_missing: - args = args + ("",) - print >>outfile, fmt_coverage % args + reporter = SummaryReporter(self, show_missing, ignore_errors) + reporter.report(morfs, outfile=file) # annotate(morfs, ignore_errors). diff --git a/coverage/summary.py b/coverage/summary.py new file mode 100644 index 00000000..011c07e2 --- /dev/null +++ b/coverage/summary.py @@ -0,0 +1,66 @@ +"""Summary reporting""" + +import sys + +from coverage.codeunit import code_unit_factory + +class SummaryReporter: + """A reporter for writing the summary report.""" + + def __init__(self, coverage, show_missing=True, ignore_errors=False): + self.cov = coverage + self.show_missing = show_missing + self.ignore_errors = ignore_errors + + def report(self, morfs, omit_prefixes=None, outfile=None): + """Writes a report summarizing coverage statistics per module.""" + + morfs = morfs or self.cov.data.executed_files() + code_units = code_unit_factory(morfs, self.cov.file_locator, omit_prefixes) + code_units.sort() + + max_name = max(5, max(map(lambda cu: len(cu.name), code_units))) + fmt_name = "%%- %ds " % max_name + fmt_err = fmt_name + "%s: %s" + header = fmt_name % "Name" + " Stmts Exec Cover" + fmt_coverage = fmt_name + "% 6d % 6d % 5d%%" + if self.show_missing: + header = header + " Missing" + fmt_coverage = fmt_coverage + " %s" + if not outfile: + outfile = sys.stdout + print >>outfile, header + print >>outfile, "-" * len(header) + total_statements = 0 + total_executed = 0 + for cu in code_units: + try: + _, statements, _, missing, readable = self.cov.analyze(cu) + n = len(statements) + m = n - len(missing) + if n > 0: + pc = 100.0 * m / n + else: + pc = 100.0 + args = (cu.name, n, m, pc) + if self.show_missing: + args = args + (readable,) + print >>outfile, fmt_coverage % args + total_statements = total_statements + n + total_executed = total_executed + m + except KeyboardInterrupt: #pragma: no cover + raise + except: + if not self.ignore_errors: + typ, msg = sys.exc_info()[:2] + print >>outfile, fmt_err % (cu.name, typ, msg) + if len(code_units) > 1: + print >>outfile, "-" * len(header) + if total_statements > 0: + pc = 100.0 * total_executed / total_statements + else: + pc = 100.0 + args = ("TOTAL", total_statements, total_executed, pc) + if self.show_missing: + args = args + ("",) + print >>outfile, fmt_coverage % args |