uonline/uonline

View on GitHub
Gulpfile.coffee

Summary

Maintainability
Test Coverage
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


'use strict'

console.time 'Loading gulp'
gulp = require 'gulp'
console.timeEnd 'Loading gulp'

console.time 'Loading deps'
chalk = require 'chalk'
cleanDest = require 'gulp-clean-dest'
merge = require('./gulp-tasks/multimerge.coffee')(require('gulp-merge'))
source = require 'vinyl-source-stream'
buffer = require 'vinyl-buffer'
debug = require 'gulp-debug'
seq = require 'gulp-sequence'
args = require('get-gulp-args')()
console.timeEnd 'Loading deps'


gulp.task 'default', seq 'check', 'build', 'test'


gulp.task 'build', ->
    coffee = require 'gulp-coffee'
    uglify = require 'gulp-uglify'
    concat = require 'gulp-concat'
    browserify = require 'browserify'
    coffeeify = require 'coffeeify'
    return merge(
        gulp
        .src './bower_components/jquery/dist/jquery.min.js'
    ,
        gulp
        .src './bower_components/bootstrap/dist/js/bootstrap.min.js'
    ,
        gulp
        .src './bower_components/jquery-pjax/jquery.pjax.js'
        .pipe uglify()
    ,
        gulp
        .src './browser.coffee'
        .pipe coffee()
        .pipe uglify()
    ,
        browserify()
        .transform coffeeify
        .require './lib/validation.coffee', expose: 'validation'
        .bundle().pipe(source('validation.js')).pipe(buffer())  # epic wrapper, don't ask how does it work
        .pipe uglify()
    )
    .pipe concat 'scripts.js'
    .pipe cleanDest './assets'
    .pipe gulp.dest './assets'


gulp.task 'build-and-notify', ['build'], ->
    notify = require 'gulp-notify'
    return gulp
        .src ''
        .pipe notify 'Assets were rebuilt.'


gulp.task 'watch', ['build'], ->
    return gulp.watch ['./browser.coffee', './lib/validation.coffee'], ['build-and-notify']


gulp.task 'check', ->
    mustcontain = require './gulp-tasks/mustcontain.coffee'
    jshint = require 'gulp-jshint'
    coffeelint = require 'gulp-coffeelint'
    cj = require './gulp-tasks/coffee-jshint.coffee'

    gulpFilter = require 'gulp-filter'
    __jsOnly = gulpFilter ['**/*.js'], restore: true
    __coffeeOnly = gulpFilter ['**/*.coffee']#, restore: true

    return gulp
        .src [
            '*.js'
            'lib/*.js'
            'tests/*.js'
            'grunt-custom-tasks/*.js'
            'gulp-tasks/*.js'
            '*.coffee'
            'lib/*.coffee'
            'tests/*.coffee'
            'grunt-custom-tasks/*.coffee'
            'gulp-tasks/*.coffee'
        ]

        .pipe mustcontain {
            regex: /WARRANTY/
            success: '{n} file{s} contain{!s} a license.'
            fail: '{filename}: does not contain a license.'
            fatal: false
        }
        .pipe mustcontain {
            regex: /['"]use strict['"]\s*[;\n]/
            success: '{n} file{s} {is/are} strict.'
            fail: '{filename}: is not in strict mode.'
            fatal: false
        }

        .pipe __jsOnly
        .pipe jshint()
        .pipe jshint.reporter 'default'
        .pipe __jsOnly.restore

        .pipe __coffeeOnly
        .pipe coffeelint './coffeelint.json'
        .pipe coffeelint.reporter()

        .pipe cj {
            jshintOptions: ['node', 'browser', 'jquery']
            withDefaults: true
            globals: ['_$jscoverage', 'confirm']
        }
        #.pipe __coffeeOnly.restore


gulp.task 'test', seq 'nodeunit', 'mocha', 'jscoverage-report', 'force-exit'


gulp.task 'mocha', ->
    mocha = require 'gulp-mocha'

    return gulp
        .src [
            'test/health-check.js'
            'test/health-check.coffee'
            'test/*.js'
            'test/*.coffee'
        ]
        .pipe mocha {
            ui: 'exports'
            reporter: args.reporter || 'spec'
            slow: 50
            grep: args.grep || undefined
        }
    # TODO later: mocha-fivemat-reporter
    # TODO: --slow=value


gulp.task 'nodeunit', ->
    nodeunit = require 'gulp-nodeunit-runner'
    sourcefiles = [
        'tests/health-check.js'
        'tests/health-check.coffee'
        'tests/*.js'
        'tests/*.coffee'
    ]
    if args.single?
        sourcefiles = "tests/#{args.single}"
    return gulp
        .src sourcefiles
        .pipe nodeunit(reporter: 'minimal')


gulp.task 'force-exit', ->
    process.exit 0


gulp.task 'jscoverage-report', ->
    jscr = require './gulp-tasks/jscoverage-report.coffee'
    jscr()


gulp.task 'coveralls', ->
    jsc = require 'jscoverage'
    lcov = jsc.getLCOV()
    imitate = require 'vinyl-imitate'
    coveralls = require 'gulp-coveralls'
    return imitate('report.lcov', new Buffer(lcov))
        .pipe source('report.lcov')
        .pipe buffer()
        .pipe coveralls()


gulp.task 'travis', seq 'check', 'build', 'nodeunit', 'mocha', 'jscoverage-report', 'coveralls', 'force-exit'