From 26c4ab896ef992053afdafc1af82eef9d90a45fc Mon Sep 17 00:00:00 2001 From: Erik Kemperman Date: Tue, 8 Aug 2017 20:02:28 +0200 Subject: [PATCH] Update: Add flag/config for running tasks from CLI in series --- README.md | 6 ++ lib/shared/cliOptions.js | 5 ++ lib/shared/config/cli-flags.js | 1 + lib/versioned/^4.0.0-alpha.1/index.js | 2 +- lib/versioned/^4.0.0-alpha.2/index.js | 2 +- lib/versioned/^4.0.0/index.js | 2 +- test/config-flags-series.js | 62 +++++++++++++++++++ test/expected/flags-help.txt | 1 + test/expected/flags-tasks-json.json | 2 +- test/expected/flags-tasks-simple.txt | 2 + test/expected/flags-tasks.txt | 10 +-- .../fixtures/config/flags/series/f/.gulp.json | 5 ++ .../config/flags/series/f/gulpfile.js | 14 +++++ .../fixtures/config/flags/series/t/.gulp.json | 5 ++ .../config/flags/series/t/gulpfile.js | 14 +++++ test/fixtures/gulpfiles/gulpfile.js | 12 +++- test/flags-series.js | 52 ++++++++++++++++ 17 files changed, 187 insertions(+), 10 deletions(-) create mode 100644 test/config-flags-series.js create mode 100644 test/fixtures/config/flags/series/f/.gulp.json create mode 100644 test/fixtures/config/flags/series/f/gulpfile.js create mode 100644 test/fixtures/config/flags/series/t/.gulp.json create mode 100644 test/fixtures/config/flags/series/t/gulpfile.js create mode 100644 test/flags-series.js diff --git a/README.md b/README.md index c93657b3..70e5f03f 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ Supported configurations properties: | flags.tasksDepth | Set default depth of task dependency tree. | | flags.gulpfile | Set a default gulpfile | | flags.silent | Silence logging by default | +| flags.series | Run tasks given on the CLI in series (the default is parallel) | ## Flags @@ -207,6 +208,11 @@ __Some flags only work with gulp 4 and will be ignored when invoked against gulp Continue execution of tasks upon failure. + + --series + + Run tasks given on the CLI in series (the default is parallel). + --log-level -L diff --git a/lib/shared/cliOptions.js b/lib/shared/cliOptions.js index 90eba586..e86db031 100644 --- a/lib/shared/cliOptions.js +++ b/lib/shared/cliOptions.js @@ -98,6 +98,11 @@ module.exports = { desc: chalk.gray( 'Continue execution of tasks upon failure.'), }, + series: { + type: 'boolean', + desc: chalk.gray( + 'Run tasks given on the CLI in series (the default is parallel).'), + }, 'log-level': { alias: 'L', // Type isn't needed because count acts as a boolean diff --git a/lib/shared/config/cli-flags.js b/lib/shared/config/cli-flags.js index 02d1e0a3..be716453 100644 --- a/lib/shared/config/cli-flags.js +++ b/lib/shared/config/cli-flags.js @@ -5,6 +5,7 @@ var copyProps = require('copy-props'); var fromTo = { 'flags.silent': 'silent', 'flags.continue': 'continue', + 'flags.series': 'series', 'flags.logLevel': 'logLevel', 'flags.compactTasks': 'compactTasks', 'flags.tasksDepth': 'tasksDepth', diff --git a/lib/versioned/^4.0.0-alpha.1/index.js b/lib/versioned/^4.0.0-alpha.1/index.js index 3b3aa0f1..7eddcfce 100644 --- a/lib/versioned/^4.0.0-alpha.1/index.js +++ b/lib/versioned/^4.0.0-alpha.1/index.js @@ -75,7 +75,7 @@ function execute(opts, env, config) { } try { log.info('Using gulpfile', chalk.magenta(tildify(env.configPath))); - gulpInst.parallel(toRun)(function(err) { + gulpInst[!opts.series ? 'parallel' : 'series'](toRun)(function(err) { if (err) { exit(1); } diff --git a/lib/versioned/^4.0.0-alpha.2/index.js b/lib/versioned/^4.0.0-alpha.2/index.js index aba74979..0d6342d5 100644 --- a/lib/versioned/^4.0.0-alpha.2/index.js +++ b/lib/versioned/^4.0.0-alpha.2/index.js @@ -75,7 +75,7 @@ function execute(opts, env, config) { } try { log.info('Using gulpfile', chalk.magenta(tildify(env.configPath))); - gulpInst.parallel(toRun)(function(err) { + gulpInst[!opts.series ? 'parallel' : 'series'](toRun)(function(err) { if (err) { exit(1); } diff --git a/lib/versioned/^4.0.0/index.js b/lib/versioned/^4.0.0/index.js index 73c19c8b..33f92287 100644 --- a/lib/versioned/^4.0.0/index.js +++ b/lib/versioned/^4.0.0/index.js @@ -75,7 +75,7 @@ function execute(opts, env, config) { } try { log.info('Using gulpfile', chalk.magenta(tildify(env.configPath))); - gulpInst.parallel(toRun)(function(err) { + gulpInst[!opts.series ? 'parallel' : 'series'](toRun)(function(err) { if (err) { exit(1); } diff --git a/test/config-flags-series.js b/test/config-flags-series.js new file mode 100644 index 00000000..b1f646d9 --- /dev/null +++ b/test/config-flags-series.js @@ -0,0 +1,62 @@ +'use strict'; + +var expect = require('expect'); +var path = require('path'); + +var skipLines = require('gulp-test-tools').skipLines; +var eraseTime = require('gulp-test-tools').eraseTime; +var eraseLapse = require('gulp-test-tools').eraseLapse; +var runner = require('gulp-test-tools').gulpRunner; + +var fixturesDir = path.join(__dirname, 'fixtures/config'); +var runner = require('gulp-test-tools').gulpRunner({ verbose: false }).basedir(fixturesDir); + +describe('config: flags.series', function() { + + it('Should run in series if `flags.series` is true in .gulp.*', + function(done) { + runner + .chdir('flags/series/t') + .gulp('task1 task2') + .run(cb); + + function cb(err, stdout, stderr) { + expect(err).toEqual(null); + expect(stderr).toEqual(''); + + stdout = eraseLapse(eraseTime(skipLines(stdout, 1))); + expect(stdout).toEqual( + 'Starting \'task1\'...\n' + + 'Finished \'task1\' after ?\n' + + 'Starting \'task2\'...\n' + + 'Finished \'task2\' after ?\n' + + '' + ); + done(); + } + }); + + it('Should run in parallel if `flags.series` is false in .gulp.*', + function(done) { + runner + .chdir('flags/series/f') + .gulp('task1 task2') + .run(cb); + + function cb(err, stdout, stderr) { + expect(err).toEqual(null); + expect(stderr).toEqual(''); + + stdout = eraseLapse(eraseTime(skipLines(stdout, 1))); + expect(stdout).toEqual( + 'Starting \'task1\'...\n' + + 'Starting \'task2\'...\n' + + 'Finished \'task2\' after ?\n' + + 'Finished \'task1\' after ?\n' + + '' + ); + done(); + } + }); + +}); diff --git a/test/expected/flags-help.txt b/test/expected/flags-help.txt index fa313519..a2874fdf 100644 --- a/test/expected/flags-help.txt +++ b/test/expected/flags-help.txt @@ -18,5 +18,6 @@ Options: --no-color Will force gulp and gulp plugins to not display colors, even when color support is detected. [boolean] --silent, -S Suppress all gulp logging. [boolean] --continue Continue execution of tasks upon failure. [boolean] + --series Run tasks given on the CLI in series (the default is parallel). [boolean] --log-level, -L Set the loglevel. -L for least verbose and -LLLL for most verbose. -LLL is default. [count] diff --git a/test/expected/flags-tasks-json.json b/test/expected/flags-tasks-json.json index d22a0e65..a9842b7e 100644 --- a/test/expected/flags-tasks-json.json +++ b/test/expected/flags-tasks-json.json @@ -1 +1 @@ -{"label":"gulp-cli/test/fixtures/gulpfiles","nodes":[{"label":"test1","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"noop","type":"function","nodes":[]}]}]},{"label":"test2","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"test1","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"noop","type":"function","nodes":[]}]}]},{"label":"noop","type":"function","nodes":[]}]}]},{"label":"test3","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"described","type":"function","nodes":[]}]}]},{"label":"test4","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"errorFunction","type":"function","nodes":[]},{"label":"anon","type":"function","nodes":[]}]}]},{"label":"default","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"test1","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"noop","type":"function","nodes":[]}]}]},{"label":"test3","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"described","type":"function","nodes":[]}]}]},{"label":"noop","type":"function","nodes":[]}]}]}]} +{"label":"gulp-cli/test/fixtures/gulpfiles","nodes":[{"label":"test1","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"noop","type":"function","nodes":[]}]}]},{"label":"test2","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"test1","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"noop","type":"function","nodes":[]}]}]},{"label":"noop","type":"function","nodes":[]}]}]},{"label":"test3","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"described","type":"function","nodes":[]}]}]},{"label":"test4","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"errorFunction","type":"function","nodes":[]},{"label":"anon","type":"function","nodes":[]}]}]},{"label":"test5","nodes":[],"type":"task"},{"label":"test6","nodes":[],"type":"task"},{"label":"default","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"test1","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"noop","type":"function","nodes":[]}]}]},{"label":"test3","type":"task","nodes":[{"label":"","type":"function","branch":true,"nodes":[{"label":"described","type":"function","nodes":[]}]}]},{"label":"noop","type":"function","nodes":[]}]}]}]} diff --git a/test/expected/flags-tasks-simple.txt b/test/expected/flags-tasks-simple.txt index 45085a74..94ac6fcf 100644 --- a/test/expected/flags-tasks-simple.txt +++ b/test/expected/flags-tasks-simple.txt @@ -2,4 +2,6 @@ test1 test2 test3 test4 +test5 +test6 default diff --git a/test/expected/flags-tasks.txt b/test/expected/flags-tasks.txt index cdfe8041..2d940b2e 100644 --- a/test/expected/flags-tasks.txt +++ b/test/expected/flags-tasks.txt @@ -20,7 +20,9 @@ gulp-cli/test/fixtures/gulpfiles ├─┬ test3 │ └─┬ │ └── described -└─┬ test4 - └─┬ - ├── errorFunction - └── anon +├─┬ test4 +│ └─┬ +│ ├── errorFunction +│ └── anon +├── test5 +└── test6 diff --git a/test/fixtures/config/flags/series/f/.gulp.json b/test/fixtures/config/flags/series/f/.gulp.json new file mode 100644 index 00000000..6da4dba0 --- /dev/null +++ b/test/fixtures/config/flags/series/f/.gulp.json @@ -0,0 +1,5 @@ +{ + "flags": { + "series": false + } +} diff --git a/test/fixtures/config/flags/series/f/gulpfile.js b/test/fixtures/config/flags/series/f/gulpfile.js new file mode 100644 index 00000000..803710da --- /dev/null +++ b/test/fixtures/config/flags/series/f/gulpfile.js @@ -0,0 +1,14 @@ +'use strict'; + +var gulp = require('gulp'); + +function noop(cb) { + cb(); +} + +function delayed(cb) { + setTimeout(cb, 100); +} + +gulp.task('task1', delayed); +gulp.task('task2', noop); diff --git a/test/fixtures/config/flags/series/t/.gulp.json b/test/fixtures/config/flags/series/t/.gulp.json new file mode 100644 index 00000000..7f1f5a44 --- /dev/null +++ b/test/fixtures/config/flags/series/t/.gulp.json @@ -0,0 +1,5 @@ +{ + "flags": { + "series": true + } +} diff --git a/test/fixtures/config/flags/series/t/gulpfile.js b/test/fixtures/config/flags/series/t/gulpfile.js new file mode 100644 index 00000000..803710da --- /dev/null +++ b/test/fixtures/config/flags/series/t/gulpfile.js @@ -0,0 +1,14 @@ +'use strict'; + +var gulp = require('gulp'); + +function noop(cb) { + cb(); +} + +function delayed(cb) { + setTimeout(cb, 100); +} + +gulp.task('task1', delayed); +gulp.task('task2', noop); diff --git a/test/fixtures/gulpfiles/gulpfile.js b/test/fixtures/gulpfiles/gulpfile.js index 0a8b8112..c4baaf27 100644 --- a/test/fixtures/gulpfiles/gulpfile.js +++ b/test/fixtures/gulpfiles/gulpfile.js @@ -3,16 +3,22 @@ var gulp = require('gulp'); function noop(cb) { - return cb(); + cb(); } + function described(cb) { cb(); } + +function delayed(cb) { + setTimeout(cb, 100); +} + function errorFunction() { throw new Error('Error!'); } function anon(cb) { - return cb(); + cb(); } described.description = 'description'; @@ -20,5 +26,7 @@ gulp.task('test1', gulp.series(noop)); gulp.task('test2', gulp.series('test1', noop)); gulp.task('test3', gulp.series(described)); gulp.task('test4', gulp.series(errorFunction, anon)); +gulp.task('test5', delayed); +gulp.task('test6', noop); gulp.task('default', gulp.series('test1', 'test3', noop)); diff --git a/test/flags-series.js b/test/flags-series.js new file mode 100644 index 00000000..6ab5e694 --- /dev/null +++ b/test/flags-series.js @@ -0,0 +1,52 @@ +'use strict'; + +var expect = require('expect'); +var runner = require('gulp-test-tools').gulpRunner; +var eraseTime = require('gulp-test-tools').eraseTime; +var eraseLapse = require('gulp-test-tools').eraseLapse; +var skipLines = require('gulp-test-tools').skipLines; + +describe('flag: --series', function() { + + it('runs tasks in series when flag is set', function(done) { + runner({ verbose: false }) + .gulp('test5 test6', '--series', '--cwd ./test/fixtures/gulpfiles') + .run(cb); + + function cb(err, stdout, stderr) { + expect(err).toEqual(null); + expect(stderr).toEqual(''); + stdout = eraseLapse(eraseTime(skipLines(stdout, 2))); + expect(stdout).toEqual( + 'Starting \'test5\'...\n' + + 'Finished \'test5\' after ?\n' + + 'Starting \'test6\'...\n' + + 'Finished \'test6\' after ?\n' + + '' + ); + done(); + } + }); + + it('runs tasks in parallel when flag is not set', function(done) { + runner({ verbose: false }) + .gulp('test5 test6', '--cwd ./test/fixtures/gulpfiles') + .run(cb); + + function cb(err, stdout, stderr) { + expect(err).toEqual(null); + expect(stderr).toEqual(''); + expect(stdout).toNotMatch('Starting \'anon\''); + stdout = eraseLapse(eraseTime(skipLines(stdout, 2))); + expect(stdout).toEqual( + 'Starting \'test5\'...\n' + + 'Starting \'test6\'...\n' + + 'Finished \'test6\' after ?\n' + + 'Finished \'test5\' after ?\n' + + '' + ); + done(); + } + }); + +});