Skip to content

Commit d09fde2

Browse files
authored
feat: badge changes color depending on coverage (#8)
1 parent 418466c commit d09fde2

File tree

5 files changed

+123
-10
lines changed

5 files changed

+123
-10
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,15 @@ update-badge
4444

4545
If the coverage summary has 96%, then the above badge would be updated to
4646

47-
4847
![code coverage](https://img.shields.io/badge/code--coverage-96%-brightgreen)
4948

5049
Related project: [dependency-version-badge](https://github.com/bahmutov/dependency-version-badge)
5150

51+
The badges will have different colors, depending on the coverage, see [bin/update-badge.js](bin/update-badge.js)
52+
53+
## Debug
54+
55+
To see verbose log messages, run with `DEBUG=check-code-coverage` environment variable
56+
5257
[ci image]: https://github.com/bahmutov/check-code-coverage/workflows/ci/badge.svg?branch=master
5358
[ci url]: https://github.com/bahmutov/check-code-coverage/actions

bin/update-badge.js

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,27 @@
11
#!/usr/bin/env node
22
// @ts-check
33

4+
const debug = require('debug')('check-code-coverage')
45
const path = require('path')
56
const fs = require('fs')
67

8+
const availableColors = ['red', 'yellow', 'green', 'brightgreen']
9+
10+
const availableColorsReStr = '(:?' + availableColors.join('|') + ')'
11+
12+
function getColor(coveredPercent) {
13+
if (coveredPercent < 60) {
14+
return 'red'
15+
}
16+
if (coveredPercent < 80) {
17+
return 'yellow'
18+
}
19+
if (coveredPercent < 90) {
20+
return 'green'
21+
}
22+
return 'brightgreen'
23+
}
24+
725
function updateBadge() {
826
const coverageFilename = path.join(process.cwd(), 'coverage', 'coverage-summary.json')
927
const coverage = require(coverageFilename)
@@ -13,15 +31,28 @@ function updateBadge() {
1331
const readmeText = fs.readFileSync(readmeFilename, 'utf8')
1432

1533
function replaceShield() {
34+
const color = getColor(pct)
35+
debug('for coverage %d% badge color "%s"', pct, color)
36+
if (!availableColors.includes(color)) {
37+
console.error('cannot pick code coverage color for %d%', pct)
38+
console.error('color "%s" is invalid', color)
39+
return readmeText
40+
}
41+
1642
// note, Shields.io escaped '-' with '--'
1743
const coverageRe = new RegExp(
18-
'https://img\\.shields\\.io/badge/code--coverage-(\\d+)%-brightgreen',
44+
`https://img\\.shields\\.io/badge/code--coverage-\\d+%-${availableColorsReStr}`,
1945
)
20-
const coverageBadge = `https://img.shields.io/badge/code--coverage-${pct}%-brightgreen`
46+
const coverageBadge = `https://img.shields.io/badge/code--coverage-${pct}%-${color}`
47+
debug('coverage regex: "%s"', coverageRe)
48+
debug('new coverage badge: "%s"', coverageBadge)
2149

2250
const updatedReadmeText = readmeText.replace(
2351
coverageRe,
24-
coverageBadge,
52+
(match) => {
53+
debug('match: %o', match)
54+
return coverageBadge
55+
},
2556
)
2657
return updatedReadmeText
2758
}
@@ -30,6 +61,8 @@ function updateBadge() {
3061
if (maybeChangedText !== readmeText) {
3162
console.log('saving updated readme with coverage %d%%', pct)
3263
fs.writeFileSync(readmeFilename, maybeChangedText, 'utf8')
64+
} else {
65+
debug('no code coverage badge change')
3366
}
3467
}
3568

coverage/coverage-summary.json

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,80 @@
1-
{"total": {"lines":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":3,"covered":3,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
2-
,"/Users/gleb/git/instrument-example/src/App.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
3-
,"/Users/gleb/git/instrument-example/src/index.js": {"lines":{"total":2,"covered":2,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":2,"covered":2,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
1+
{
2+
"total": {
3+
"lines": {
4+
"total": 3,
5+
"covered": 3,
6+
"skipped": 0,
7+
"pct": 100
8+
},
9+
"statements": {
10+
"total": 3,
11+
"covered": 3,
12+
"skipped": 0,
13+
"pct": 100
14+
},
15+
"functions": {
16+
"total": 1,
17+
"covered": 1,
18+
"skipped": 0,
19+
"pct": 100
20+
},
21+
"branches": {
22+
"total": 0,
23+
"covered": 0,
24+
"skipped": 0,
25+
"pct": 100
26+
}
27+
},
28+
"/Users/gleb/git/instrument-example/src/App.js": {
29+
"lines": {
30+
"total": 1,
31+
"covered": 1,
32+
"skipped": 0,
33+
"pct": 100
34+
},
35+
"functions": {
36+
"total": 1,
37+
"covered": 1,
38+
"skipped": 0,
39+
"pct": 100
40+
},
41+
"statements": {
42+
"total": 1,
43+
"covered": 1,
44+
"skipped": 0,
45+
"pct": 100
46+
},
47+
"branches": {
48+
"total": 0,
49+
"covered": 0,
50+
"skipped": 0,
51+
"pct": 100
52+
}
53+
},
54+
"/Users/gleb/git/instrument-example/src/index.js": {
55+
"lines": {
56+
"total": 2,
57+
"covered": 2,
58+
"skipped": 0,
59+
"pct": 100
60+
},
61+
"functions": {
62+
"total": 0,
63+
"covered": 0,
64+
"skipped": 0,
65+
"pct": 100
66+
},
67+
"statements": {
68+
"total": 2,
69+
"covered": 2,
70+
"skipped": 0,
71+
"pct": 100
72+
},
73+
"branches": {
74+
"total": 0,
75+
"covered": 0,
76+
"skipped": 0,
77+
"pct": 100
78+
}
79+
}
480
}

package-lock.json

Lines changed: 1 addition & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
},
3838
"dependencies": {
3939
"arg": "4.1.3",
40+
"debug": "4.1.1",
4041
"lodash": "4.17.15"
4142
}
4243
}

0 commit comments

Comments
 (0)