Skip to content

Commit ba7e1db

Browse files
Report descending sort option (#1005)
* added descending sort option in coverage report * commandline option for report sort added * Fix tests for pull #1005 * conditional statements improved * sort option help updated with choices * commandline test for sort added Co-authored-by: Ned Batchelder <[email protected]>
1 parent f28b1db commit ba7e1db

File tree

5 files changed

+27
-3
lines changed

5 files changed

+27
-3
lines changed

coverage/cmdline.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ class Opts(object):
8585
"which isn't done by default."
8686
),
8787
)
88+
sort = optparse.make_option(
89+
'--sort', action='store', metavar='COLUMN',
90+
help="Sort the report by the named column: name, stmts, miss, branch, brpart, or cover. "
91+
"Default is name."
92+
)
8893
show_missing = optparse.make_option(
8994
'-m', '--show-missing', action='store_true',
9095
help="Show line numbers of statements in each module that weren't executed.",
@@ -221,6 +226,7 @@ def __init__(self, *args, **kwargs):
221226
skip_covered=None,
222227
skip_empty=None,
223228
show_contexts=None,
229+
sort=None,
224230
source=None,
225231
timid=None,
226232
title=None,
@@ -410,6 +416,7 @@ def get_prog_name(self):
410416
Opts.include,
411417
Opts.omit,
412418
Opts.precision,
419+
Opts.sort,
413420
Opts.show_missing,
414421
Opts.skip_covered,
415422
Opts.no_skip_covered,
@@ -601,6 +608,7 @@ def command_line(self, argv):
601608
skip_covered=options.skip_covered,
602609
skip_empty=options.skip_empty,
603610
precision=options.precision,
611+
sort=options.sort,
604612
**report_args
605613
)
606614
elif options.action == "annotate":

coverage/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ def __init__(self):
211211
self.show_missing = False
212212
self.skip_covered = False
213213
self.skip_empty = False
214+
self.sort = None
214215

215216
# Defaults for [html]
216217
self.extra_css = None

coverage/control.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ def _get_file_reporters(self, morfs=None):
831831
def report(
832832
self, morfs=None, show_missing=None, ignore_errors=None,
833833
file=None, omit=None, include=None, skip_covered=None,
834-
contexts=None, skip_empty=None, precision=None,
834+
contexts=None, skip_empty=None, precision=None, sort=None
835835
):
836836
"""Write a textual summary report to `file`.
837837
@@ -882,6 +882,7 @@ def report(
882882
ignore_errors=ignore_errors, report_omit=omit, report_include=include,
883883
show_missing=show_missing, skip_covered=skip_covered,
884884
report_contexts=contexts, skip_empty=skip_empty, precision=precision,
885+
sort=sort
885886
):
886887
reporter = SummaryReporter(self)
887888
return reporter.report(morfs, outfile=file)

coverage/summary.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,18 @@ def report(self, morfs, outfile=None):
104104

105105
# Sort the lines and write them out.
106106
if getattr(self.config, 'sort', None):
107-
position = column_order.get(self.config.sort.lower())
107+
sort_option = self.config.sort.lower()
108+
reverse = False
109+
if sort_option[0] == '-':
110+
reverse = True
111+
sort_option = sort_option[1:]
112+
elif sort_option[0] == '+':
113+
sort_option = sort_option[1:]
114+
115+
position = column_order.get(sort_option)
108116
if position is None:
109117
raise CoverageException("Invalid sorting option: {!r}".format(self.config.sort))
110-
lines.sort(key=lambda l: (l[1][position], l[0]))
118+
lines.sort(key=lambda l: (l[1][position], l[0]), reverse=reverse)
111119

112120
for line in lines:
113121
self.writeout(line[0])

tests/test_cmdline.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class BaseCmdLineTest(CoverageTest):
4242
_defaults.Coverage().report(
4343
ignore_errors=None, include=None, omit=None, morfs=[],
4444
show_missing=None, skip_covered=None, contexts=None, skip_empty=None, precision=None,
45+
sort=None,
4546
)
4647
_defaults.Coverage().xml_report(
4748
ignore_errors=None, include=None, omit=None, morfs=[], outfile=None,
@@ -402,6 +403,11 @@ def test_report(self):
402403
cov.load()
403404
cov.report(contexts=["foo", "bar"])
404405
""")
406+
self.cmd_executes("report --sort=-foo", """\
407+
cov = Coverage()
408+
cov.load()
409+
cov.report(sort='-foo')
410+
""")
405411

406412
def test_run(self):
407413
# coverage run [-p] [-L] [--timid] MODULE.py [ARG1 ARG2 ...]

0 commit comments

Comments
 (0)