Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 119 lines (94 sloc) 4.019 kb
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
fs: require 'fs'
{helpers}: require('./lib/helpers')
CoffeeScript: require './lib/coffee-script'
{spawn, exec}: require('child_process')

# ANSI Terminal Colors.
red: '\033[0;31m'
green: '\033[0;32m'
reset: '\033[0m'

# Run a CoffeeScript through our node/coffee interpreter.
run: (args) ->
  proc: spawn 'bin/coffee', args
  proc.stderr.addListener 'data', (buffer) -> puts buffer.toString()
  proc.addListener 'exit', (status) -> process.exit(1) if status != 0

# Log a message with a color.
log: (message, color, explanation) ->
  puts "$color$message$reset ${explanation or ''}"

option '-p', '--prefix [DIR]', 'set the installation prefix for `cake install`'

task 'install', 'install CoffeeScript into /usr/local (or --prefix)', (options) ->
  base: options.prefix or '/usr/local'
  lib: "$base/lib/coffee-script"
  bin: "$base/bin"
  node: "~/.node_libraries/coffee-script"
  puts "Installing CoffeeScript to $lib"
  puts "Linking to $node"
  puts "Linking 'coffee' to $bin/coffee"
  exec([
    "mkdir -p $lib $bin"
    "cp -rf bin lib LICENSE README package.json src $lib"
    "ln -sf $lib/bin/coffee $bin/coffee"
    "ln -sf $lib/bin/cake $bin/cake"
    "mkdir -p ~/.node_libraries"
    "ln -sf $lib/lib $node"
  ].join(' && '), (err, stdout, stderr) ->
    if err then print stderr else log 'done', green
  )


task 'build', 'build the CoffeeScript language from source', ->
  files: fs.readdirSync 'src'
  files: 'src/' + file for file in files when file.match(/\.coffee$/)
  run ['-c', '-o', 'lib'].concat(files)


task 'build:full', 'rebuild the source twice, and run the tests', ->
  exec 'bin/cake build && bin/cake build && bin/cake test', (err, stdout, stderr) ->
    print stdout if stdout
    print stderr if stderr
    throw err if err


task 'build:parser', 'rebuild the Jison parser (run build first)', ->
  require 'jison'
  parser: require('./lib/grammar').parser
  js: parser.generate()
  parserPath: 'lib/parser.js'
  fs.writeFile parserPath, js


task 'build:ultraviolet', 'build and install the Ultraviolet syntax highlighter', ->
  exec 'plist2syntax ../coffee-script-tmbundle/Syntaxes/CoffeeScript.tmLanguage', (err) ->
    throw err if err
    exec 'sudo mv coffeescript.yaml /usr/local/lib/ruby/gems/1.8/gems/ultraviolet-0.10.2/syntax/coffeescript.syntax'


task 'build:browser', 'rebuild the merged script for inclusion in the browser', ->
  exec 'rake browser', (err) ->
    throw err if err


task 'doc:site', 'watch and continually rebuild the documentation for the website', ->
  exec 'rake doc'


task 'doc:source', 'rebuild the internal documentation', ->
  exec 'docco src/*.coffee && cp -rf docs documentation && rm -r docs', (err) ->
    throw err if err


task 'doc:underscore', 'rebuild the Underscore.coffee documentation page', ->
  exec 'docco examples/underscore.coffee && cp -rf docs documentation && rm -r docs', (err) ->
    throw err if err


task 'loc', 'count the lines of source code in CoffeeScript', ->
  exec "cat src/*.coffee | grep -v '^\\( *#\\|\\s*$\\)' | wc -l | tr -s ' '", (err, stdout) ->
    print stdout


task 'test', 'run the CoffeeScript language test suite', ->
  helpers.extend global, require 'assert'
  passedTests: failedTests: 0
  startTime: new Date
  originalOk: ok
  helpers.extend global, {
    ok: (args...) -> passedTests += 1; originalOk(args...)
    CoffeeScript: CoffeeScript
  }
  process.addListener 'exit', ->
    time: ((new Date - startTime) / 1000).toFixed(2)
    message: "passed $passedTests tests in $time seconds$reset"
    if failedTests
      log "failed $failedTests and $message", red
    else
      log message, green
  fs.readdir 'test', (err, files) ->
    files.forEach (file) ->
      return unless file.match(/\.coffee$/i)
      source: path.join 'test', file
      fs.readFile source, (err, code) ->
        try
          CoffeeScript.run code.toString(), {source: source}
        catch err
          failedTests += 1
          log "failed $source", red, '\n' + err.stack.toString()
Something went wrong with that request. Please try again.