summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/cmdline.py9
-rw-r--r--coverage/config.py2
-rw-r--r--coverage/control.py4
-rw-r--r--coverage/summary.py3
-rw-r--r--doc/config.rst2
-rw-r--r--tests/test_cmdline.py7
-rw-r--r--tests/test_config.py2
-rw-r--r--tests/test_summary.py60
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.