Skip to content

Commit e138c93

Browse files
committed
Coverage badge, doc generator, dependency update & links
1 parent b4f1111 commit e138c93

File tree

4 files changed

+139
-40
lines changed

4 files changed

+139
-40
lines changed

Gruntfile.js

Lines changed: 125 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
module.exports = function(grunt) {
1+
/* jshint camelcase: false */
2+
module.exports = function (grunt) {
23
'use strict';
34

45
grunt.initConfig({
@@ -9,13 +10,17 @@ module.exports = function(grunt) {
910
// define a src set of files for other tasks
1011
src: {
1112
lint: ['Gruntfile.js', 'index.js', 'lib/**/*.js', 'test/*.js'],
12-
complexity: ['index.js', 'lib/**/*.js', 'test/*.js'],
13+
complexity: ['index.js', 'lib/**/*.js'],
1314
test: ['test/*.js'],
1415
src: ['index.js']
1516
},
1617

17-
// clean coverage helper file
18-
clean: ['coverage', 'report', 'report.zip'],
18+
// clean automatically generated helper files & docs
19+
clean: {
20+
coverage: ['coverage', 'report/coverage'],
21+
report: ['report/complexity', 'report/api', 'report/docs'],
22+
reportZip: ['report.zip']
23+
},
1924

2025
// linting
2126
jshint: {
@@ -37,10 +42,18 @@ module.exports = function(grunt) {
3742
coverage: {
3843
options: {
3944
reporter: 'html-cov',
40-
quiet: true
45+
quiet: true,
46+
captureFile: 'report/coverage/index.html'
4147
},
42-
src: '<%= src.test %>',
43-
dest: 'report/coverage/index.html'
48+
src: '<%= src.test %>'
49+
},
50+
jsoncoverage: {
51+
options: {
52+
reporter: 'json-cov',
53+
quiet: true,
54+
captureFile: 'report/coverage/coverage.json'
55+
},
56+
src: '<%= src.test %>'
4457
}
4558
},
4659

@@ -90,6 +103,19 @@ module.exports = function(grunt) {
90103
src: ['index.js']
91104
},
92105

106+
// add current timestamp to the html document
107+
includereplace: {
108+
dist: {
109+
options: {
110+
globals: {
111+
timestamp: '<%= grunt.template.today("dddd, mmmm dS, yyyy, h:MM:ss TT") %>'
112+
},
113+
},
114+
src: 'report/docs/*.html',
115+
dest: '.'
116+
}
117+
},
118+
93119
// compress artifacts
94120
compress: {
95121
main: {
@@ -104,41 +130,103 @@ module.exports = function(grunt) {
104130

105131
});
106132

107-
// prepare files & folders for grunt:plato & coverage
108-
grunt.registerTask('prepare', function () {
133+
// prepare files & folders for grunt:plato
134+
grunt.registerTask('preparePlato', function () {
109135
var fs = require('fs');
110136

137+
var dummyFolders = ['report/complexity', 'report/complexity/files', 'report/complexity/files/index_js', 'report/complexity/files/lib_levelbase_js', 'report/complexity/files/lib_loglevel_level0_js', 'report/complexity/files/lib_loglevel_level1_js', 'report/complexity/files/lib_loglevel_level2_js', 'report/complexity/files/lib_loglevel_level3_js', 'report/complexity/files/lib_loglevel_level4_js'];
138+
var dummyFiles = ['report.history.json', 'files/index_js/report.history.json', 'files/lib_levelbase_js/report.history.json', 'files/lib_loglevel_level0_js/report.history.json', 'files/lib_loglevel_level1_js/report.history.json', 'files/lib_loglevel_level2_js/report.history.json', 'files/lib_loglevel_level3_js/report.history.json', 'files/lib_loglevel_level4_js/report.history.json'];
139+
111140
// generate dirs for docs & reports
112-
['coverage', 'report', 'report/coverage',
113-
'report/complexity', 'report/complexity/files',
114-
'report/complexity/files/index_js',
115-
'report/complexity/files/lib_levelbase_js',
116-
'report/complexity/files/lib_loglevel_level0_js',
117-
'report/complexity/files/lib_loglevel_level1_js',
118-
'report/complexity/files/lib_loglevel_level2_js',
119-
'report/complexity/files/lib_loglevel_level3_js',
120-
'report/complexity/files/lib_loglevel_level4_js',
121-
'report/complexity/files/test_index_TEST_js'].forEach(function (path) {
122-
fs.mkdirSync(__dirname + '/' + path);
141+
dummyFolders.forEach(function (path) {
142+
if (!fs.existsSync(__dirname + '/' + path)) {
143+
fs.mkdirSync(__dirname + '/' + path);
144+
}
123145
});
124146

125147
// store some dummy reports, so that grunt plato doesnt complain
126-
['report.history.json',
127-
'files/test_index_TEST_js/report.history.json',
128-
'files/index_js/report.history.json',
129-
'files/lib_levelbase_js/report.history.json',
130-
'files/lib_loglevel_level0_js/report.history.json',
131-
'files/lib_loglevel_level1_js/report.history.json',
132-
'files/lib_loglevel_level2_js/report.history.json',
133-
'files/lib_loglevel_level3_js/report.history.json',
134-
'files/lib_loglevel_level4_js/report.history.json',
135-
'files/test_index_TEST_js/report.history.json'].forEach(function (file) {
136-
fs.writeFileSync(__dirname + '/report/complexity/' + file, '{}');
148+
dummyFiles.forEach(function (file) {
149+
if (!fs.existsSync(__dirname + '/report/complexity/' + file)) {
150+
fs.writeFileSync(__dirname + '/report/complexity/' + file, '{}');
151+
}
152+
});
153+
});
154+
155+
// prepare files & folders for coverage
156+
grunt.registerTask('prepareCoverage', function () {
157+
var fs = require('fs');
158+
159+
// generate folders
160+
['coverage', 'report', 'report/coverage'].forEach(function (folder) {
161+
if (!fs.existsSync(__dirname + '/' + folder)) {
162+
fs.mkdirSync(__dirname + '/' + folder);
163+
}
137164
});
138165

139166
// generate code coverage helper file
140-
var coverageHelper = 'require("blanket")({pattern: require("fs").realpathSync(__dirname + "/../index.js")});';
141-
fs.writeFileSync(__dirname + '/coverage/blanket.js', coverageHelper);
167+
var coverageHelper = 'require("blanket")({pattern: [require("fs").realpathSync(__dirname + "/../index.js"), require("fs").realpathSync(__dirname + "/../lib/")]});';
168+
if (!fs.existsSync(__dirname + '/coverage/blanket.js')) {
169+
fs.writeFileSync(__dirname + '/coverage/blanket.js', coverageHelper);
170+
}
171+
});
172+
173+
174+
// generates a coverage badge
175+
grunt.registerTask('generateCoverageBadge', function () {
176+
var fs = require('fs');
177+
if (fs.existsSync(__dirname + '/node_modules/coverage-badge')) {
178+
if (fs.existsSync(__dirname + '/report/coverage/coverage.json')) {
179+
var green = [147,188,59];
180+
var yellow = [166,157,0];
181+
var red = [189,0,2];
182+
183+
var getColor = function (coverage) {
184+
if (coverage > 90) {
185+
return mixColors(yellow, green, (coverage-90)/10);
186+
}
187+
188+
if (coverage > 80) {
189+
return mixColors(red, yellow, (coverage-80)/10);
190+
}
191+
192+
return createColor(red);
193+
};
194+
195+
var mixColors = function (from, to, ratio) {
196+
var result = [], i;
197+
for (i=0; i<3; i++) {
198+
result[i] = Math.round(from[i] + (ratio * (to[i]-from[i])));
199+
}
200+
return createColor(result);
201+
};
202+
203+
var createColor = function (values) {
204+
return 'rgba('+values[0]+','+values[1]+','+values[2]+',1)';
205+
};
206+
207+
var Badge = require(__dirname + '/node_modules/coverage-badge/lib/Badge.js');
208+
var badgeFn = function(coverage) {
209+
coverage = Math.floor(Number(coverage));
210+
var badge = new Badge({
211+
box_color: getColor(coverage),
212+
box_text: coverage+'%',
213+
label_text: 'cov',
214+
height: 18,
215+
width: 49,
216+
box_width: 25,
217+
rounding: 0,
218+
padding: 0,
219+
label_font: '7pt DejaVu Sans',
220+
box_font: 'bold 7pt DejaVu Sans'
221+
});
222+
return badge.stream();
223+
};
224+
225+
var coverage = JSON.parse(fs.readFileSync(__dirname + '/report/coverage/coverage.json')).coverage;
226+
var file = fs.createWriteStream(__dirname + '/report/coverage/coverage.png');
227+
badgeFn(coverage).pipe(file);
228+
}
229+
}
142230
});
143231

144232
// load 3rd party tasks
@@ -150,9 +238,11 @@ module.exports = function(grunt) {
150238
grunt.loadNpmTasks('grunt-complexity');
151239
grunt.loadNpmTasks('grunt-documantix');
152240
grunt.loadNpmTasks('grunt-plato');
241+
grunt.loadNpmTasks('grunt-include-replace');
153242

154243
// define runner tasks
155244
grunt.registerTask('lint', 'jshint');
156-
grunt.registerTask('test', ['clean', 'prepare', 'lint', 'mochaTest', 'complexity']);
157-
grunt.registerTask('docs', ['clean', 'prepare', 'plato', 'mochaTest', 'documantix', 'yuidoc', 'compress']);
245+
grunt.registerTask('test', ['clean:coverage', 'prepareCoverage', 'lint', 'mochaTest', 'generateCoverageBadge', 'complexity']);
246+
grunt.registerTask('docs', ['clean:reportZip', 'clean:report', 'preparePlato', 'plato', 'documantix', 'includereplace', 'yuidoc', 'compress']);
247+
grunt.registerTask('all', ['clean', 'test', 'docs']);
158248
};

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ dalek-reporter-console
88
[![Dependency Status](https://david-dm.org/dalekjs/dalek-reporter-console.png)](https://david-dm.org/dalekjs/dalek-reporter-console)
99
[![devDependency Status](https://david-dm.org/dalekjs/dalek-reporter-console/dev-status.png)](https://david-dm.org/dalekjs/dalek-reporter-console#info=devDependencies)
1010
[![NPM version](https://badge.fury.io/js/dalek-reporter-console.png)](http://badge.fury.io/js/dalek-reporter-console)
11+
[![Coverage](http://dalekjs.com/package/dalek-reporter-console/master/coverage/coverage.png)](http://dalekjs.com/package/dalek-reporter-console/master/coverage/index.html)
12+
[![unstable](https://rawgithub.com/hughsk/stability-badges/master/dist/unstable.svg)](http://github.com/hughsk/stability-badges)
13+
14+
[![NPM](https://nodei.co/npm/dalek-reporter-console.png)](https://nodei.co/npm/dalek-reporter-console/)
1115

1216
## Ressources
1317

1418
[API Documentation](http://dalekjs.com/package/dalek-reporter-console/master/api/index.html) -
1519
[Code coverage](http://dalekjs.com/package/dalek-reporter-console/master/coverage/index.html) -
1620
[Code complexity](http://dalekjs.com/package/dalek-reporter-console/master/complexity/index.html) -
1721
[Contributing](https://github.com/dalekjs/dalek-reporter-console/blob/master/CONTRIBUTING.md) -
18-
[User Docs](http://dalekjs.com/docs/master/reporter/console.html) -
22+
[User Docs](http://dalekjs.com/docs/console.html) -
1923
[Homepage](http://dalekjs.com) -
2024
[Twitter](http://twitter.com/dalekjs)
2125

@@ -42,7 +46,7 @@ how to override that feature, browser specific problems and so on.
4246

4347
Questions on StackOverflow often turn in to blog posts or issues.
4448

45-
### [Github Issues](//github.com/dalekjs/dalek-internal-assertions/issues)
49+
### [Github Issues](//github.com/dalekjs/dalek-reporter-console/issues)
4650

4751
Report issues with DalekJS, submit pull requests to fix problems, or to
4852
create summarized and documented feature requests (preferably with pull

index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@
2828
var reporter = null;
2929

3030
/**
31+
* Console reporter
32+
*
3133
* @class Reporter
3234
* @constructor
35+
* @part console
36+
* @api
3337
*/
3438

3539
var Reporter = function (opts) {

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@
3030
},
3131
"devDependencies": {
3232
"grunt": "~0.4.1",
33-
"grunt-contrib-clean": "~0.4.1",
33+
"grunt-contrib-clean": "~0.5.0",
3434
"grunt-contrib-jshint": "~0.6.0",
3535
"grunt-contrib-yuidoc": "~0.4.0",
3636
"grunt-contrib-compress": "~0.5.2",
37-
"grunt-mocha-test": "~0.5.0",
37+
"grunt-mocha-test": "~0.6.0",
3838
"grunt-complexity": "~0.1.3",
3939
"grunt-plato": "~0.2.0",
40-
"grunt-documantix": "~0.0.1",
40+
"grunt-documantix": "~0.0.3",
41+
"grunt-include-replace": "~1.1.0",
4142
"blanket": "~1.1.5",
4243
"chai": "~1.7.0"
4344
}

0 commit comments

Comments
 (0)