Skip to content

Commit 38eb1fa

Browse files
committed
1.2.1
- adds a feed of most recent coverage updates - moves more functionality to use async await syntax
1 parent c2d5337 commit 38eb1fa

10 files changed

+159
-31
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 1.2.1 (10/28/2017)
2+
3+
- adds a feed of most recent coverage updates
4+
- moves more functionality to use async await syntax
5+
16
# 1.2.0 (10/27/2017)
27

38
- don't override commit for travis builds

dist/bundle.js

+9-9
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.

index.js

+12
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,18 @@ app.get('/api/repos', asyncMiddleware(async (req, res) => {
6868
}
6969
}));
7070

71+
app.get('/api/feed/:page?', asyncMiddleware(async (req, res) => {
72+
const { page } = req.params;
73+
74+
try {
75+
const feed = await Coverage.feed(page);
76+
res.send(feed);
77+
} catch(error) {
78+
res.status(500);
79+
res.send({ error });
80+
}
81+
}));
82+
7183
app.get('/api/repos/:service/:owner/', asyncMiddleware(async (req, res) => {
7284
const { service, owner } = req.params;
7385

lib/coverage.js

+14
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,17 @@ module.exports.get = function get(repo, limit) {
197197
});
198198
});
199199
};
200+
201+
module.exports.feed = function feed(limit=10) {
202+
return new Promise((resolve, reject) => {
203+
let options = [
204+
{ $sort: { "run_at": -1 } },
205+
{ $limit: parseInt(limit) }
206+
];
207+
208+
Coverage.aggregate(options, (err, docs) => {
209+
if(err) { return reject(err); }
210+
return resolve(docs);
211+
});
212+
});
213+
};

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lcov-server",
3-
"version": "1.2.0",
3+
"version": "1.2.1",
44
"description": "🎯 A simple lcov server & cli parser",
55
"main": "index.js",
66
"homepage": "https://github.com/gabrielcsapo/lcov-server#readme",

src/coverage/coverage.js

+19-19
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3-
import moment from 'moment';
3+
import Moment from 'moment';
44
import Select from 'react-select';
55

66
import CoverageChart from '../components/coverageChart';
@@ -20,23 +20,23 @@ class Coverage extends React.Component {
2020
};
2121
}
2222

23-
componentDidMount() {
23+
async componentDidMount() {
2424
const { source, owner, name } = this.props.match.params;
25-
26-
fetch(`/api/coverage/${source}/${owner}/${name}`)
27-
.then((response) => {
28-
return response.json();
29-
}).then((project) => {
30-
this.setState({
31-
project: project[0],
32-
loading: false
33-
});
34-
}).catch((ex) => {
35-
this.setState({
36-
error: ex.toString(),
37-
loading: false
38-
});
25+
const url = `/api/coverage/${source}/${owner}/${name}`;
26+
try {
27+
const response = await fetch(url);
28+
const project = await response.json();
29+
30+
this.setState({
31+
project: project[0],
32+
loading: false
33+
});
34+
} catch(ex) {
35+
this.setState({
36+
error: ex.toString(),
37+
loading: false
3938
});
39+
}
4040
}
4141

4242
onChangeBranch(branch) {
@@ -61,8 +61,8 @@ class Coverage extends React.Component {
6161
"Coverage": `${totalCoverage}%`,
6262
"Commit": git.message,
6363
"Committer": git.committer_name,
64-
"Commit Time": moment(git.committer_date * 1000).fromNow(),
65-
"Recieved": moment(run_at).fromNow()
64+
"Commit Time": Moment(git.committer_date * 1000).fromNow(),
65+
"Recieved": Moment(run_at).fromNow()
6666
};
6767
}
6868

@@ -121,7 +121,7 @@ class Coverage extends React.Component {
121121
<a className="coverage-commit-message" href={commitUrl} target="_blank"> {message} </a>
122122
on branch
123123
<b> {branch || git_branch} </b>
124-
{moment(author_date * 1000).fromNow()}
124+
{Moment(author_date * 1000).fromNow()}
125125
&nbsp;by
126126
<b> {author_name} </b>
127127
</p>

src/coverage/feed.js

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import React from 'react';
2+
import Moment from 'moment';
3+
import parse from 'git-url-parse';
4+
5+
import Loading from '../components/loading';
6+
import Error from '../components/error';
7+
import NoCoverage from '../components/noCoverage';
8+
9+
class Feed extends React.Component {
10+
constructor(props) {
11+
super(props);
12+
13+
this.state = {
14+
feed: [],
15+
loading: true
16+
};
17+
}
18+
19+
async componentDidMount() {
20+
let url = '/api/feed';
21+
22+
try {
23+
const response = await fetch(url);
24+
const feed = await response.json();
25+
26+
this.setState({
27+
feed,
28+
loading: false
29+
});
30+
} catch(ex) {
31+
this.setState({
32+
error: ex.toString(),
33+
loading: false
34+
});
35+
}
36+
}
37+
38+
render() {
39+
const { feed, loading, error } = this.state;
40+
41+
if(error) {
42+
return <Error error={error}/>;
43+
}
44+
45+
if(loading) {
46+
return <Loading />;
47+
}
48+
49+
if(feed.length > 0) {
50+
return <div style={{ margin: '0 auto', width: '50%' }}>
51+
<div className="list">
52+
{ feed.map((repo, i) => {
53+
const { git, source_files } = repo;
54+
const { message, commit, branch, git_branch, remotes } = git;
55+
const { resource, owner, name } = parse(remotes.url);
56+
const protocol = resource.substring(resource.lastIndexOf('.') + 1, resource.length);
57+
const commitUrl = `${remotes.url.replace('.git', '')}/commit/${commit}`;
58+
const percentage = source_files.map((f) => {
59+
const { lines={ found: 0, hit: 0 }, branches={ found: 0, hit: 0 }, functions={ found: 0, hit: 0 } } = f;
60+
61+
const totalFound = lines.found + branches.found + functions.found;
62+
const totalHit = lines.hit + branches.hit + functions.hit;
63+
const totalCoverage = parseInt((totalHit / totalFound) * 100);
64+
return totalCoverage;
65+
}, []).reduce((p, c, _ ,a) => p + c / a.length, 0);
66+
const color = percentage >= 85 ? '#3DB712' : percentage <= 85 && percentage >= 70 ? '#caa300' : '#cc5338';
67+
68+
return <div key={`${name}/${i}`} className="list-item">
69+
<div style={{ position: 'relative', height: '50px' }}>
70+
<div style={{ float: 'left' }}>
71+
<a target="_blank" rel="noopener noreferrer" href={ commitUrl }>{ Moment(repo.run_at).fromNow() } on { git_branch || branch || 'unknown' }</a>
72+
</div>
73+
<div style={{ float: 'right' }}>
74+
<div className="badge" style={{ opacity: .6, backgroundColor: color, color: 'white' }}> { parseInt(percentage) }%</div>
75+
</div>
76+
</div>
77+
<h3 className="text-center">
78+
<a href={`/coverage/${resource.replace(/\./g, '%2E').replace(`.${protocol}`, '')}/${owner}/${name}`}> &nbsp;{ owner }/{ name } </a>
79+
<br/>
80+
<small style={{ fontWeight: '100', color: '#969696' }}> { message } </small>
81+
</h3>
82+
</div>;
83+
}) }
84+
</div>
85+
</div>;
86+
} else {
87+
return <NoCoverage />;
88+
}
89+
}
90+
}
91+
92+
export default Feed;

src/layout.js

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class Layout extends React.Component {
1616
</a>
1717
</div>
1818
<div className="nav">
19+
<a className="text-black" href="/feed">
20+
Recent
21+
</a>
1922
<a className="text-black" href="/coverage">
2023
Reports
2124
</a>

src/router.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BrowserRouter, Switch, Route } from 'react-router-dom';
33

44
import Layout from './layout';
55
import Main from './main';
6+
import Feed from './coverage/feed';
67
import List from './coverage/list';
78
import Coverage from './coverage/coverage';
89
import File from './coverage/file';
@@ -16,6 +17,7 @@ export default (
1617
<Route path="/coverage/:source/:owner/:name" component={Coverage} />
1718
<Route path="/coverage/:source/:owner/:page?" component={List} />
1819
<Route path="/coverage/:page?" component={List} />
20+
<Route exact path="/feed" component={Feed} />
1921
<Route exact path="/" component={Main} />
2022
<Route path="*" component={Error} />
2123
</Switch>

0 commit comments

Comments
 (0)