Skip to content

Commit 32e5df1

Browse files
committed
1.1.6
- uses the correct values for git - reduces error in calculating coverage points by abstracting to helper method - ensures that the history is sorted correctly - fixes the generation of graphs to be more accurate (using total data instead of just a single file) - fixes the generation of badges to be more accurate (using total data instead of just a single file) - updates dependencies - fixes the calculation of source files
1 parent 9edc40b commit 32e5df1

22 files changed

+316
-251
lines changed

.eslintignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
node_modules
2-
coverage
2+
/coverage
3+
/test/fixtures
34
docs
45
dist
56
npm-debug.log

CHANGELOG.md

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
# 1.1.6 (10/25/2017)
2+
3+
- uses the correct values for git
4+
- reduces error in calculating coverage points by abstracting to helper method
5+
- ensures that the history is sorted correctly
6+
- fixes the generation of graphs to be more accurate (using total data instead of just a single file)
7+
- fixes the generation of badges to be more accurate (using total data instead of just a single file)
8+
- updates dependencies
9+
- fixes the calculation of source files
10+
111
# 1.1.5 (10/25/2017)
212

313
- guards retrieval of values

dist/bundle.js

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vendor.bundle.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/code/Coverage.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ <h4 class="name" id="Coverage"><span class="type-signature"></span>new Coverage<
6565

6666
<dt class="tag-source">Source:</dt>
6767
<dd class="tag-source"><ul class="dummy"><li>
68-
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line3">line 3</a>
68+
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line4">line 4</a>
6969
</li></ul></dd>
7070

7171

@@ -1255,7 +1255,7 @@ <h4 class="name" id=".get"><span class="type-signature">(static) </span>get<span
12551255

12561256
<dt class="tag-source">Source:</dt>
12571257
<dd class="tag-source"><ul class="dummy"><li>
1258-
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line151">line 151</a>
1258+
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line152">line 152</a>
12591259
</li></ul></dd>
12601260

12611261

@@ -1455,7 +1455,7 @@ <h4 class="name" id=".repos"><span class="type-signature">(static) </span>repos<
14551455

14561456
<dt class="tag-source">Source:</dt>
14571457
<dd class="tag-source"><ul class="dummy"><li>
1458-
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line123">line 123</a>
1458+
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line124">line 124</a>
14591459
</li></ul></dd>
14601460

14611461

@@ -1612,7 +1612,7 @@ <h4 class="name" id=".save"><span class="type-signature">(static) </span>save<sp
16121612

16131613
<dt class="tag-source">Source:</dt>
16141614
<dd class="tag-source"><ul class="dummy"><li>
1615-
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line101">line 101</a>
1615+
<a href="coverage.js.html">coverage.js</a>, <a href="coverage.js.html#line102">line 102</a>
16161616
</li></ul></dd>
16171617

16181618

docs/code/coverage.js.html

+17-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ <h1 class="page-title">coverage.js</h1>
3838
<section>
3939
<article>
4040
<pre class="prettyprint source linenums"><code>const mongoose = require('mongoose');
41+
const moment = require('moment');
4142

4243
/**
4344
* @class Coverage
@@ -199,7 +200,6 @@ <h1 class="page-title">coverage.js</h1>
199200
return new Promise((resolve, reject) => {
200201
let options = [
201202
{ $match: { "git.remotes.url": repo } },
202-
{ $sort : { "run_at" : -1 } },
203203
{ $limit: parseInt(limit) },
204204
{
205205
$group: {
@@ -211,12 +211,26 @@ <h1 class="page-title">coverage.js</h1>
211211
}];
212212

213213
if(!limit) {
214-
delete options[2];
215-
options = options.filter((n) => n != undefined);
214+
delete options[1];
215+
options = options.filter((n) => n !== undefined);
216216
}
217217

218218
Coverage.aggregate(options, (err, docs) => {
219219
if(err) { return reject(err); }
220+
// this might happen if the data is malformed
221+
if(docs.length > 1) {
222+
var condensed = docs[0];
223+
for(var i = 1; i &lt; docs.length; i++) {
224+
condensed.history = condensed.history.concat(docs[i].history);
225+
}
226+
condensed.history = condensed.history.sort((a, b) => {
227+
return moment(a['run_at']) - moment(b['run_at']) > 0 ? -1 : 1;
228+
});
229+
return resolve([condensed]);
230+
}
231+
docs[0].history = docs[0].history.sort((a, b) => {
232+
return moment(a['run_at']) - moment(b['run_at']) > 0 ? -1 : 1;
233+
});
220234
return resolve(docs);
221235
});
222236
});

docs/index.html

+1-1
Large diffs are not rendered by default.

index.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,16 @@ app.get('/badge/:service/:owner/:repo.svg', asyncMiddleware(async (req, res) =>
100100
const coverages = await Coverage.get(new RegExp(`${service.replace(/%2E/g, '.')}.*/${owner}/${repo}`), 1);
101101
const coverage = coverages[0];
102102
const { history } = coverage;
103-
const lastRun = history[history.length - 1];
104-
const { lines } = lastRun.source_files[0];
105-
const percentage = parseInt((lines.hit / lines.found) * 100);
106-
const color = percentage >= 90 ? '#3DB712' : percentage <= 89 && percentage >= 80 ? '#caa300' : '#cc5338';
103+
const { source_files } = history[0];
104+
let found = 0;
105+
let hit = 0;
106+
source_files.forEach((file) => {
107+
const { lines={hit: 0, found: 0}, branches={hit: 0, found: 0}, functions={hit: 0, found: 0} } = file;
108+
found += lines.found + branches.found + functions.found;
109+
hit += lines.hit + branches.hit + functions.hit;
110+
});
111+
const percentage = parseInt((hit / found) * 100);
112+
const color = percentage >= 85 ? '#3DB712' : percentage <= 85 && percentage >= 70 ? '#caa300' : '#cc5338';
107113

108114
Badge({ color: { right: color }, text: ['coverage', `${percentage}%`] }, function(err, badge) {
109115
if(err) { throw new Error(err); }

lib/coverage.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const mongoose = require('mongoose');
2+
const moment = require('moment');
23

34
/**
45
* @class Coverage
@@ -160,7 +161,6 @@ module.exports.get = function get(repo, limit) {
160161
return new Promise((resolve, reject) => {
161162
let options = [
162163
{ $match: { "git.remotes.url": repo } },
163-
{ $sort : { "run_at" : -1 } },
164164
{ $limit: parseInt(limit) },
165165
{
166166
$group: {
@@ -172,12 +172,26 @@ module.exports.get = function get(repo, limit) {
172172
}];
173173

174174
if(!limit) {
175-
delete options[2];
176-
options = options.filter((n) => n != undefined);
175+
delete options[1];
176+
options = options.filter((n) => n !== undefined);
177177
}
178178

179179
Coverage.aggregate(options, (err, docs) => {
180180
if(err) { return reject(err); }
181+
// this might happen if the data is malformed
182+
if(docs.length > 1) {
183+
var condensed = docs[0];
184+
for(var i = 1; i < docs.length; i++) {
185+
condensed.history = condensed.history.concat(docs[i].history);
186+
}
187+
condensed.history = condensed.history.sort((a, b) => {
188+
return moment(a['run_at']) - moment(b['run_at']) > 0 ? -1 : 1;
189+
});
190+
return resolve([condensed]);
191+
}
192+
docs[0].history = docs[0].history.sort((a, b) => {
193+
return moment(a['run_at']) - moment(b['run_at']) > 0 ? -1 : 1;
194+
});
181195
return resolve(docs);
182196
});
183197
});

package.json

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lcov-server",
3-
"version": "1.1.5",
3+
"version": "1.1.6",
44
"description": "🎯 A simple lcov server & cli parser",
55
"main": "index.js",
66
"homepage": "https://github.com/gabrielcsapo/lcov-server#readme",
@@ -56,15 +56,15 @@
5656
"compression": "^1.7.1",
5757
"express": "^4.16.2",
5858
"git-url-parse": "^7.0.1",
59-
"mongoose": "^4.12.1",
59+
"mongoose": "^4.12.4",
6060
"openbadge": "^1.0.4",
6161
"serve-static": "^1.13.1",
6262
"update-notifier": "^2.3.0",
6363
"xml2js": "^0.4.19"
6464
},
6565
"devDependencies": {
66-
"@storybook/addon-knobs": "^3.2.12",
67-
"@storybook/react": "^3.2.12",
66+
"@storybook/addon-knobs": "^3.2.13",
67+
"@storybook/react": "^3.2.13",
6868
"babel-cli": "^6.26.0",
6969
"babel-core": "^6.26.0",
7070
"babel-loader": "^7.1.2",
@@ -74,7 +74,7 @@
7474
"body-parser": "^1.18.2",
7575
"css-loader": "^0.28.7",
7676
"docdash": "^0.4.0",
77-
"eslint": "^4.8.0",
77+
"eslint": "^4.9.0",
7878
"eslint-plugin-react": "^7.4.0",
7979
"getstorybook": "^1.7.0",
8080
"highlight.js": "^9.12.0",
@@ -91,9 +91,9 @@
9191
"style-loader": "^0.19.0",
9292
"tap": "^10.7.2",
9393
"tape": "^4.8.0",
94-
"tryitout": "^0.3.4",
95-
"webpack": "^3.7.1",
96-
"webpack-dev-server": "^2.9.1",
94+
"tryitout": "^0.3.6",
95+
"webpack": "^3.8.1",
96+
"webpack-dev-server": "^2.9.3",
9797
"whatwg-fetch": "^2.0.3"
9898
}
9999
}

src/coverage/chart.js src/components/coverageChart.js

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
24
import LineChart from '../lib/chart/line';
35

46
class CoverageChart extends React.Component {
57
render() {
6-
const { data, height, width, axis } = this.props;
8+
const { data, height, width } = this.props;
79

810
const opt = {
911
data,
1012
colors: ['#9a8585', '#a7daff', '#f7ca97'],
1113
labels: ['Lines', 'Branches', 'Functions'],
12-
axis,
1314
width,
1415
height,
1516
lines: true,
@@ -21,8 +22,14 @@ class CoverageChart extends React.Component {
2122

2223
return (
2324
<LineChart {...opt} />
24-
)
25+
);
2526
}
2627
}
2728

29+
CoverageChart.propTypes = {
30+
data: PropTypes.array,
31+
height: PropTypes.number,
32+
width: PropTypes.number
33+
};
34+
2835
export default CoverageChart;

src/components/error.js

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class Error extends React.Component {
1212
<pre style={{width: '50%', margin: '0 auto'}}>
1313
{ error || 'Page not found' }
1414
</pre>
15+
<br/>
16+
<a href="/"> Go Somewhere Safe 🏝 </a>
1517
</div>);
1618
}
1719
}

src/components/fileView.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
border: 0;
33
}
44

5-
.table-fileView td, .hljs-string, .hljs-keyword, .hljs-comment, .hljs-meta, .hljs-params, .hljs-function, .hljs-attr, .hljs-built_in, .hljs-title, .hljs-literal {
5+
.table-fileView tr, .table-fileView tr > *, .table-fileView td span {
66
font-family: monospace;
77
}

src/components/loading.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import React from 'react';
22

33
class Loading extends React.Component {
44
render() {
5-
return (<div className="text-center" style={{width:"100%",position: "absolute",top: "50%",transform: "translateY(-50%)"}}>
6-
Loading 🌪
5+
return (<div className="coverage text-center" style={{ border: "1px solid #dedede", position: "relative", height: "300px" }}>
6+
<div style={{width:"100%",position: "absolute",top: "50%",transform: "translateY(-50%)"}}>
7+
<div className="spinner spinner-black"></div>
8+
</div>
79
</div>);
810
}
911
}

src/components/noCoverage.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
3+
class noCoverage extends React.Component {
4+
render() {
5+
return (<div className="coverage text-center" style={{ border: "1px solid #dedede", position: "relative", height: "300px" }}>
6+
<div style={{width:"100%",position: "absolute",top: "50%",transform: "translateY(-50%)"}}>
7+
No Coverage 🌧
8+
</div>
9+
</div>);
10+
}
11+
}
12+
13+
export default noCoverage;

src/components/table.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ class Table extends React.Component {
1212
page: 1
1313
};
1414
}
15-
1615
nextPage() {
1716
const { page, data } = this.state;
1817

@@ -42,12 +41,13 @@ class Table extends React.Component {
4241
</tr>
4342
</thead>
4443
<tbody>
45-
{data[page - 1].map((h, i) => {
46-
return (<tr key={`${page}/${i}`}>
47-
{ Object.keys(h).map((k) => {
48-
return <td key={`${k}/${i}`}> <div className={ k === 'Commit' ? 'coverage-commit-message' : ''}>{ h[k] }</div> </td>;
49-
})}
50-
</tr>); })}
44+
{ data[page - 1].map((h, i) => {
45+
return (<tr key={`${page}/${i}`}>
46+
{ Object.keys(h).map((k) => {
47+
return <td key={`${k}/${i}`}> <div className={ k === 'Commit' ? 'coverage-commit-message' : ''}>{ h[k] }</div> </td>;
48+
})}
49+
</tr>);
50+
}) }
5151
</tbody>
5252
</table>
5353
{ data.length > 1 ?
@@ -65,11 +65,13 @@ class Table extends React.Component {
6565

6666
Table.propTypes = {
6767
data: PropTypes.array,
68+
sort: PropTypes.string,
6869
chunk: PropTypes.number
6970
};
7071

7172
Table.defaultProps = {
7273
data: [],
74+
sort: '',
7375
chunk: 5
7476
};
7577

0 commit comments

Comments
 (0)