1
- module . exports = function ( grunt ) {
1
+ /* jshint camelcase: false */
2
+ module . exports = function ( grunt ) {
2
3
'use strict' ;
3
4
4
5
grunt . initConfig ( {
@@ -9,13 +10,17 @@ module.exports = function(grunt) {
9
10
// define a src set of files for other tasks
10
11
src : {
11
12
lint : [ 'Gruntfile.js' , 'index.js' , 'lib/**/*.js' , 'test/*.js' ] ,
12
- complexity : [ 'index.js' , 'lib/**/*.js' , 'test/*.js' ] ,
13
+ complexity : [ 'index.js' , 'lib/**/*.js' ] ,
13
14
test : [ 'test/*.js' ] ,
14
15
src : [ 'index.js' ]
15
16
} ,
16
17
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
+ } ,
19
24
20
25
// linting
21
26
jshint : {
@@ -37,10 +42,18 @@ module.exports = function(grunt) {
37
42
coverage : {
38
43
options : {
39
44
reporter : 'html-cov' ,
40
- quiet : true
45
+ quiet : true ,
46
+ captureFile : 'report/coverage/index.html'
41
47
} ,
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 %>'
44
57
}
45
58
} ,
46
59
@@ -90,6 +103,19 @@ module.exports = function(grunt) {
90
103
src : [ 'index.js' ]
91
104
} ,
92
105
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
+
93
119
// compress artifacts
94
120
compress : {
95
121
main : {
@@ -104,41 +130,103 @@ module.exports = function(grunt) {
104
130
105
131
} ) ;
106
132
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 ( ) {
109
135
var fs = require ( 'fs' ) ;
110
136
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
+
111
140
// 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
+ }
123
145
} ) ;
124
146
125
147
// 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
+ }
137
164
} ) ;
138
165
139
166
// 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
+ }
142
230
} ) ;
143
231
144
232
// load 3rd party tasks
@@ -150,9 +238,11 @@ module.exports = function(grunt) {
150
238
grunt . loadNpmTasks ( 'grunt-complexity' ) ;
151
239
grunt . loadNpmTasks ( 'grunt-documantix' ) ;
152
240
grunt . loadNpmTasks ( 'grunt-plato' ) ;
241
+ grunt . loadNpmTasks ( 'grunt-include-replace' ) ;
153
242
154
243
// define runner tasks
155
244
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' ] ) ;
158
248
} ;
0 commit comments