1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | var browserify = require('browserify');
|
21 | var source = require('vinyl-source-stream');
|
22 | var buffer = require('vinyl-buffer');
|
23 | var gulp = require('gulp');
|
24 | var through = require('through2');
|
25 | var gulpif = require('gulp-if');
|
26 | var uglify = require('gulp-uglify');
|
27 | var concat = require('gulp-concat');
|
28 | var gutil = require('gulp-util');
|
29 | var download = require("gulp-download");
|
30 | var shell = require('gulp-shell');
|
31 | var jasmine = require('gulp-jasmine');
|
32 | var jasmineBrowser = require('gulp-jasmine-browser');
|
33 | var reporters = require('jasmine-reporters');
|
34 | var babelify = require('babelify');
|
35 | var babel = require('gulp-babel');
|
36 | var watch = require('gulp-watch');
|
37 | var batch = require('gulp-batch');
|
38 | var replace = require('gulp-replace');
|
39 | var decompress = require('gulp-decompress');
|
40 | var fs = require("fs-extra");
|
41 | var runSequence = require('run-sequence');
|
42 | var path = require('path');
|
43 | var childProcess = require("child_process");
|
44 | var minimist = require('minimist');
|
45 | var cucumber = require('gulp-cucumber');
|
46 | var merge = require('merge-stream');
|
47 | var install = require("gulp-install");
|
48 | var os = require('os');
|
49 | var file = require('gulp-file');
|
50 | var semver = require('semver');
|
51 |
|
52 | gulp.task('default', ["test"]);
|
53 |
|
54 | gulp.task('browser', function(cb){
|
55 | runSequence('build-browser-test', 'build-browser', cb);
|
56 | });
|
57 |
|
58 |
|
59 | gulp.task('bu' +
|
60 | 'ild-browser', function () {
|
61 | var browserOutput = 'lib/browser';
|
62 |
|
63 | var appBundler = browserify({
|
64 | entries: ['src/index.js'],
|
65 | cache: {},
|
66 | standalone: 'neo4j',
|
67 | packageCache: {}
|
68 | }).transform(babelify.configure({
|
69 | presets: ['es2015', 'stage-3'], ignore: /external/
|
70 | })).bundle();
|
71 |
|
72 |
|
73 | appBundler
|
74 | .on('error', gutil.log)
|
75 | .pipe(source('neo4j-web.js'))
|
76 | .pipe(gulp.dest(browserOutput));
|
77 |
|
78 | return appBundler
|
79 | .on('error', gutil.log)
|
80 | .pipe(source('neo4j-web.min.js'))
|
81 | .pipe(buffer())
|
82 | .pipe(uglify())
|
83 | .pipe(gulp.dest(browserOutput));
|
84 | });
|
85 |
|
86 | gulp.task('build-browser-test', function(){
|
87 | var browserOutput = 'lib/browser/';
|
88 | var testFiles = [];
|
89 | return gulp.src('./test/**/*.test.js')
|
90 | .pipe( through.obj( function( file, enc, cb ) {
|
91 | if(file.path.indexOf('examples.test.js') < 0) {
|
92 | testFiles.push( file.path );
|
93 | }
|
94 | cb();
|
95 | }, function(cb) {
|
96 |
|
97 | this.push( testFiles );
|
98 | cb();
|
99 | }))
|
100 | .pipe( through.obj( function( testFiles, enc, cb) {
|
101 | browserify({
|
102 | entries: testFiles,
|
103 | cache: {},
|
104 | debug: true
|
105 | }).transform(babelify.configure({
|
106 | presets: ['es2015', 'stage-3'], plugins: ['transform-runtime'], ignore: /external/
|
107 | }))
|
108 | .bundle(function(err, res){
|
109 | cb();
|
110 | })
|
111 | .on('error', gutil.log)
|
112 | .pipe(source('neo4j-web.test.js'))
|
113 | .pipe(gulp.dest(browserOutput))
|
114 | },
|
115 | function(cb) {
|
116 | cb()
|
117 | }
|
118 | ));
|
119 | });
|
120 |
|
121 | var buildNode = function(options) {
|
122 | return gulp.src(options.src)
|
123 | .pipe(babel({presets: ['es2015', 'stage-3'], plugins: ['transform-runtime'], ignore: ['src/external/**/*.js']}))
|
124 | .pipe(gulp.dest(options.dest))
|
125 | };
|
126 |
|
127 | gulp.task('nodejs', function(){
|
128 | return buildNode({
|
129 | src: 'src/**/*.js',
|
130 | dest: 'lib'
|
131 | });
|
132 | });
|
133 |
|
134 | gulp.task('all', function(cb){
|
135 | runSequence('nodejs', 'browser', cb);
|
136 | });
|
137 |
|
138 |
|
139 | gulp.task('install-driver-into-sandbox', ['nodejs'], function(){
|
140 | var testDir = path.join(os.tmpdir(), 'sandbox');
|
141 | fs.emptyDirSync(testDir);
|
142 |
|
143 | var packageJsonContent = JSON.stringify({
|
144 | "dependencies":{
|
145 | "neo4j-driver" : __dirname
|
146 | }
|
147 | });
|
148 |
|
149 | return file('package.json', packageJsonContent, {src:true})
|
150 | .pipe(gulp.dest(testDir))
|
151 | .pipe(install());
|
152 | });
|
153 |
|
154 | gulp.task('test', function(cb){
|
155 | runSequence('test-nodejs', 'test-browser', 'run-tck', function (err) {
|
156 | if (err) {
|
157 | var exitCode = 2;
|
158 | console.log('[FAIL] test task failed - exiting with code ' + exitCode);
|
159 | return process.exit(exitCode);
|
160 | }
|
161 | return cb();
|
162 | });
|
163 | });
|
164 |
|
165 | gulp.task('test-nodejs', ['install-driver-into-sandbox'], function () {
|
166 | return gulp.src('test/**/*.test.js')
|
167 | .pipe(jasmine({
|
168 |
|
169 |
|
170 |
|
171 |
|
172 | includeStackTrace: true
|
173 | }));
|
174 | });
|
175 |
|
176 | gulp.task('test-boltkit', ['nodejs'], function () {
|
177 | return gulp.src('test/**/*.boltkit.it.js')
|
178 | .pipe(jasmine({
|
179 |
|
180 |
|
181 |
|
182 |
|
183 | includeStackTrace: true
|
184 | }));
|
185 | });
|
186 |
|
187 | gulp.task('test-browser', function (cb) {
|
188 | runSequence('all', 'run-browser-test', cb)
|
189 | });
|
190 |
|
191 | gulp.task('run-browser-test', function(){
|
192 | return gulp.src('lib/browser/neo4j-web.test.js')
|
193 | .pipe(jasmineBrowser.specRunner({console: true}))
|
194 | .pipe(jasmineBrowser.headless())
|
195 | });
|
196 |
|
197 | gulp.task('watch', function () {
|
198 | return watch('src/**/*.js', batch(function (events, done) {
|
199 | gulp.start('all', done);
|
200 | }));
|
201 | });
|
202 |
|
203 | gulp.task('watch-n-test', ['test-nodejs'], function () {
|
204 | return gulp.watch(['src/**/*.js', "test/**/*.js"], ['test-nodejs'] );
|
205 | });
|
206 |
|
207 | var featureFiles = 'https://s3-eu-west-1.amazonaws.com/remoting.neotechnology.com/driver-compliance/tck.tar.gz';
|
208 | var featureHome = './build/tck';
|
209 |
|
210 | gulp.task('download-tck', function() {
|
211 | return download(featureFiles)
|
212 | .pipe(decompress({strip: 1}))
|
213 | .pipe(gulp.dest(featureHome));
|
214 | });
|
215 |
|
216 | gulp.task('run-tck', ['download-tck', 'nodejs'], function() {
|
217 | return gulp.src(featureHome + "/*").pipe(cucumber({
|
218 | 'steps': 'test/v1/tck/steps/*.js',
|
219 | 'format': 'progress',
|
220 | 'tags' : ['~@fixed_session_pool', '~@db', '~@equality', '~@streaming_and_cursor_navigation']
|
221 | }));
|
222 | });
|
223 |
|
224 |
|
225 | gulp.task('set', function() {
|
226 |
|
227 | var version = minimist(process.argv.slice(2), { string: 'version' }).version;
|
228 |
|
229 | if (!semver.valid(version)) {
|
230 | throw 'Invalid version "' + version + '"';
|
231 | }
|
232 |
|
233 |
|
234 | var versionFile = path.join('src', 'version.js');
|
235 | return gulp.src([versionFile], {base: "./"})
|
236 | .pipe(replace('0.0.0-dev', version))
|
237 | .pipe(gulp.dest('./'));
|
238 |
|
239 | });
|
240 |
|
241 |
|
242 | var neo4jHome = path.resolve('./build/neo4j');
|
243 | var neorunPath = path.resolve('./neokit/neorun.py');
|
244 | var neorunStartArgsName = "--neorun.start.args";
|
245 |
|
246 | gulp.task('start-neo4j', function() {
|
247 |
|
248 | var neorunStartArgs = '-p neo4j';
|
249 | process.argv.slice(2).forEach(function (val) {
|
250 | if(val.startsWith(neorunStartArgsName))
|
251 | {
|
252 | neorunStartArgs = val.split("=")[1];
|
253 | }
|
254 | });
|
255 |
|
256 | neorunStartArgs = neorunStartArgs.match(/\S+/g) || '';
|
257 |
|
258 | return runScript([
|
259 | neorunPath, '--start=' + neo4jHome
|
260 | ].concat( neorunStartArgs ) );
|
261 | });
|
262 |
|
263 | gulp.task('stop-neo4j', function() {
|
264 | return runScript([
|
265 | neorunPath, '--stop=' + neo4jHome
|
266 | ]);
|
267 | });
|
268 |
|
269 | var runScript = function(cmd) {
|
270 | var spawnSync = childProcess.spawnSync, child, code;
|
271 | child = spawnSync('python', cmd);
|
272 | console.log("Script Outputs:\n" + child.stdout.toString());
|
273 | var error = child.stderr.toString();
|
274 | if (error.trim() !== "")
|
275 | console.log("Script Errors:\n"+ error);
|
276 | code = child.status;
|
277 | if( code !==0 )
|
278 | {
|
279 | throw "Script finished with code " + code
|
280 | }
|
281 | };
|