Replace Grunt with Gulp

Also bump some libraries to the latest versions

Implements blueprint move-to-gulp
Related to blueprint ui-plugins

Change-Id: Iffcd5c2371a01969746ce4d18a88181246d674fd
This commit is contained in:
Vitaly Kramskikh 2015-02-10 11:35:25 +03:00
parent 53212a16b0
commit 5b62abc258
17 changed files with 4612 additions and 2675 deletions

1
.gitignore vendored
View File

@ -22,6 +22,7 @@ nailgun.log
lock
node_modules
bower_components
nailgun/static/js/libs/bower
*.egg

View File

@ -115,7 +115,7 @@ your Fuel ISO build environment on Ubuntu 14.04:
sudo gem install bundler -v 1.2.1
sudo gem install builder
sudo pip install xmlbuilder jinja2
sudo npm install -g grunt-cli
sudo npm install -g gulp
#. If you haven't already done so, get the source code::

View File

@ -153,7 +153,7 @@ Setup for Web UI Tests
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
sudo npm install -g grunt-cli
sudo npm install -g gulp
cd nailgun
npm install
@ -223,7 +223,7 @@ Running Nailgun in Fake Mode
cd nailgun
npm install
grunt bower
gulp bower
#. Populate the database from fixtures::
@ -243,7 +243,7 @@ Running Nailgun in Fake Mode
#. (optional) To create a compressed version of UI and put it into static_compressed dir::
grunt build --static-dir=static_compressed
gulp build --static-dir=static_compressed
Note: Diagnostic Snapshot is not available in a Fake mode.

View File

@ -25,11 +25,11 @@ Validating translations
To search for absent and unnecessary translation keys you can perform the following steps:
#. Open terminal and cd to fuel-web/nailgun directory.
#. Run "grunt i18n:validate" to start the validation.
#. Run "gulp i18n:validate" to start the validation.
If there are any mismatches, you'll see the list of mismatching keys.
Grunt task "i18n:validate" has one optional argument - a comma-separated list of
Gulp task "i18n:validate" has one optional argument - a comma-separated list of
languages to compare with base English en-US translations. Run
"grunt i18n:validate:zh-CN" to perform comparison only between English and
Chinese keys. You can also run "grunt i18n:validate:zh-CN,ru-RU" to perform
comparison between English-Chinese and English-Russian keys.
"gulp i18n:validate --locales=zh-CN" to perform comparison only between English
and Chinese keys. You can also run "grunt i18n:validate --locales=zh-CN,ru-RU"
to perform comparison between English-Chinese and English-Russian keys.

View File

@ -7,15 +7,15 @@ managed by Bower_ (run in browser).
Managing NPM Packages
---------------------
NPM packages such as grunt_, bower_ and others are used in a development
NPM packages such as gulp_, bower_ and others are used in a development
environment only. Used NPM packages are listed in the *devDependencies* section
of a package.json file. To install all required packages, run::
npm install
To use grunt_ you also need to install the grunt-cli package globally::
To use gulp_ you also need to install the gulp package globally::
sudo npm install -g grunt-cli
sudo npm install -g gulp
To add a new package, it is not enough just to add a new entry to a
package.json file because npm-shrinkwrap_ is used to lock down package
@ -44,7 +44,7 @@ Managing Bower Packages
Bower_ is used to download libraries that run in browser. To add a new package,
just add an entry to dependencies section of a bower.json file and run::
grunt bower
gulp bower
to download it. The new package will be placed in the
nailgun/static/js/libs/bower/ directory. If the package contains more than one
@ -57,5 +57,5 @@ nailgun/static/js/libs/custom/ directory.
.. _npm: https://www.npmjs.org/
.. _bower: http://bower.io/
.. _grunt: http://gruntjs.com/
.. _npm-shrinkwrap: https://www.npmjs.org/doc/cli/npm-shrinkwrap.html
.. _gulp: http://gulpjs.com/
.. _npm-shrinkwrap: https://www.npmjs.org/doc/cli/npm-shrinkwrap.html

View File

@ -1,3 +0,0 @@
{
"directory": "bower"
}

View File

@ -1,313 +0,0 @@
/*
* Copyright 2014 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
module.exports = function(grunt) {
var pkg = grunt.file.readJSON('package.json');
var staticDir = grunt.option('static-dir') || '/tmp/static_compressed';
var staticBuildPreparationDir = staticDir + '/_prepare_build';
var staticBuildDir = staticDir + '/_build';
grunt.initConfig({
pkg: pkg,
requirejs: {
compile: {
options: require('lodash-node').merge(require('requirejs')('static/js/config.js'), {
baseUrl: '.',
appDir: staticBuildPreparationDir + '/static',
dir: staticBuildDir,
optimize: 'uglify2',
optimizeCss: 'standard',
wrapShim: true,
pragmas: {
compressed: true
},
map: {
'*': {
JSXTransformer: 'empty:'
}
},
paths: {
react: 'js/libs/bower/react/js/react-with-addons.min'
},
stubModules: ['jsx'],
modules: [
{
name: 'js/main',
exclude: ['require-css/normalize']
}
]
})
}
},
lintspaces: {
styles: {
options: {
showValid: true,
newline: true,
indentation: 'spaces',
spaces: 2,
newlineMaximum: 2,
trailingspaces: true,
ignores: ['js-comments']
},
src: [
'static/**/*.less'
]
},
javascript: {
options: {
showValid: true,
newline: true,
indentation: 'spaces',
spaces: 4,
trailingspaces: true,
ignores: ['js-comments']
},
src: [
'static/**/*.js',
'static/**/*.jsx',
'!static/js/libs/**',
'!static/js/expression/parser.js'
]
}
},
jshint: {
options: {
reporter: require('jshint-stylish'),
jshintrc: '.jshintrc'
},
all: [
staticBuildPreparationDir + '/static/**/*.js',
'!' + staticBuildPreparationDir + '/static/js/libs/**',
'!' + staticBuildPreparationDir + '/static/js/expression/parser.js'
]
},
jscs: {
options: {
config: '.jscsrc'
},
js: {
src: [
'Gruntfile.js',
'static/**/*.js',
'!static/js/libs/**',
'!static/js/expression/parser.js'
]
},
jsx: {
options: {
esprima: 'esprima-fb'
},
src: [
'static/**/*.jsx'
]
}
},
less: {
all: {
files: [
{
expand: true,
src: ['static/**/styles.less'],
dest: staticBuildPreparationDir,
ext: '.css'
}
]
}
},
bower: {
install: {
options: {
//set install to true to load Bower packages from inet
install: true,
targetDir: 'static/js/libs/bower',
verbose: true,
cleanTargetDir: false,
cleanBowerDir: true,
layout: 'byComponent',
bowerOptions: {
production: true,
install: '--offline'
}
}
}
},
react: {
compile: {
files: [
{
expand: true,
src: [staticBuildPreparationDir + '/static/**/*.jsx'],
ext: '.js'
}
]
}
},
copy: {
prepare_build: {
files: [
{
expand: true,
src: [
'static/**',
'!**/*.less',
'!**/*.js',
'!**/*.jsx',
'!**/*.jison'
],
dest: staticBuildPreparationDir + '/'
}
]
},
preprocess_js: {
files: [
{
expand: true,
src: [
'static/**/*.js',
'static/**/*.jsx',
'!**/JSXTransformer.js'
],
dest: staticBuildPreparationDir + '/'
}
],
options: {
process: function(content, path) {
// use CSS loader instead LESS loader - styles are precompiled
content = content.replace(/less!/g, 'require-css/css!');
// remove explicit calls to JSX loader plugin
content = content.replace(/jsx!/g, '');
// add header required for JSXTransformer to all .jsx files
if (/\.jsx$/.test(path)) {
content = '/** @jsx React.DOM */\n' + content;
}
return content;
}
}
},
finalize_build: {
files: [
{
expand: true,
cwd: staticBuildDir,
src: ['**'],
dest: staticDir
}
],
options: {
force: true
}
}
},
clean: {
trim: {
expand: true,
cwd: staticBuildDir,
src: [
'**/*.js',
'!js/main.js',
'!js/libs/bower/requirejs/js/require.js',
'**/*.css',
'!**/styles.css',
'templates',
'i18n'
]
},
jsx: {
expand: true,
cwd: staticBuildPreparationDir,
src: ['**/*.jsx']
},
prepare_build: {
src: [staticDir]
},
finalize_build: {
src: [staticBuildDir, staticBuildPreparationDir]
},
options: {
force: true
}
},
cleanempty: {
trim: {
expand: true,
cwd: staticBuildDir,
src: ['**']
},
options: {
files: false,
force: true
}
},
replace: {
sha: {
src: 'static/index.html',
dest: staticBuildDir + '/',
replacements: [{
from: '__COMMIT_SHA__',
to: function() {
return grunt.config.get('meta.revision');
}
}]
}
},
revision: {
options: {
short: false
}
},
jison: {
target: {
src: 'static/js/expression/config.jison',
dest: 'static/js/expression/parser.js',
options: {
moduleType: 'js'
}
}
}
});
Object.keys(pkg.devDependencies)
.filter(function(npmTaskName) { return npmTaskName.indexOf('grunt-') === 0; })
.forEach(grunt.loadNpmTasks.bind(grunt));
grunt.registerTask('build', [
'bower',
'clean:prepare_build',
'copy:prepare_build',
'copy:preprocess_js',
'less',
'react',
'clean:jsx',
'requirejs',
'clean:trim',
'cleanempty:trim',
'revision',
'replace',
'copy:finalize_build',
'clean:finalize_build'
]);
grunt.registerTask('default', ['build']);
grunt.registerTask('lint-ui', [
'lintspaces',
'jscs',
'clean:prepare_build',
'copy:preprocess_js',
'react',
'clean:jsx',
'jshint'
]);
grunt.task.loadTasks('grunt');
};

View File

@ -1,62 +1,57 @@
{
"name": "fuel-web",
"dependencies": {
"jquery": "1.9.1",
"jquery-cookie": "1.4.1",
"classnames": "1.1.4",
"react": "0.13.1",
"requirejs": "2.1.15",
"requirejs-plugins": "1.0.3",
"requirejs-text": "2.0.12",
"require-css": "0.1.0",
"jsx-requirejs-plugin": "0.5.1",
"routefilter": "0.2.1",
"lodash": "2.4.1",
"autoNumeric": "1.9.12",
"backbone": "1.1.2",
"backbone.stickit": "0.7.0",
"cocktail": "0.5.7",
"i18next": "1.7.1",
"backbone-deep-model": "0.10.4",
"less": "1.5.1"
"name": "fuel-web",
"dependencies": {
"jquery": "1.9.1",
"jquery-cookie": "1.4.1",
"classnames": "1.1.4",
"react": "0.13.1",
"requirejs": "2.1.16",
"requirejs-plugins": "1.0.3",
"requirejs-text": "2.0.12",
"require-css": "0.1.0",
"jsx-requirejs-plugin": "0.5.1",
"routefilter": "0.2.1",
"lodash": "2.4.1",
"autoNumeric": "1.9.12",
"backbone": "1.1.2",
"backbone.stickit": "0.7.0",
"cocktail": "0.5.7",
"i18next": "1.7.1",
"backbone-deep-model": "0.10.4",
"less": "2.4.0"
},
"overrides": {
"jquery": {
"main": "jquery.js"
},
"exportsOverride": {
"jquery": {
"js": "jquery.js"
},
"react": {
"js": ["JSXTransformer.js", "react-with-addons.js", "react-with-addons.min.js"]
},
"requirejs": {
"js": "require.js"
},
"requirejs-text": {
"js": "text.js"
},
"lodash": {
"js": "**/lodash.compat.js"
},
"autoNumeric": {
"js": "autoNumeric.js"
},
"backbone.stickit": {
"js": "backbone.stickit.js"
},
"i18next": {
"js": "release/i18next-1.7.1.js"
},
"backbone-deep-model": {
"js": "distribution/deep-model.js"
},
"less": {
"js": "dist/less-1.5.1.js"
}
"react": {
"main": [
"JSXTransformer.js",
"react-with-addons.js",
"react-with-addons.min.js"
]
},
"ignore": [
"**/.*",
"node_modules",
"test",
"tests"
],
"private": true
"requirejs-plugins": {
"main": "src/json.js"
},
"lodash": {
"main": "dist/lodash.compat.js"
},
"autoNumeric": {
"main": "autoNumeric.js"
},
"i18next": {
"main": "release/i18next-1.7.1.js"
},
"backbone-deep-model": {
"main": "distribution/deep-model.js"
}
},
"ignore": [
"**/.*",
"node_modules",
"test",
"tests"
],
"private": true
}

View File

@ -1,43 +0,0 @@
'use strict';
module.exports = function(grunt) {
var _ = require('lodash-node');
grunt.registerTask('i18n', 'Search for missing keys from different locales in translation.json', function(task, param) {
if (task == 'validate') {
startValidationTask(param);
}
function startValidationTask(param) {
var baseLocale = 'en-US';
var translations = grunt.file.readJSON('static/i18n/translation.json');
var existingLocales = _.keys(translations);
var locales = param ? param.split(',') : existingLocales;
var processedTranslations = {};
function processTranslations(translations) {
function processPiece(base, piece) {
return _.map(piece, function(value, key) {
var localBase = base ? base + '.' + key : key;
return _.isPlainObject(value) ? processPiece(localBase, value) : localBase;
});
}
return _.uniq(_.flatten(processPiece(null, translations.translation))).sort();
}
_.each(_.union(locales, [baseLocale]), function(locale) {
processedTranslations[locale] = processTranslations(translations[locale]);
});
function compareLocales(locale1, locale2) {
return _.without.apply(null, [processedTranslations[locale1]].concat(processedTranslations[locale2]));
}
_.each(_.without(locales, baseLocale), function(locale) {
grunt.log.errorlns('The list of keys present in %s but absent in %s:', baseLocale, locale);
grunt.log.writeln(compareLocales(baseLocale, locale).join('\n'));
grunt.log.errorlns('The list of keys missing in %s:', baseLocale);
grunt.log.writeln(compareLocales(locale, baseLocale).join('\n'));
});
}
});
};

37
nailgun/gulp/i18n.js Normal file
View File

@ -0,0 +1,37 @@
'use strict';
var fs = require('fs');
var gutil = require('gulp-util');
var _ = require('lodash-node');
function validate(translations, locales) {
var processedTranslations = {};
var baseLocale = 'en-US';
var existingLocales = _.keys(translations);
if (!locales) locales = existingLocales;
function processTranslations(translations) {
function processPiece(base, piece) {
return _.map(piece, function(value, key) {
var localBase = base ? base + '.' + key : key;
return _.isPlainObject(value) ? processPiece(localBase, value) : localBase;
});
}
return _.uniq(_.flatten(processPiece(null, translations.translation))).sort();
}
_.each(_.union(locales, [baseLocale]), function(locale) {
processedTranslations[locale] = processTranslations(translations[locale]);
});
function compareLocales(locale1, locale2) {
return _.without.apply(null, [processedTranslations[locale1]].concat(processedTranslations[locale2]));
}
_.each(_.without(locales, baseLocale), function(locale) {
gutil.log(gutil.colors.red('The list of keys present in', baseLocale, 'but absent in', locale, ':\n') + compareLocales(baseLocale, locale).join('\n'));
gutil.log(gutil.colors.red('The list of keys missing in', baseLocale, ':\n') + compareLocales(locale, baseLocale).join('\n'));
});
}
module.exports = {validate: validate};

214
nailgun/gulpfile.js Normal file
View File

@ -0,0 +1,214 @@
/*
* Copyright 2015 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
//jshint strict:false
var argv = require('minimist')(process.argv.slice(2));
var fs = require('fs');
var path = require('path');
var spawn = require('child_process').spawn;
var rimraf = require('rimraf');
var _ = require('lodash-node');
var gulp = require('gulp');
var gutil = require('gulp-util');
var runSequence = require('run-sequence');
var bower = require('gulp-bower');
var mainBowerFiles = require('main-bower-files');
var filter = require('gulp-filter');
var react = require('gulp-react');
var less = require('gulp-less');
var replace = require('gulp-replace');
var jison = require('gulp-jison');
var lintspaces = require('gulp-lintspaces');
var jscs = require('gulp-jscs');
var jscsConfig = JSON.parse(fs.readFileSync('./.jscsrc'));
var jshint = require('gulp-jshint');
var jshintConfig = JSON.parse(fs.readFileSync('./.jshintrc'));
var intermediate = require('gulp-intermediate');
var rjs = require('requirejs');
var rjsConfig = _.merge(rjs('static/js/config.js'), {
baseUrl: '.',
appDir: 'static',
optimize: 'uglify2',
optimizeCss: 'standard',
wrapShim: true,
pragmas: {
compressed: true
},
map: {
'*': {
JSXTransformer: 'empty:'
}
},
paths: {
react: 'js/libs/bower/react/react-with-addons.min'
},
stubModules: ['jsx'],
modules: [
{
name: 'js/main',
exclude: ['require-css/normalize']
}
]
});
var jsFiles = ['static/js/**/*.js', '!static/js/libs/**', '!static/js/expression/parser.js'];
var jsxFiles = ['static/js/**/*.jsx', '!static/js/libs/**'];
var styleFiles = 'static/styles/*.less';
var jsFilter = filter('**/*.js');
var jsxFilter = filter('**/*.jsx');
var lessFilter = filter('**/*.less');
var indexFilter = filter('index.html');
var buildResultFilter = filter([
'index.html',
'js/main.js',
'js/libs/bower/requirejs/require.js',
'css/styles.css',
'img/**',
'font/**',
'favicon.ico'
]);
var validateTranslations = require('./gulp/i18n').validate;
gulp.task('i18n:validate', function() {
var tranlations = JSON.parse(fs.readFileSync('static/translations/core.json'));
var locales = argv.locales ? argv.locales.split(',') : null;
validateTranslations(tranlations, locales);
});
gulp.task('bower:fetch', bower);
gulp.task('bower', ['bower:fetch'], function() {
var bowerDir = 'static/js/libs/bower/';
rimraf.sync(bowerDir);
return gulp.src(mainBowerFiles({checkExistence: true}), {base: 'bower_components'})
.pipe(gulp.dest(bowerDir));
});
gulp.task('jison', function() {
return gulp.src('static/js/expression/parser.jison')
.pipe(jison({moduleType: 'js'}))
.pipe(gulp.dest('static/js/expression/'));
});
gulp.task('jscs:jsx', function() {
return gulp.src(jsxFiles)
.pipe(jscs(_.extend({esprima: 'esprima-fb'}, jscsConfig)));
});
gulp.task('jscs:js', function() {
return gulp.src(jsFiles)
.pipe(jscs(jscsConfig));
});
gulp.task('jshint', function() {
return gulp.src(jsxFiles.concat(jsFiles))
.pipe(jsxFilter)
.pipe(react())
.pipe(jsxFilter.restore())
.pipe(jshint(jshintConfig))
.pipe(jshint.reporter('jshint-stylish'));
});
var lintspacesConfig = {
showValid: true,
newline: true,
trailingspaces: true,
indentation: 'spaces'
};
gulp.task('lintspaces:js', function() {
return gulp.src(jsxFiles.concat(jsFiles))
.pipe(lintspaces(_.extend({}, lintspacesConfig, {
ignores: ['js-comments'],
spaces: 4
})))
.pipe(lintspaces.reporter());
});
gulp.task('lintspaces:styles', function() {
return gulp.src(styleFiles)
.pipe(lintspaces(_.extend({}, lintspacesConfig, {
ignores: ['js-comments'],
spaces: 2,
newlineMaximum: 2
})))
.pipe(lintspaces.reporter());
});
gulp.task('lint', [
'jscs:js',
'jscs:jsx',
'jshint',
'lintspaces:js',
'lintspaces:styles'
]);
var dest = argv['static-dir'] || '/tmp/static_compressed';
gulp.task('rjs', function() {
rimraf.sync(dest);
return gulp.src([
'static/**/*',
'static/**/*.js',
'static/**/*.jsx',
'static/**/styles.less'
])
.pipe(jsxFilter)
.pipe(react())
.pipe(jsxFilter.restore())
.pipe(lessFilter)
.pipe(less())
.pipe(lessFilter.restore())
.pipe(jsFilter)
// use CSS loader instead LESS loader - styles are precompiled
.pipe(replace(/less!/g, 'require-css/css!'))
// remove explicit calls to JSX loader plugin
.pipe(replace(/jsx!/g, ''))
.pipe(jsFilter.restore())
.pipe(indexFilter)
.pipe(replace('__COMMIT_SHA__', Date.now()))
.pipe(indexFilter.restore())
.pipe(intermediate({output: '_build'}, function(tempDir, cb) {
var configFile = path.join(tempDir, 'build.json');
rjsConfig.appDir = tempDir;
rjsConfig.dir = path.join(tempDir, '_build');
fs.createWriteStream(configFile).write(JSON.stringify(rjsConfig));
var rjs = spawn('./node_modules/.bin/r.js', ['-o', configFile]);
rjs.stdout.on('data', function(data) {
_(data.toString().split('\n')).compact().map(function(line) {
gutil.log(line);
});
});
rjs.on('close', cb);
}))
.pipe(buildResultFilter)
.pipe(gulp.dest(dest));
});
gulp.task('build', function() {
runSequence('bower', 'rjs');
});
gulp.task('default', ['build']);

File diff suppressed because it is too large Load Diff

View File

@ -6,28 +6,28 @@
"url": "https://github.com/stackforge/fuel-web.git"
},
"devDependencies": {
"bower": "~1.3.12",
"casperjs": "~1.1.0-beta3",
"esprima-fb": "~8001.2001.0-dev-harmony-fb",
"grunt": "~0.4.2",
"grunt-bower-task": "~0.4.0",
"grunt-cleanempty": "~0.2.0",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-copy": "~0.5.0",
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-less": "~0.8.2",
"grunt-contrib-requirejs": "~0.4.4",
"grunt-debug-task": "~0.1.3",
"grunt-git-revision": "~0.0.1",
"grunt-jison": "~1.2.1",
"grunt-jscs": "~1.2.0",
"grunt-lintspaces": "~0.6.0",
"grunt-react": "~0.12.0",
"grunt-text-replace": "~0.3.12",
"jison": "~0.4.13",
"jshint-stylish": "~0.4.0",
"less": "~1.5.1",
"gulp": "~3.8.11",
"gulp-bower": "~0.0.10",
"gulp-filter": "~2.0.1",
"gulp-intermediate": "~3.0.1",
"gulp-jison": "~1.2.0",
"gulp-jscs": "~1.4.0",
"gulp-jshint": "~1.9.4",
"gulp-less": "~3.0.2",
"gulp-lintspaces": "~0.2.3",
"gulp-react": "~3.0.1",
"gulp-replace": "~0.5.3",
"gulp-util": "~3.0.4",
"jshint-stylish": "~1.0.1",
"lodash-node": "~2.4.1",
"requirejs": "~2.1.15",
"main-bower-files": "~2.6.2",
"minimist": "~1.1.1",
"requirejs": "~2.1.16",
"rimraf": "~2.2.8",
"run-sequence": "~1.0.2",
"uglify-js": "~2.4.16"
}
}

View File

@ -11,7 +11,7 @@
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<link rel="shortcut icon" href="/static/favicon.ico" type="image/x-icon">
<script src="/static/js/libs/bower/requirejs/js/require.js"></script>
<script src="/static/js/libs/bower/requirejs/require.js"></script>
<script type="text/javascript">
// checks code taken from https://github.com/Modernizr/Modernizr
var hasCookies = (function() {

View File

@ -20,33 +20,33 @@ define(function() {
baseUrl: 'static',
waitSeconds: 60,
paths: {
jquery: 'js/libs/bower/jquery/js/jquery',
jquery: 'js/libs/bower/jquery/jquery',
'jquery-cookie': 'js/libs/bower/jquery-cookie/jquery.cookie',
'jquery-timeout': 'js/libs/custom/jquery.timeout',
'jquery-ui': 'js/libs/custom/jquery-ui-1.10.2.custom',
'jquery-autoNumeric': 'js/libs/bower/autoNumeric/js/autoNumeric',
'jquery-autoNumeric': 'js/libs/bower/autoNumeric/autoNumeric',
utils: 'js/utils',
expression: 'js/expression',
keystone_client: 'js/keystone_client',
lodash: 'js/libs/bower/lodash/js/lodash.compat',
underscore: 'js/libs/bower/lodash/js/lodash.compat',
lodash: 'js/libs/bower/lodash/dist/lodash.compat',
underscore: 'js/libs/bower/lodash/dist/lodash.compat',
backbone: 'js/libs/bower/backbone/backbone',
'backbone-lodash-monkeypatch': 'js/libs/custom/backbone-lodash-monkeypatch',
classnames: 'js/libs/bower/classnames/index',
react: 'js/libs/bower/react/js/react-with-addons',
JSXTransformer: 'js/libs/bower/react/js/JSXTransformer',
jsx: 'js/libs/bower/jsx-requirejs-plugin/jsx',
react: 'js/libs/bower/react/react-with-addons',
JSXTransformer: 'js/libs/bower/react/JSXTransformer',
jsx: 'js/libs/bower/jsx-requirejs-plugin/js/jsx',
'react.backbone': 'js/libs/custom/react.backbone',
stickit: 'js/libs/bower/backbone.stickit/js/backbone.stickit',
stickit: 'js/libs/bower/backbone.stickit/backbone.stickit',
coccyx: 'js/libs/custom/coccyx',
cocktail: 'js/libs/bower/cocktail/Cocktail',
routefilter: 'js/libs/bower/routefilter/backbone.routefilter.min',
routefilter: 'js/libs/bower/routefilter/dist/backbone.routefilter.min',
bootstrap: 'js/libs/custom/bootstrap.min',
text: 'js/libs/bower/requirejs-text/js/text',
json: 'js/libs/bower/requirejs-plugins/json',
i18next: 'js/libs/bower/i18next/js/i18next-1.7.1',
deepModel: 'js/libs/bower/backbone-deep-model/js/deep-model',
lessLibrary: 'js/libs/bower/less/js/less-1.5.1',
text: 'js/libs/bower/requirejs-text/text',
json: 'js/libs/bower/requirejs-plugins/src/json',
i18next: 'js/libs/bower/i18next/release/i18next-1.7.1',
deepModel: 'js/libs/bower/backbone-deep-model/distribution/deep-model',
lessLibrary: 'js/libs/bower/less/dist/less',
'require-css': 'js/libs/bower/require-css',
'require-less': 'js/require-less',
i18n: 'js/i18n',

View File

@ -79,8 +79,9 @@ ROOT=$(dirname `readlink -f $0`)
TESTRTESTS="nosetests"
FLAKE8="flake8"
PEP8="pep8"
CASPERJS="./node_modules/casperjs/bin/casperjs"
LINTUI="grunt lint-ui"
CASPERJS="./node_modules/.bin/casperjs"
GULP="./node_modules/.bin/gulp"
LINTUI="${GULP} lint"
# test options
testrargs=
@ -201,7 +202,7 @@ function run_tests {
fi
if [ $lint_ui_checks -eq 1 ]; then
echo "Starting JSHint tests..."
echo "Starting lint checks..."
run_lint_ui || errors+=" lint_ui_checks"
fi
@ -292,7 +293,7 @@ function run_webui_tests {
# test compression
echo -n "Compressing UI... "
local output=$(grunt build --static-dir=$COMPRESSED_STATIC_DIR 2>&1)
local output=$(${GULP} build --static-dir=$COMPRESSED_STATIC_DIR 2>&1)
if [ $? -ne 0 ]; then
echo "$output"
popd >> /dev/null