diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2014-11-23 07:30:07 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2014-11-23 07:30:07 -0500 |
commit | ab861cc4535777fed86e6cb36b3608b4fc8c079d (patch) | |
tree | 50b8f1cc7ba3508dce78f157c49b4c10f5564b8b | |
parent | 622742746327abccd848d40583c9d7bc8bcb096c (diff) | |
parent | 994a6f8c169094d406bad7e63a33b5d99fe38c2b (diff) | |
download | python-coveragepy-git-ab861cc4535777fed86e6cb36b3608b4fc8c079d.tar.gz |
Merged pull request 43: --skip-covered
-rw-r--r-- | coverage/cmdline.py | 9 | ||||
-rw-r--r-- | coverage/config.py | 2 | ||||
-rw-r--r-- | coverage/control.py | 4 | ||||
-rw-r--r-- | coverage/summary.py | 3 | ||||
-rw-r--r-- | doc/config.rst | 2 | ||||
-rw-r--r-- | tests/test_cmdline.py | 7 | ||||
-rw-r--r-- | tests/test_config.py | 2 | ||||
-rw-r--r-- | tests/test_summary.py | 60 |
8 files changed, 85 insertions, 4 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py index e7efe5c4..f776950a 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -62,6 +62,10 @@ class Opts(object): help="Show line numbers of statements in each module that weren't " "executed." ) + skip_covered = optparse.make_option( + '-s', '--skip-covered', action='store_true', + help="Skip files with 100% coverage." + ) omit = optparse.make_option( '', '--omit', action='store', metavar="PAT1,PAT2,...", @@ -135,6 +139,7 @@ class CoverageOptionParser(optparse.OptionParser, object): pylib=None, rcfile=True, show_missing=None, + skip_covered=None, source=None, timid=None, title=None, @@ -283,6 +288,7 @@ CMDS = { Opts.omit, Opts.include, Opts.show_missing, + Opts.skip_covered ] + GLOBAL_ARGS, usage = "[options] [modules]", description = "Report coverage statistics on modules." @@ -426,7 +432,8 @@ class CoverageScript(object): if options.action == "report": total = self.coverage.report( - show_missing=options.show_missing, **report_args) + show_missing=options.show_missing, + skip_covered=options.skip_covered, **report_args) if options.action == "annotate": self.coverage.annotate( directory=options.directory, **report_args) diff --git a/coverage/config.py b/coverage/config.py index ba288f05..9598f74d 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -160,6 +160,7 @@ class CoverageConfig(object): self.partial_always_list = DEFAULT_PARTIAL_ALWAYS[:] self.precision = 0 self.show_missing = False + self.skip_covered = False # Defaults for [html] self.html_dir = "htmlcov" @@ -248,6 +249,7 @@ class CoverageConfig(object): ('partial_always_list', 'report:partial_branches_always', 'linelist'), ('precision', 'report:precision', 'int'), ('show_missing', 'report:show_missing', 'boolean'), + ('skip_covered', 'report:skip_covered', 'boolean'), # [html] ('html_dir', 'html:directory'), diff --git a/coverage/control.py b/coverage/control.py index a0a70de3..6ab5b4e4 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -732,7 +732,7 @@ class Coverage(object): def report(self, morfs=None, show_missing=True, ignore_errors=None, file=None, # pylint: disable=redefined-builtin - omit=None, include=None + omit=None, include=None, skip_covered=False, ): """Write a summary report to `file`. @@ -749,7 +749,7 @@ class Coverage(object): self._harvest_data() self.config.from_args( ignore_errors=ignore_errors, omit=omit, include=include, - show_missing=show_missing, + show_missing=show_missing, skip_covered=skip_covered, ) reporter = SummaryReporter(self, self.config) return reporter.report(morfs, outfile=file) diff --git a/coverage/summary.py b/coverage/summary.py index a166ec2c..c9877658 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -54,6 +54,9 @@ class SummaryReporter(Reporter): try: analysis = self.coverage._analyze(cu) nums = analysis.numbers + if self.config.skip_covered and nums.n_missing == 0 and \ + (not self.branches or nums.n_partial_branches == 0): + continue args = (cu.name, nums.n_statements, nums.n_missing) if self.branches: args += (nums.n_branches, nums.n_partial_branches) diff --git a/doc/config.rst b/doc/config.rst index cec14e0f..f9168ea6 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -191,6 +191,8 @@ example "87%". A value of 2 will display percentages like "87.32%". ``show_missing`` (boolean, default False): when running a summary report, show missing lines. See :ref:`cmd_summary` for more information. +``skip_covered`` (boolean, default False): when running a cli summary report, +skip 100% covered files. See :ref:`cmd_summary` for more information. .. _config_html: diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index a2ec5c0a..b7ab81e6 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -31,7 +31,7 @@ class BaseCmdLineTest(CoverageTest): ) defaults.report( ignore_errors=None, include=None, omit=None, morfs=[], - show_missing=None, + show_missing=None, skip_covered=None ) defaults.xml_report( ignore_errors=None, include=None, omit=None, morfs=[], outfile=None, @@ -347,6 +347,11 @@ class CmdLineTest(BaseCmdLineTest): .load() .report(morfs=["mod1", "mod2", "mod3"]) """) + self.cmd_executes("report -s", """\ + .coverage() + .load() + .report(skip_covered=True) + """) def test_run(self): # coverage run [-p] [-L] [--timid] MODULE.py [ARG1 ARG2 ...] diff --git a/tests/test_config.py b/tests/test_config.py index 15a0c569..26a22222 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -209,6 +209,7 @@ class ConfigFileTest(CoverageTest): while True: show_missing= TruE + skip_covered = TruE [{section}html] @@ -272,6 +273,7 @@ class ConfigFileTest(CoverageTest): ["plugins.a_plugin", "plugins.another"] ) self.assertTrue(cov.config.show_missing) + self.assertTrue(cov.config.skip_covered) self.assertEqual(cov.config.html_dir, r"c:\tricky\dir.somewhere") self.assertEqual(cov.config.extra_css, "something/extra.css") self.assertEqual(cov.config.html_title, "Title & nums # nums!") diff --git a/tests/test_summary.py b/tests/test_summary.py index 9973b3d5..cf255e51 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -223,6 +223,66 @@ class SummaryTest(CoverageTest): "TOTAL 11 2 8 3 63%" ) + def test_report_skip_covered_no_branches(self): + self.make_file("main.py", """ + import not_covered + + def normal(): + print("z") + normal() + """) + self.make_file("not_covered.py", """ + def not_covered(): + print("n") + """) + out = self.run_command("coverage run main.py") + self.assertEqual(out, "z\n") + report = self.report_from_command("coverage report --skip-covered") + + # pylint: disable=C0301 + # Name Stmts Miss Cover + # --------------------------------- + # not_covered 2 1 50% + + self.assertEqual(self.line_count(report), 3, report) + squeezed = self.squeezed_lines(report) + self.assertEqual( + squeezed[2], + "not_covered 2 1 50%" + ) + + def test_report_skip_covered_branches(self): + self.make_file("main.py", """ + import not_covered + + def normal(z): + if z: + print("z") + normal(True) + normal(False) + """) + self.make_file("not_covered.py", """ + def not_covered(n): + if n: + print("n") + not_covered(True) + """) + out = self.run_command("coverage run --branch main.py") + self.assertEqual(out, "n\nz\n") + report = self.report_from_command("coverage report --skip-covered") + + # pylint: disable=C0301 + # Name Stmts Miss Branch BrPart Cover + # ----------------------------------------------- + # not_covered 4 0 2 1 83% + + self.assertEqual(self.line_count(report), 3, report) + squeezed = self.squeezed_lines(report) + self.assertEqual( + squeezed[2], + "not_covered 4 0 2 1 83%" + ) + def test_dotpy_not_python(self): # We run a .py file, and when reporting, we can't parse it as Python. # We should get an error message in the report. |