desc "Generate JavaScript code coverage report in ./covershot" task :coverage => %w( coverage:dependencies coverage:clean coverage:prepare coverage:instrumentation coverage:write_manifest coverage:execute coverage:generate coverage:done ) namespace :coverage do task :dependencies do unless File.exist?(base_path.join('node_modules')) if %x[which npm].strip.length == 0 raise <<-end_error Could not execute `npm`! Please make sure node.js and the Node Package Manager (NPM) are available and can be executed without root permissions. end_error else cmd = "npm install && bundle exec #{$0} #{ARGV.join ' '}" puts "Executing the following command:" puts puts " #{cmd}" puts puts Kernel.exec cmd end end end task :clean do rm_rf base_path.join('covershot') rm_rf base_path.join('tmp') end task :prepare do manifest = sprockets['gl-matrix-manifest.js'] coverage_path = base_path.join('tmp/coverage') manifest.dependencies.each do |part| path = coverage_path.join('lib').join(part.pathname.basename) mkdir_p(path.dirname) unless File.directory?(path.dirname) File.open(path, 'w') do |f| f.print part.body end end end task :instrumentation do bin = 'jscoverage' opts = [ '--no-highlight' ] input = base_path.join('tmp/coverage/lib').to_s output = base_path.join('tmp/coverage/lib-cov').to_s unless system *[bin, opts, input, output].flatten raise "Instrumentation failure. Please make sure `jscoverage` is installed." end end task :write_manifest do manifest = sprockets['gl-matrix-manifest.js'] coverage_path = base_path.join('tmp/coverage') File.open(coverage_path.join('manifest.js'), 'w') do |manifest_out| manifest_out.puts <<-end_script var covershot = require('covershot'); var csrequire = covershot.require.bind(null, require); function pull(str) { var exps = csrequire(str); for (var i in exps) { global[i] = exps[i]; } } global.GLMAT_EPSILON = 0.000001; global.GLMAT_ARRAY_TYPE = Float32Array; end_script manifest.dependencies.each do |part| path = coverage_path.join('lib-cov').join(part.pathname.basename) manifest_out.puts "pull('#{path}');" end manifest_out.puts <<-end_script function CoverageReporter() { this.reportRunnerResults = function(suite) { covershot.writeCoverage(); }; }; jasmine.getEnv().addReporter(new CoverageReporter()); end_script end end task :execute do jasmine_node = base_path.join('node_modules/jasmine-node/bin/jasmine-node').to_s spec = base_path.join('spec').to_s unless system jasmine_node, spec raise "jasmine-node tests failed. Coverage report not generated." end end task :generate do covershot = base_path.join('node_modules/covershot/bin/covershot').to_s data_dir = base_path.join('covershot/data').to_s format = 'html' unless system covershot, data_dir, '-f', format raise "Execution of covershot failed. Coverage report not generated." end end task :done do rm_rf base_path.join('tmp') puts puts puts "Coverage report generated in: #{base_path.join("covershot/index.html")}" puts end end