diff options
Diffstat (limited to 'coverage')
-rw-r--r-- | coverage/cmdline.py | 9 | ||||
-rw-r--r-- | coverage/config.py | 2 | ||||
-rw-r--r-- | coverage/control.py | 11 | ||||
-rw-r--r-- | coverage/html.py | 6 | ||||
-rw-r--r-- | coverage/summary.py | 9 |
5 files changed, 34 insertions, 3 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 66d4dc3c..ef1184d0 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -93,6 +93,10 @@ class Opts(object): '--skip-covered', action='store_true', help="Skip files with 100% coverage.", ) + skip_empty = optparse.make_option( + '--skip-empty', action='store_true', + help="Skip empty files.", + ) show_contexts = optparse.make_option( '--show-contexts', action='store_true', help="Show contexts for covered lines.", @@ -203,6 +207,7 @@ class CoverageOptionParser(optparse.OptionParser, object): rcfile=True, show_missing=None, skip_covered=None, + skip_empty=None, show_contexts=None, source=None, timid=None, @@ -354,6 +359,7 @@ CMDS = { Opts.omit, Opts.title, Opts.skip_covered, + Opts.skip_empty, Opts.show_contexts, Opts.contexts, ] + GLOBAL_ARGS, @@ -375,6 +381,7 @@ CMDS = { Opts.contexts, Opts.show_missing, Opts.skip_covered, + Opts.skip_empty, ] + GLOBAL_ARGS, usage="[options] [modules]", description="Report coverage statistics on modules." @@ -575,6 +582,7 @@ class CoverageScript(object): total = self.coverage.report( show_missing=options.show_missing, skip_covered=options.skip_covered, + skip_empty=options.skip_empty, **report_args ) elif options.action == "annotate": @@ -584,6 +592,7 @@ class CoverageScript(object): directory=options.directory, title=options.title, skip_covered=options.skip_covered, + skip_empty=options.skip_empty, show_contexts=options.show_contexts, **report_args ) diff --git a/coverage/config.py b/coverage/config.py index 7d691145..c6689d2d 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -205,6 +205,7 @@ class CoverageConfig(object): self.report_contexts = None self.show_missing = False self.skip_covered = False + self.skip_empty = False # Defaults for [html] self.extra_css = None @@ -362,6 +363,7 @@ class CoverageConfig(object): ('report_omit', 'report:omit', 'list'), ('show_missing', 'report:show_missing', 'boolean'), ('skip_covered', 'report:skip_covered', 'boolean'), + ('skip_empty', 'report:skip_empty', 'boolean'), ('sort', 'report:sort'), # [html] diff --git a/coverage/control.py b/coverage/control.py index 7be28413..ff015882 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -774,7 +774,7 @@ class Coverage(object): def report( self, morfs=None, show_missing=None, ignore_errors=None, file=None, omit=None, include=None, skip_covered=None, - contexts=None, + contexts=None, skip_empty=None, ): """Write a textual summary report to `file`. @@ -794,6 +794,9 @@ class Coverage(object): If `skip_covered` is true, don't report on files with 100% coverage. + If `skip_empty` is true, don't report on empty files (those that have + no statements). + `contexts` is a list of regular expressions. Only data from :ref:`dynamic contexts <dynamic_contexts>` that match one of those expressions (using :func:`re.search <python:re.search>`) will be @@ -815,7 +818,7 @@ class Coverage(object): self, ignore_errors=ignore_errors, report_omit=omit, report_include=include, show_missing=show_missing, skip_covered=skip_covered, - report_contexts=contexts, + report_contexts=contexts, skip_empty=skip_empty, ): reporter = SummaryReporter(self) return reporter.report(morfs, outfile=file) @@ -843,7 +846,8 @@ class Coverage(object): def html_report(self, morfs=None, directory=None, ignore_errors=None, omit=None, include=None, extra_css=None, title=None, - skip_covered=None, show_contexts=None, contexts=None): + skip_covered=None, show_contexts=None, contexts=None, + skip_empty=None): """Generate an HTML report. The HTML is written to `directory`. The file "index.html" is the @@ -871,6 +875,7 @@ class Coverage(object): ignore_errors=ignore_errors, report_omit=omit, report_include=include, html_dir=directory, extra_css=extra_css, html_title=title, skip_covered=skip_covered, show_contexts=show_contexts, report_contexts=contexts, + skip_empty=skip_empty, ): reporter = HtmlReporter(self) return reporter.report(morfs) diff --git a/coverage/html.py b/coverage/html.py index 4a0e1a33..e3b814c5 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -282,6 +282,12 @@ class HtmlReporter(object): file_be_gone(html_path) return + if self.config.skip_empty: + # Don't report on empty files. + if nums.n_statements == 0: + file_be_gone(html_path) + return + # Find out if the file on disk is already correct. if self.incr.can_skip_file(self.data, fr, rootname): self.file_summaries.append(self.incr.index_info(rootname)) diff --git a/coverage/summary.py b/coverage/summary.py index 08c8a947..97d9fff0 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -21,6 +21,7 @@ class SummaryReporter(object): self.outfile = None self.fr_analysis = [] self.skipped_count = 0 + self.empty_count = 0 self.total = Numbers() self.fmt_err = u"%s %s: %s" @@ -48,6 +49,7 @@ class SummaryReporter(object): max_name = max([len(fr.relative_filename()) for (fr, analysis) in self.fr_analysis] + [5]) fmt_name = u"%%- %ds " % max_name fmt_skip_covered = u"\n%s file%s skipped due to complete coverage." + fmt_skip_empty = u"\n%s empty file%s skipped." header = (fmt_name % "Name") + u" Stmts Miss" fmt_coverage = fmt_name + u"%6d %6d" @@ -129,6 +131,10 @@ class SummaryReporter(object): self.writeout( fmt_skip_covered % (self.skipped_count, 's' if self.skipped_count > 1 else '') ) + if self.config.skip_empty and self.empty_count: + self.writeout( + fmt_skip_empty % (self.empty_count, 's' if self.empty_count > 1 else '') + ) return self.total.n_statements and self.total.pc_covered @@ -142,5 +148,8 @@ class SummaryReporter(object): if self.config.skip_covered and no_missing_lines and no_missing_branches: # Don't report on 100% files. self.skipped_count += 1 + elif self.config.skip_empty and nums.n_statements == 0: + # Don't report on empty files. + self.empty_count += 1 else: self.fr_analysis.append((fr, analysis)) |