UNPKG

appium-gulp-plugins

Version:

Custom gulp plugins to be used accross all appium modules

237 lines (217 loc) 7.46 kB
"use strict"; var mocha = require('gulp-mocha'), Q = require('q'), globby = Q.denodeify(require('globby')), Transpiler = require('../index').Transpiler, jshint = require('gulp-jshint'), jscs = require('gulp-jscs'), vinylPaths = require('vinyl-paths'), del = require('del'), _ = require('lodash'), promisePipe = require("promisepipe"), AndroidEmulator = require('appium-ci').AndroidEmulator, androidTools = require('appium-ci').androidTools, iosTools = require('appium-ci').iosTools, spawn = require('child_process').spawn, exec = Q.denodeify(require('child_process').exec), path = require('path'); var DEFAULT_OPTS = { files: ["*.js", "lib/**/*.js", "test/**/*.js", "!gulpfile.js"], transpile: true, transpileOut: "build", babelOpts: {}, linkBabelRuntime: true, jscs: true, jshint: true, watch: true, test: { files: ['${testDir}/**/*-specs.js', '!${testDir}/**/*-e2e-specs.js'] }, coverage: { files: ['./test/**/*-specs.js', '!./test/**/*-e2e-specs.js'] }, e2eTest: { files: '${testDir}/**/*-e2e-specs.js' }, testReporter: ( process.env.TRAVIS || process.env.CI ) ? 'spec' : 'nyan', testTimeout: 8000, buildName: null, }; // string interpolation var interpolate = function (s, opts) { return _.keys(opts).reduce(function (s, k) { return s.replace(new RegExp('\\$\\{\\s*' + k + '\\s*\\}', 'g') , opts[k]); } , s); }; var boilerplate = function (gulp, opts) { var spawnWatcher = require('../index').spawnWatcher.use(gulp); var runSequence = Q.denodeify(require('run-sequence').use(gulp)); var defOpts = _.clone(DEFAULT_OPTS); _.extend(defOpts, opts); opts = defOpts; process.env.APPIUM_NOTIF_BUILD_NAME = opts.buildName; gulp.task('clean', function () { if (opts.transpile) { return gulp.src(opts.transpileOut, {read: false}) .pipe(vinylPaths(del)); } }); var testDeps = []; var rootDir = '.'; if (opts.transpile) { testDeps.push('transpile'); rootDir = opts.transpileOut; } var fileAliases = {rootDir: rootDir, testDir: rootDir + '/test', libDir: rootDir + '/lib' }; if (opts.test) { var testFiles = _.flatten([opts.test.files || opts.testFiles]).map(function (f) { return interpolate(f, fileAliases); }); gulp.task('test', testDeps, function () { var isForceLogMode = parseInt(process.env._FORCE_LOGS, 10) === 1; var mochaOpts = { reporter: isForceLogMode ? 'spec' : opts.testReporter, timeout: opts.testTimeout }; // set env so our code knows when it's being run in a test env process.env._TESTING = 1; return gulp .src(testFiles, {read: false}) .pipe(mocha(mochaOpts)) .on('error', spawnWatcher.handleError); }); } if (opts.coverage) { var covTestFiles = _.flatten([opts.coverage.files]).map(function (f) { return interpolate(f, fileAliases); }); gulp.task('coverage', testDeps, function () { return globby(covTestFiles).then(function (files) { var deferred = Q.defer(); var bins = {}; _.each(['babel-node', 'isparta', '_mocha'], function (k) { bins[k] = path.resolve(__dirname, '../node_modules/.bin', k); }); var bin = bins['babel-node']; var args = ['-r2', bins.isparta, 'cover', '--report', 'text', '--report', 'html', bins._mocha, '--', '--reporter', 'dot'] .concat(files); var proc = spawn(bin, args); proc.on('close', function (code) { if (code === 0) { deferred.resolve(); } else { deferred.reject(new Error('Coverage command exit code: ' + code)); } }); return deferred.promise; }); }); gulp.task('coveralls', ['coverage'], function () { var bin = path.resolve(__dirname, '../node_modules/.bin/coveralls'); return exec('cat ./coverage/lcov.info | ' + bin); }); } if (opts.e2eTest) { var e2eTestFiles = _.flatten([opts.e2eTest.files || opts.e2eTestFiles]).map(function (f) { return interpolate(f, fileAliases); }); gulp.task('e2e-test', testDeps, function () { var isForceLogMode = parseInt(process.env._FORCE_LOGS, 10) === 1; var mochaOpts = { reporter: isForceLogMode ? 'spec' : opts.testReporter, timeout: opts.testTimeout }; // set env so our code knows when it's being run in a test env process.env._TESTING = 1; var seq = [ function () { return promisePipe(gulp .src(e2eTestFiles, {read: false}) .pipe(mocha(mochaOpts)) .on('error', spawnWatcher.handleError)); }]; if (opts.e2eTest.android) { var emu = new AndroidEmulator(opts.e2eTest.avd); seq = [ function () { return androidTools.killAll(); }, function () { emu.start(); return emu.waitTillReady(); }].concat(seq).concat([ function () { return emu.stop(); }, function () { return androidTools.killAll(); } ]); } if (opts.e2eTest.ios) { var xCodeVersion = opts.e2eTest.xCodeVersion || '6.1.1'; seq = [ function () { return iosTools.killAll(); }, function () { return iosTools.configureXcode(xCodeVersion); }, function () { return iosTools.resetSims(); }, ].concat(seq).concat([ function () { return iosTools.killAll(); } ]); } return seq.reduce(Q.when, new Q()).catch(spawnWatcher.handleError); }); } if (opts.transpile) { gulp.task('transpile', function () { var transpiler = new Transpiler(opts.babelOpts); return gulp.src(opts.files, {base: './'}) .pipe(transpiler.stream()) .on('error', spawnWatcher.handleError) .pipe(gulp.dest(opts.transpileOut)); }); gulp.task('prepublish', function () { return runSequence('clean', 'transpile'); }); } var lintTasks = []; if (opts.jscs) { gulp.task('jscs', function () { return gulp .src(opts.files) .pipe(jscs()) .on('error', spawnWatcher.handleError); }); lintTasks.push('jscs'); } if (opts.jshint) { gulp.task('jshint', function () { return gulp .src(opts.files) .pipe(jshint()) .pipe(jshint.reporter('jshint-stylish')) .pipe(jshint.reporter('fail')) .on('error', spawnWatcher.handleError); }); lintTasks.push('jshint'); } if (opts.jscs || opts.jshint) { opts.lint = true; gulp.task('lint', lintTasks); } var defaultSequence = []; if (opts.transpile) defaultSequence.push('clean'); if (opts.lint) defaultSequence.push('lint'); if (opts.transpile && !opts.test) defaultSequence.push('transpile'); if (opts.test) defaultSequence.push('test'); if (opts.extraDefaultTasks) defaultSequence = defaultSequence.concat(opts.extraDefaultTasks); if (opts.watch) { spawnWatcher.clear(false); spawnWatcher.configure('watch', opts.files, function () { return runSequence.apply(null, defaultSequence); }); } gulp.task('once', function () { return runSequence.apply(null, defaultSequence); }); gulp.task('default', [opts.watch ? 'watch' : 'once']); }; module.exports = { DEFAULTS: _.cloneDeep(DEFAULT_OPTS), use: function (gulp) { return function (opts) { boilerplate(gulp, opts); }; } };