This removes `gulp` and provides a simpler `karma` and `webpack`, `webpack-watch` npm scripts. For actual development, users will need the Rails stack anyway, so it won't make sense to keep a separate set of dependencies up to date. * Instead of `gulp webpack`, use `npm run webpack`. * Instead of `gulp watch`, use `npm run webpack-watch`, which is *drastically* faster than gulp watch-polling. * Instead of `gulp tests:karma` use `npm run karma`, or just `npm test`. This also removes all traces of express and restores the Rails styleguide. It is not whitelisted for precompilation and is only available in the context of the development mode. To access the styleguide, use `/assets/styleguide.html`.pull/4356/head
parent
3848c8aef0
commit
e49c163d00
@ -1,3 +1,3 @@ |
||||
web: bundle exec unicorn --config-file config/unicorn.rb --host ${HOST:="127.0.0.1"} --port ${PORT:="8080"} --env ${RAILS_ENV:="development"} |
||||
assets: cd frontend && $(npm bin)/webpack --colors --watch --progress |
||||
web: bundle exec rails server -p ${PORT:="8080"} -b ${HOST:="127.0.0.1"} --env ${RAILS_ENV:="development"} |
||||
assets: cd frontend && npm run webpack-watch |
||||
worker: bundle exec rake jobs:work |
||||
|
@ -1,33 +0,0 @@ |
||||
#-- copyright |
||||
# OpenProject is a project management system. |
||||
# Copyright (C) 2012-2015 the OpenProject Foundation (OPF) |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License version 3. |
||||
# |
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||
# Copyright (C) 2006-2013 Jean-Philippe Lang |
||||
# Copyright (C) 2010-2013 the ChiliProject Team |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License |
||||
# as published by the Free Software Foundation; either version 2 |
||||
# 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 General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program; if not, write to the Free Software |
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
# |
||||
# See doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
NonStupidDigestAssets.whitelist = [ |
||||
'styleguide.html', |
||||
'styleguide.css', |
||||
'styleguide.js' |
||||
] |
@ -1,4 +0,0 @@ |
||||
source 'https://rubygems.org' |
||||
|
||||
gem 'livingstyleguide', '~> 2.0.0.alpha.6' |
||||
gem 'sass', '~> 3.4.12' |
@ -1,21 +0,0 @@ |
||||
GEM |
||||
remote: https://rubygems.org/ |
||||
specs: |
||||
livingstyleguide (2.0.0.alpha.6) |
||||
minisyntax (>= 0.2.5) |
||||
redcarpet (~> 3.0.0) |
||||
sass |
||||
thor |
||||
tilt |
||||
minisyntax (0.2.5) |
||||
redcarpet (3.0.0) |
||||
sass (3.4.13) |
||||
thor (0.19.1) |
||||
tilt (2.0.1) |
||||
|
||||
PLATFORMS |
||||
ruby |
||||
|
||||
DEPENDENCIES |
||||
livingstyleguide (~> 2.0.0.alpha.6) |
||||
sass (~> 3.4.12) |
@ -1,60 +0,0 @@ |
||||
doctype html |
||||
html(id="STYLEGUIDE_HTML_ID") |
||||
head |
||||
meta(charset="utf-8") |
||||
meta(content="IE=edge,chrome=1", http-equiv="X-UA-Compatible") |
||||
meta(content="The LivingStyleGuide Gem – http://livingstyleguide.org", name="generator") |
||||
meta(name="description", content=title) |
||||
title= title |
||||
link(rel='stylesheet', type='text/css', href='/assets/bundles/openproject-global.css') |
||||
!= stylesheet |
||||
script(src='/assets/bundles/openproject-global.js') |
||||
script(src='/assets/tooltips.js') |
||||
script. |
||||
angular.module('openproject-style-guide', ['ui.select', 'ngSanitize']) |
||||
|
||||
// Add uiComponents to the styleguide. |
||||
// In order to be able to do that, we have to mock some |
||||
// services that directives in uiComponents rely on. |
||||
angular.module('openproject-style-guide') |
||||
.service('ActivityService', function() {} ) |
||||
.service('ConfigurationService', function() {} ) |
||||
.service('AutoCompleteHelper', function() {} ) |
||||
.service('NotificationsService', function() { |
||||
return { |
||||
addError: function() {}, |
||||
addSuccess: function() {} |
||||
}; |
||||
}) |
||||
.requires.push('openproject.uiComponents'); |
||||
|
||||
// get all of angular to be known |
||||
script(src='/assets/bundles/openproject-core-app.js') |
||||
// avoid errors of undefined jsToolBar |
||||
script(src='/assets/jstoolbar/jstoolbar.js') |
||||
|
||||
body.livingstyleguide(ng-app='openproject-style-guide', ng-strict-di=true) |
||||
|
||||
header.livingstyleguide--header |
||||
.styleguide-banner |
||||
h1.styleguide-banner--text= title |
||||
|
||||
nav.styleguide-nav |
||||
ul.styleguide-nav--menu-items |
||||
li: a(href="#color-variables") Colors |
||||
li: a(href="#typography") Typography |
||||
li: a(href="#forms") Forms |
||||
li: a(href="#flash-messages") Flash Messages |
||||
li: a(href="#notifications") Notifications |
||||
li: a(href="#buttons") Buttons |
||||
li: a(href="#boxes") Boxes |
||||
li: a(href="#pagination") Pagination |
||||
|
||||
section.livingstyleguide--intro |
||||
p |
||||
|
||||
.livingstyleguide--container |
||||
!= content |
||||
|
||||
footer.livingstyleguide--footer |
||||
Copyright © 2015 OpenProject - All rights reserved. |
@ -1,201 +0,0 @@ |
||||
//-- copyright
|
||||
// OpenProject is a project management system.
|
||||
// Copyright (C) 2012-2015 the OpenProject Foundation (OPF)
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License version 3.
|
||||
//
|
||||
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||||
// Copyright (C) 2006-2013 Jean-Philippe Lang
|
||||
// Copyright (C) 2010-2013 the ChiliProject Team
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
// See doc/COPYRIGHT.rdoc for more details.
|
||||
//++
|
||||
|
||||
var path = require('path'); |
||||
var gulp = require('gulp'); |
||||
var jshint = require('gulp-jshint'); |
||||
var gulpWebpack = require('gulp-webpack'); |
||||
var webpack = require('webpack'); |
||||
var config = require('./webpack.config.js'); |
||||
var sass = require('gulp-ruby-sass'); |
||||
var watch = require('gulp-watch'); |
||||
var autoprefixer = require('gulp-autoprefixer'); |
||||
var livingstyleguide = require('gulp-livingstyleguide'); |
||||
var gulpFilter = require('gulp-filter'); |
||||
var replace = require('gulp-replace'); |
||||
var tsproject = require('tsproject'); |
||||
var karma = require('karma'); |
||||
var fs = require('fs'); |
||||
|
||||
var server; |
||||
|
||||
var paths = { |
||||
scripts: [ |
||||
'app/**/*.js', |
||||
'!app/vendor/**/*.js' |
||||
], |
||||
fonts: '../app/assets/fonts/**/*', |
||||
styleguide: '../app/assets/stylesheets/styleguide.html.lsg' |
||||
}; |
||||
|
||||
var deleteFolderRecursive = function(path) { |
||||
if( fs.existsSync(path) ) { |
||||
fs.readdirSync(path).forEach(function(file){ |
||||
var curPath = path + "/" + file; |
||||
|
||||
if(fs.lstatSync(curPath).isDirectory()) { |
||||
deleteFolderRecursive(curPath); |
||||
|
||||
} else { |
||||
fs.unlinkSync(curPath); |
||||
} |
||||
}); |
||||
|
||||
fs.rmdirSync(path); |
||||
} |
||||
}; |
||||
|
||||
gulp.task('lint', function() { |
||||
return gulp.src(paths.scripts) |
||||
.pipe(jshint('.jshintrc')) |
||||
.pipe(jshint.reporter('jshint-stylish')); |
||||
}); |
||||
|
||||
gulp.task('webpack', function() { |
||||
return gulp.src('app/openproject-app.js') |
||||
.pipe(gulpWebpack(config)) |
||||
.pipe(gulp.dest('../app/assets/javascripts/bundles')); |
||||
}); |
||||
|
||||
gulp.task('fonts', function() { |
||||
return gulp.src(paths.fonts).pipe(gulp.dest('./public/assets/css')); |
||||
}); |
||||
|
||||
gulp.task('sass', function() { |
||||
return gulp.src('../app/assets/stylesheets/default.css.sass') |
||||
.pipe(sass({ |
||||
'sourcemap=none': true, |
||||
bundleExec: true, |
||||
loadPath: [ |
||||
'./bower_components/foundation-apps/scss', |
||||
'./bower_components/bourbon/app/assets/stylesheets' |
||||
] |
||||
})) |
||||
// HACK: remove asset helper that is only available with asset pipeline
|
||||
.pipe(replace(/image\-url\(\"/g, 'url("/assets/')) |
||||
.pipe(autoprefixer({ |
||||
cascade: false |
||||
})) |
||||
.on('error', function(err) { |
||||
console.log(err.message); |
||||
}) |
||||
.pipe(gulp.dest('public/assets/css')); |
||||
}); |
||||
|
||||
gulp.task('styleguide', function () { |
||||
process.env.SASS_PATH = [ |
||||
'../app/assets/stylesheets', |
||||
'./bower_components/foundation-apps/scss', |
||||
'./bower_components/bourbon/app/assets/stylesheets' |
||||
].join(':'); |
||||
|
||||
var cssFilter = gulpFilter('**/*.css'), |
||||
htmlFilter = gulpFilter('**/*.html'); |
||||
|
||||
gulp.src(paths.styleguide) |
||||
.pipe(livingstyleguide({template: 'app/assets/styleguide.jade'})) |
||||
.pipe(cssFilter) |
||||
.pipe(replace(/image\-url\(\"/g, 'url("/assets/')) |
||||
.pipe(autoprefixer({ |
||||
cascade: false |
||||
})) |
||||
.pipe(cssFilter.restore()) |
||||
.pipe(htmlFilter) |
||||
.pipe(replace(/STYLEGUIDE_HTML_ID/, |
||||
path.dirname(path.resolve(paths.styleguide)) + '/styleguide') |
||||
) |
||||
.pipe(htmlFilter.restore()) |
||||
.pipe(gulp.dest('public/assets/css')); |
||||
}); |
||||
|
||||
gulp.task('express', function(done) { |
||||
var expressApp = require('./server'); |
||||
var port = process.env.PORT || 8080; |
||||
|
||||
(function startServer(port) { |
||||
server = expressApp.listen(port, function() { |
||||
console.log('Starting express server at localhost:%d', port); |
||||
done(); |
||||
}); |
||||
|
||||
server.on('error', function(err) { |
||||
if (err.code === 'EADDRINUSE') { |
||||
console.warn('Port %d already in use.', port); |
||||
startServer(++port); |
||||
} |
||||
}); |
||||
})(port); |
||||
}); |
||||
|
||||
gulp.task('default', ['webpack', 'fonts', 'styleguide', 'sass', 'express']); |
||||
gulp.task('dev', ['default', 'watch']); |
||||
gulp.task('watch', function() { |
||||
gulp.watch('app/**/*.js', ['webpack']); |
||||
gulp.watch('app/**/*.html', ['webpack']); |
||||
gulp.watch('config/locales/js-*.yml', ['webpack']); |
||||
gulp.watch('app/templates/**/*.html', ['webpack']); |
||||
|
||||
gulp.watch('../app/assets/stylesheets/**/*.scss', ['sass', 'styleguide']); |
||||
gulp.watch('../app/assets/stylesheets/**/*.sass', ['sass', 'styleguide']); |
||||
gulp.watch('../app/assets/stylesheets/**/*.lsg', ['styleguide']); |
||||
}); |
||||
|
||||
|
||||
var tsOutDir = __dirname + '/tests/unit/tests/typescript'; |
||||
|
||||
gulp.task('typescript-tests', function () { |
||||
deleteFolderRecursive(tsOutDir); |
||||
|
||||
return tsproject.src('./tsconfig.test.json', { |
||||
compilerOptions: { |
||||
outDir: tsOutDir |
||||
} |
||||
}).pipe(gulp.dest('.')); |
||||
}); |
||||
|
||||
gulp.task('tests:karma', ['typescript-tests'], function () { |
||||
karma.server.start( |
||||
{ |
||||
configFile: __dirname + '/karma.conf.js', |
||||
singleRun: true |
||||
}, |
||||
function (exitCode) { |
||||
if(exitCode === 0) { |
||||
console.info('No tests have failed'); |
||||
console.info('Files generated by tsc were deleted.'); |
||||
deleteFolderRecursive(tsOutDir); |
||||
} |
||||
else { |
||||
console.warn('Tests have failed'); |
||||
console.info('Files generated by tsc can be found in: ' + tsOutDir); |
||||
} |
||||
|
||||
process.exit(exitCode); |
||||
} |
||||
); |
||||
}); |
@ -0,0 +1,84 @@ |
||||
#!/usr/bin/env node
|
||||
|
||||
//-- copyright
|
||||
// OpenProject is a project management system.
|
||||
// Copyright (C) 2012-2015 the OpenProject Foundation (OPF)
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License version 3.
|
||||
//
|
||||
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||||
// Copyright (C) 2006-2013 Jean-Philippe Lang
|
||||
// Copyright (C) 2010-2013 the ChiliProject Team
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// 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 General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
// See doc/COPYRIGHT.rdoc for more details.
|
||||
//++
|
||||
|
||||
var path = require('path'); |
||||
var tsproject = require('tsproject'); |
||||
var karma = require('karma'); |
||||
var fs = require('fs'); |
||||
|
||||
function deleteFolderRecursive(path) { |
||||
if( fs.existsSync(path) ) { |
||||
fs.readdirSync(path).forEach(function(file){ |
||||
var curPath = path + "/" + file; |
||||
|
||||
if(fs.lstatSync(curPath).isDirectory()) { |
||||
deleteFolderRecursive(curPath); |
||||
|
||||
} else { |
||||
fs.unlinkSync(curPath); |
||||
} |
||||
}); |
||||
|
||||
fs.rmdirSync(path); |
||||
} |
||||
} |
||||
|
||||
// Clean old TS build dir
|
||||
var frontend_path = path.resolve(__dirname, '..'); |
||||
var tsOutDir = path.resolve(frontend_path, 'tests/unit/tests/typescript'); |
||||
deleteFolderRecursive(tsOutDir); |
||||
|
||||
// Compile TS
|
||||
tsproject.src(path.resolve(frontend_path, 'tsconfig.test.json'), { |
||||
compilerOptions: { |
||||
outDir: tsOutDir |
||||
} |
||||
}); |
||||
|
||||
// Run karma
|
||||
karma.server.start( |
||||
{ |
||||
configFile: path.resolve(frontend_path, 'karma.conf.js'), |
||||
singleRun: true |
||||
}, |
||||
function (exitCode) { |
||||
if(exitCode === 0) { |
||||
console.info('No tests have failed'); |
||||
console.info('Files generated by tsc were deleted.'); |
||||
deleteFolderRecursive(tsOutDir); |
||||
} |
||||
else { |
||||
console.warn('Tests have failed'); |
||||
console.info('Files generated by tsc can be found in: ' + tsOutDir); |
||||
} |
||||
|
||||
process.exit(exitCode); |
||||
} |
||||
); |
Loading…
Reference in new issue