| fs = require 'fs' |
| {print} = require 'util' |
| {spawn, exec} = require 'child_process' |
| watchit = require 'watchit' |
| |
| build = (watch, callback) -> |
| if typeof watch is 'function' |
| callback = watch |
| watch = false |
| options = ['-c', '-o', 'lib', 'src'] |
| options.unshift '-w' if watch |
| |
| coffee = spawn 'coffee', options |
| coffee.stdout.on 'data', (data) -> print data.toString() |
| coffee.stderr.on 'data', (data) -> print data.toString() |
| coffee.on 'exit', (status) -> callback?() if status is 0 |
| |
| task 'docs', 'Generate annotated source code with Docco', -> |
| fs.readdir 'src', (err, contents) -> |
| files = ("src/#{file}" for file in contents when /\.coffee$/.test file) |
| docco = spawn 'docco', files |
| docco.stdout.on 'data', (data) -> print data.toString() |
| docco.stderr.on 'data', (data) -> print data.toString() |
| docco.on 'exit', (status) -> callback?() if status is 0 |
| |
| task 'build', 'Compile CoffeeScript source files', -> |
| build() |
| |
| task 'watch', 'Recompile CoffeeScript source files when modified', -> |
| build true |
| |
| task 'test', 'Run the test suite (and re-run if anything changes)', -> |
| suite = null |
| build -> |
| do runTests = -> |
| suite?.kill() |
| suiteNames = ['test'] |
| suiteIndex = 0 |
| do runNextTestSuite = -> |
| return unless suiteName = suiteNames[suiteIndex] |
| suite = spawn "coffee", ["-e", "{reporters} = require 'nodeunit'; reporters.default.run ['#{suiteName}.coffee']"], cwd: 'test' |
| suite.stdout.on 'data', (data) -> print data.toString() |
| suite.stderr.on 'data', (data) -> print data.toString() |
| suite.on 'exit', -> suiteIndex++; runNextTestSuite() |
| invoke 'docs' # lest I forget |
| watchTargets = (targets..., callback) -> |
| for target in targets |
| watchit target, include: true, (event) -> |
| callback() unless event is 'success' |
| watchTargets 'src', -> build runTests |
| watchTargets 'test', 'Cakefile', runTests |