Skip to content

Commit 3d47c9f

Browse files
committed
feat: html index pages have 'hide covered' checkbox. #1384
1 parent 7771c53 commit 3d47c9f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+346
-114
lines changed

CHANGES.rst

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ Unreleased
3030

3131
- Other HTML report improvements:
3232

33+
- There is now a "hide covered" checkbox to filter out 100% files, finishing
34+
`issue 1384`_.
35+
3336
- The index page is always sorted by one of its columns, with clearer
3437
indications of the sorting.
3538

@@ -40,6 +43,8 @@ Unreleased
4043

4144
- Python 3.13.0a5 is supported.
4245

46+
.. _issue 1384: https://github.com/nedbat/coveragepy/issues/1384
47+
4348

4449
.. scriv-start-here
4550

coverage/html.py

+2
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ def index_page(self, first_html: str, final_html: str) -> None:
471471
"regions": self.file_summaries,
472472
"totals": self.totals,
473473
"column2": "",
474+
"skip_covered": self.skip_covered,
474475
"skipped_covered_msg": skipped_covered_msg,
475476
"skipped_empty_msg": skipped_empty_msg,
476477
"first_html": first_html,
@@ -550,6 +551,7 @@ class PageData:
550551
"regions": region_data.summaries,
551552
"totals": region_data.totals,
552553
"column2": noun,
554+
"skip_covered": self.skip_covered,
553555
"skipped_covered_msg": "",
554556
"skipped_empty_msg": "",
555557
"first_html": "index.html",

coverage/htmlfiles/coverage_html.js

+18-5
Original file line numberDiff line numberDiff line change
@@ -106,30 +106,39 @@ coverage.wire_up_filter = function () {
106106
const no_rows = document.getElementById("no_rows");
107107

108108
// Observe filter keyevents.
109-
document.getElementById("filter").addEventListener("input", debounce(event => {
109+
const filter_handler = (event => {
110110
// Keep running total of each metric, first index contains number of shown rows
111111
const totals = new Array(table.rows[0].cells.length).fill(0);
112112
// Accumulate the percentage as fraction
113113
totals[totals.length - 1] = { "numer": 0, "denom": 0 }; // nosemgrep: eslint.detect-object-injection
114114

115+
var text = document.getElementById("filter").value;
116+
const casefold = (text === text.toLowerCase());
117+
const hide100 = document.getElementById("hide100").checked;
118+
115119
// Hide / show elements.
116120
table_body_rows.forEach(row => {
117121
var show = false;
118-
var target = event.target.value;
119-
var casefold = (target === target.toLowerCase());
122+
// Check the text filter.
120123
for (let column = 0; column < totals.length; column++) {
121124
cell = row.cells[column];
122125
if (cell.classList.contains("name")) {
123126
var celltext = cell.textContent;
124127
if (casefold) {
125128
celltext = celltext.toLowerCase();
126129
}
127-
if (celltext.includes(target)) {
130+
if (celltext.includes(text)) {
128131
show = true;
129132
}
130133
}
131134
}
132135

136+
// Check the "hide covered" filter.
137+
if (show && hide100) {
138+
const [numer, denom] = row.cells[row.cells.length - 1].dataset.ratio.split(" ");
139+
show = (numer !== denom);
140+
}
141+
133142
if (!show) {
134143
// hide
135144
row.classList.add("hidden");
@@ -196,11 +205,15 @@ coverage.wire_up_filter = function () {
196205
cell.textContent = totals[column]; // nosemgrep: eslint.detect-object-injection
197206
}
198207
}
199-
}));
208+
});
209+
210+
document.getElementById("filter").addEventListener("input", debounce(filter_handler));
211+
document.getElementById("hide100").addEventListener("input", debounce(filter_handler));
200212

201213
// Trigger change event on setup, to force filter on page refresh
202214
// (filter value may still be present).
203215
document.getElementById("filter").dispatchEvent(new Event("input"));
216+
document.getElementById("hide100").dispatchEvent(new Event("input"));
204217
};
205218

206219
// Set up the click-to-sort columns.

coverage/htmlfiles/index.html

+4
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ <h1>{{ title|escape }}:
5858

5959
<form id="filter_container">
6060
<input id="filter" type="text" value="" placeholder="filter..." />
61+
<div>
62+
<input id="hide100" type="checkbox" {% if skip_covered %}checked disabled {% endif %}/>
63+
<label for="hide100">hide covered</label>
64+
</div>
6165
</form>
6266

6367
<p class="text">

coverage/htmlfiles/style.css

+14-6
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,25 @@ footer .content { padding: 0; color: #666; font-style: italic; }
6868

6969
h1 { font-size: 1.25em; display: inline-block; }
7070

71-
#filter_container { float: right; margin: 0 2em 0 0; }
71+
#filter_container { float: right; margin: 0 2em 0 0; line-height: 1.66em; }
7272

73-
#filter_container input { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; }
73+
#filter_container #filter { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; }
7474

75-
@media (prefers-color-scheme: dark) { #filter_container input { border-color: #444; } }
75+
@media (prefers-color-scheme: dark) { #filter_container #filter { border-color: #444; } }
7676

77-
@media (prefers-color-scheme: dark) { #filter_container input { background: #1e1e1e; } }
77+
@media (prefers-color-scheme: dark) { #filter_container #filter { background: #1e1e1e; } }
7878

79-
@media (prefers-color-scheme: dark) { #filter_container input { color: #eee; } }
79+
@media (prefers-color-scheme: dark) { #filter_container #filter { color: #eee; } }
8080

81-
#filter_container input:focus { border-color: #007acc; }
81+
#filter_container #filter:focus { border-color: #007acc; }
82+
83+
#filter_container :disabled ~ label { color: #ccc; }
84+
85+
@media (prefers-color-scheme: dark) { #filter_container :disabled ~ label { color: #444; } }
86+
87+
#filter_container label { font-size: .875em; color: #666; }
88+
89+
@media (prefers-color-scheme: dark) { #filter_container label { color: #aaa; } }
8290

8391
header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; color: inherit; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; }
8492

coverage/htmlfiles/style.scss

+13-1
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,9 @@ h1 {
245245
#filter_container {
246246
float: right;
247247
margin: 0 2em 0 0;
248+
line-height: 1.66em;
248249

249-
input {
250+
#filter {
250251
width: 10em;
251252
padding: 0.2em 0.5em;
252253
border: 2px solid $light-gray3;
@@ -259,6 +260,17 @@ h1 {
259260
border-color: $focus-color;
260261
}
261262
}
263+
264+
:disabled ~ label{
265+
color: $light-gray3;
266+
@include color-dark($dark-gray3);
267+
}
268+
269+
label {
270+
font-size: .875em;
271+
color: $light-gray5;
272+
@include color-dark($dark-gray5);
273+
}
262274
}
263275

264276
header button {

tests/gold/html/a/class_index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ <h1>Coverage report:
4343
</aside>
4444
<form id="filter_container">
4545
<input id="filter" type="text" value="" placeholder="filter..." />
46+
<div>
47+
<input id="hide100" type="checkbox" />
48+
<label for="hide100">hide covered</label>
49+
</div>
4650
</form>
4751
<p class="text">
4852
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
49-
created at 2024-04-18 11:22 -0400
53+
created at 2024-04-19 13:27 -0400
5054
</p>
5155
</div>
5256
</header>
@@ -91,7 +95,7 @@ <h1>Coverage report:
9195
<div class="content">
9296
<p>
9397
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
94-
created at 2024-04-18 11:22 -0400
98+
created at 2024-04-19 13:27 -0400
9599
</p>
96100
</div>
97101
<aside class="hidden">

tests/gold/html/a/function_index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ <h1>Coverage report:
4343
</aside>
4444
<form id="filter_container">
4545
<input id="filter" type="text" value="" placeholder="filter..." />
46+
<div>
47+
<input id="hide100" type="checkbox" />
48+
<label for="hide100">hide covered</label>
49+
</div>
4650
</form>
4751
<p class="text">
4852
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
49-
created at 2024-04-18 11:22 -0400
53+
created at 2024-04-19 13:27 -0400
5054
</p>
5155
</div>
5256
</header>
@@ -91,7 +95,7 @@ <h1>Coverage report:
9195
<div class="content">
9296
<p>
9397
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
94-
created at 2024-04-18 11:22 -0400
98+
created at 2024-04-19 13:27 -0400
9599
</p>
96100
</div>
97101
<aside class="hidden">

tests/gold/html/a/index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,14 @@ <h1>Coverage report:
4242
</aside>
4343
<form id="filter_container">
4444
<input id="filter" type="text" value="" placeholder="filter..." />
45+
<div>
46+
<input id="hide100" type="checkbox" />
47+
<label for="hide100">hide covered</label>
48+
</div>
4549
</form>
4650
<p class="text">
4751
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
48-
created at 2024-04-18 11:22 -0400
52+
created at 2024-04-19 13:27 -0400
4953
</p>
5054
</div>
5155
</header>
@@ -87,7 +91,7 @@ <h1>Coverage report:
8791
<div class="content">
8892
<p>
8993
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
90-
created at 2024-04-18 11:22 -0400
94+
created at 2024-04-19 13:27 -0400
9195
</p>
9296
</div>
9397
<aside class="hidden">

tests/gold/html/b_branch/class_index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,14 @@ <h1>Coverage report:
4545
</aside>
4646
<form id="filter_container">
4747
<input id="filter" type="text" value="" placeholder="filter..." />
48+
<div>
49+
<input id="hide100" type="checkbox" />
50+
<label for="hide100">hide covered</label>
51+
</div>
4852
</form>
4953
<p class="text">
5054
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
51-
created at 2024-04-18 11:22 -0400
55+
created at 2024-04-19 13:27 -0400
5256
</p>
5357
</div>
5458
</header>
@@ -99,7 +103,7 @@ <h1>Coverage report:
99103
<div class="content">
100104
<p>
101105
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
102-
created at 2024-04-18 11:22 -0400
106+
created at 2024-04-19 13:27 -0400
103107
</p>
104108
</div>
105109
<aside class="hidden">

tests/gold/html/b_branch/function_index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,14 @@ <h1>Coverage report:
4545
</aside>
4646
<form id="filter_container">
4747
<input id="filter" type="text" value="" placeholder="filter..." />
48+
<div>
49+
<input id="hide100" type="checkbox" />
50+
<label for="hide100">hide covered</label>
51+
</div>
4852
</form>
4953
<p class="text">
5054
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
51-
created at 2024-04-18 11:22 -0400
55+
created at 2024-04-19 13:27 -0400
5256
</p>
5357
</div>
5458
</header>
@@ -129,7 +133,7 @@ <h1>Coverage report:
129133
<div class="content">
130134
<p>
131135
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
132-
created at 2024-04-18 11:22 -0400
136+
created at 2024-04-19 13:27 -0400
133137
</p>
134138
</div>
135139
<aside class="hidden">

tests/gold/html/b_branch/index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ <h1>Coverage report:
4444
</aside>
4545
<form id="filter_container">
4646
<input id="filter" type="text" value="" placeholder="filter..." />
47+
<div>
48+
<input id="hide100" type="checkbox" />
49+
<label for="hide100">hide covered</label>
50+
</div>
4751
</form>
4852
<p class="text">
4953
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
50-
created at 2024-04-18 11:22 -0400
54+
created at 2024-04-19 13:27 -0400
5155
</p>
5256
</div>
5357
</header>
@@ -95,7 +99,7 @@ <h1>Coverage report:
9599
<div class="content">
96100
<p>
97101
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
98-
created at 2024-04-18 11:22 -0400
102+
created at 2024-04-19 13:27 -0400
99103
</p>
100104
</div>
101105
<aside class="hidden">

tests/gold/html/bom/class_index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ <h1>Coverage report:
4343
</aside>
4444
<form id="filter_container">
4545
<input id="filter" type="text" value="" placeholder="filter..." />
46+
<div>
47+
<input id="hide100" type="checkbox" />
48+
<label for="hide100">hide covered</label>
49+
</div>
4650
</form>
4751
<p class="text">
4852
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
49-
created at 2024-04-18 11:22 -0400
53+
created at 2024-04-19 13:27 -0400
5054
</p>
5155
</div>
5256
</header>
@@ -91,7 +95,7 @@ <h1>Coverage report:
9195
<div class="content">
9296
<p>
9397
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
94-
created at 2024-04-18 11:22 -0400
98+
created at 2024-04-19 13:27 -0400
9599
</p>
96100
</div>
97101
<aside class="hidden">

tests/gold/html/bom/function_index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ <h1>Coverage report:
4343
</aside>
4444
<form id="filter_container">
4545
<input id="filter" type="text" value="" placeholder="filter..." />
46+
<div>
47+
<input id="hide100" type="checkbox" />
48+
<label for="hide100">hide covered</label>
49+
</div>
4650
</form>
4751
<p class="text">
4852
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
49-
created at 2024-04-18 11:22 -0400
53+
created at 2024-04-19 13:27 -0400
5054
</p>
5155
</div>
5256
</header>
@@ -91,7 +95,7 @@ <h1>Coverage report:
9195
<div class="content">
9296
<p>
9397
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
94-
created at 2024-04-18 11:22 -0400
98+
created at 2024-04-19 13:27 -0400
9599
</p>
96100
</div>
97101
<aside class="hidden">

tests/gold/html/bom/index.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,14 @@ <h1>Coverage report:
4242
</aside>
4343
<form id="filter_container">
4444
<input id="filter" type="text" value="" placeholder="filter..." />
45+
<div>
46+
<input id="hide100" type="checkbox" />
47+
<label for="hide100">hide covered</label>
48+
</div>
4549
</form>
4650
<p class="text">
4751
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
48-
created at 2024-04-18 11:22 -0400
52+
created at 2024-04-19 13:27 -0400
4953
</p>
5054
</div>
5155
</header>
@@ -87,7 +91,7 @@ <h1>Coverage report:
8791
<div class="content">
8892
<p>
8993
<a class="nav" href="https://coverage.readthedocs.io/en/7.5.0a1.dev1">coverage.py v7.5.0a1.dev1</a>,
90-
created at 2024-04-18 11:22 -0400
94+
created at 2024-04-19 13:27 -0400
9195
</p>
9296
</div>
9397
<aside class="hidden">

0 commit comments

Comments
 (0)