-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSlakefile
102 lines (79 loc) · 2.92 KB
/
Slakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{spawn} = require \child_process
require! [\fs \path \gaze \q]
/* Tasks */
task \build 'Compile src/*.ls to lib/*.js' ->
clean!.then build .catch (e) -> console.log e.message
task \test 'Run the tests' ->
buildAndTest!.catch (e) -> process.exit 1
task \watch 'Build and test when files are changed' ->
clearTerminal!.then buildAndTest
watch \src/*, -> clearTerminal!.then buildAndTest
watch \test/*, -> clearTerminal!.then test
task \coverage 'Code coverage report and badge using jscoverage' ->
process.env.\IRCC_COV = 1
clean!
.then build
.then jscoverage
.then coverageReport
.then coverageBadge
.finally -> rm \lib-cov
/* Actions */
clean = -> rm \lib
build = -> livescript \lib, \src
test = -> mocha [\--reporter, \spec, \-G], \inherit
buildAndTest = -> clean! .then build .then test .catch (e) -> console.error e.message
jscoverage = ->
build!.then ->
jscov = spawn \jscoverage, ['--no-highlight', 'lib', 'lib-cov'], {stdio: 'inherit'}
deferred = q.defer!
jscov.on \exit, (code, signal) ->
if signal? or code isnt 0 then deferred.reject!
else deferred.resolve!
deferred.promise
coverageReport = ->
mochaCov \html
.then -> console.log "Code coverage report written to 'coverage.html'"
.catch (e) -> console.error 'Unable to generate code coverage report:', e
coverageBadge = ->
mochaCov \json
.then createBadge
.then -> console.log "Code coverage badge written to 'coverage.png'"
.catch (e) -> console.error 'Unable to generate code coverage badge:', e
/* Helpers */
watch = (glob, callback) ->
new gaze.Gaze [glob] .on \all, callback
livescript = (libPath, srcPath) ->
srcFiles = [path.join srcPath, file for file in dir srcPath when /\.ls$/.test file]
stderrOutput = ''
lsc = spawn \lsc, [\-bco libPath] ++ srcFiles
lsc.stderr.on \data, -> stderrOutput += it.toString!
deferred = q.defer!
lsc.on \exit, (error) ->
if stderrOutput.length > 0 then deferred.reject new Error stderrOutput
else deferred.resolve!
deferred.promise
mocha = (args, io=\ignore) ->
args ++= [\-c \--compilers \ls:LiveScript \-r \test/common]
mocha = spawn \mocha, args, { stdio: io }
deferred = q.defer!
mocha.on \exit, (code, signal) ->
if signal? or code isnt 0 then deferred.reject!
else deferred.resolve!
deferred.promise
mochaCov = (type) ->
file = fs.openSync "coverage.#{type}", \w
mocha [\--reporter "#{type}-cov"], [\ignore, file, \ignore]
createBadge = ->
badge = require \coverage-badge
json = JSON.parse fs.readFileSync \coverage.json
file = fs.createWriteStream \coverage.png
badge json.coverage .pipe file
getDirs = (folder) ->
(fs.readdirSync folder).filter (file) ->
isDirectory (path.join folder, file)
isDirectory = -> (fs.lstatSync it).isDirectory!
clearTerminal = -> q (process.stdout.write '\u001B[2J\u001B[0;0f')
rm = (path) ->
deferred = q.defer!
(spawn \rm [\-r path]).on \exit, deferred~resolve
deferred.promise