# ** Cakefile Template ** is a Template for a common Cakefile that you may use in a coffeescript nodejs project. # # It comes baked in with 4 tasks: # # * build - compiles your src directory to your lib directory # * watch - watches any changes in your src directory and automatically compiles to the lib directory # * test - runs mocha test framework, you can edit this task to use your favorite test framework # * docs - generates annotated documentation using docco fs = require 'fs' {print} = require 'util' {spawn, exec} = require 'child_process' try which = require('which').sync catch err which = null # ANSI Terminal Colors bold = `'\033[0;1m'` green = `'\033[0;32m'` reset = `'\033[0m'` red = `'\033[0;31m'` # Internal Functions # # ## *walk* # # **given** string as dir which represents a directory in relation to local directory # **and** callback as done in the form of (err, results) # **then** recurse through directory returning an array of files walk = (dir, done) -> results = [] fs.readdir dir, (err, list) -> return done(err, []) if err pending = list.length return done(null, results) unless pending for name in list file = "#{dir}/#{name}" try stat = fs.statSync file catch err stat = null if stat?.isDirectory() walk file, (err, res) -> results.push name for name in res done(null, results) unless --pending else results.push file done(null, results) unless --pending # ## *log* # # **given** string as a message # **and** string as a color # **and** optional string as an explaination # **then** builds a statement and logs to console. log = (message, color, explanation) -> console.log color + message + reset + ' ' + (explanation or '') # ## *launch* # # **given** string as a cmd # **and** optional array and option flags # **and** optional callback # **then** spawn cmd with options # **and** pipe to process stdout and stderr respectively # **and** on child process exit emit callback if set and status is 0 launch = (cmd, options=[], callback) -> cmd = which(cmd) if which app = spawn cmd, options app.stdout.pipe(process.stdout) app.stderr.pipe(process.stderr) app.on 'exit', (status) -> callback?() if status is 0 # ## *build* # # **given** optional boolean as watch # **and** optional function as callback # **then** invoke launch passing coffee command # **and** defaulted options to compile src to lib build = (watch, callback) -> if typeof watch is 'function' callback = watch watch = false options = ['-c', '-b', '-o', '.', 'src'] options.unshift '-w' if watch launch 'coffee', options, callback # ## *mocha* # # **given** optional array of option flags # **and** optional function as callback # **then** invoke launch passing mocha command mocha = (options, callback) -> if typeof options is 'function' callback = options options = [] launch 'mocha', options, callback # ## *docco* # # **given** optional function as callback # **then** invoke launch passing docco command docco = (callback) -> walk 'src', (err, files) -> launch 'docco', files, callback # Cakefile Tasks # # ## *docs* # # Generate Annotated Documentation # # Usage # # ``` # cake docs # ``` task 'docs', 'generate documentation', -> docco() # ## *build* # # Builds Source # # Usage # # ``` # cake build # ``` task 'build', 'compile source', -> build -> log ":)", green # ## *watch* # # Builds your source whenever it changes # # Usage # # ``` # cake watch # ``` task 'watch', 'compile and watch', -> build true, -> log ":-)", green # ## *test* # # Runs your test suite. # # Usage # # ``` # cake test # ``` task 'test', 'run tests', -> build -> mocha -> log ":)", green