Jump To …
browser.coffee cake.coffee coffee-script.coffee command.coffee grammar.coffee helpers.coffee index.coffee lexer.coffee nodes.coffee optparse.coffee repl.coffee rewriter.coffee scope.coffee

# cake.coffee

#

`cake` is a simplified version of Make (Rake, Jake) for CoffeeScript. You define tasks with names and descriptions in a Cakefile, and can call them from the command line, or invoke them from other tasks.

Running `cake` with no arguments will print out a list of all the tasks in the current directory's Cakefile.

#

External dependencies.

    fs           = require 'fs'
    path         = require 'path'
    helpers      = require('./helpers').helpers
    optparse     = require './optparse'
    CoffeeScript = require './coffee-script'

#

Keep track of the list of defined tasks, the accepted options, and so on.

    tasks     = {}
    options   = {}
    switches  = []
    oparse    = null

#

Mixin the top-level Cake functions for Cakefiles to use directly.

    helpers.extend global,

#

Define a Cake task with a short name, an optional sentence description, and the function to run as the action itself.

      task: (name, description, action) ->
        [action, description] = [description, action] unless action
        tasks[name] = {name, description, action}

#

Define an option that the Cakefile accepts. The parsed options hash, containing all of the command-line options passed, will be made available as the first argument to the action.

      option: (letter, flag, description) ->
        switches.push [letter, flag, description]

#

Invoke another task in the current Cakefile.

      invoke: (name) ->
        missingTask name unless tasks[name]
        tasks[name].action options

#

Run `cake`. Executes all of the tasks you pass, in order. Note that Node's asynchrony may cause tasks to execute in a different order than you'd expect. If no tasks are passed, print the help screen.

    exports.run = ->
      path.exists 'Cakefile', (exists) ->
        throw new Error("Cakefile not found in #{process.cwd()}") unless exists
        args = process.argv[2...process.argv.length]
        CoffeeScript.run fs.readFileSync('Cakefile').toString(), fileName: 'Cakefile'
        oparse = new optparse.OptionParser switches
        return printTasks() unless args.length
        options = oparse.parse(args)
        invoke arg for arg in options.arguments

#

Display the list of Cake tasks in a format similar to `rake -T`

    printTasks = ->
      puts ''
      for all name, task of tasks
        spaces = 20 - name.length
        spaces = if spaces > 0 then (' ' for i in [0..spaces]).join('') else ''
        desc   = if task.description then "# #{task.description}" else ''
        puts "cake #{name}#{spaces} #{desc}"
      puts oparse.help() if switches.length

#

Print an error and exit when attempting to all an undefined task.

    missingTask = (task) ->
      puts "No such task: \"#{task}\""
      process.exit 1