2011-03-21 21:13:29 +00:00
|
|
|
require 'yaml'
|
2010-10-12 23:28:46 +00:00
|
|
|
include FileUtils
|
2010-01-06 00:36:58 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
|
|
|
|
|
## High level flow of the build:
|
|
|
|
|
##
|
|
|
|
|
## clean -> init -> concat -> minify -> package
|
|
|
|
|
##
|
|
|
|
|
|
|
|
|
|
|
2011-08-15 23:17:12 +00:00
|
|
|
content = File.open('angularFiles.js', 'r') {|f| f.read }
|
2012-03-28 17:50:10 +00:00
|
|
|
files = eval(content.gsub(/\};(\s|\S)*/, '}').
|
|
|
|
|
gsub(/angularFiles = /, '').
|
|
|
|
|
gsub(/:/, '=>').
|
|
|
|
|
gsub(/\/\//, '#'));
|
2010-10-08 23:43:40 +00:00
|
|
|
|
2010-10-20 04:19:28 +00:00
|
|
|
BUILD_DIR = 'build'
|
2010-10-08 23:43:40 +00:00
|
|
|
|
2012-08-29 23:56:48 +00:00
|
|
|
task :default => [:package]
|
2010-01-26 19:27:50 +00:00
|
|
|
|
2010-10-16 04:38:41 +00:00
|
|
|
|
2010-10-21 00:14:31 +00:00
|
|
|
desc 'Init the build workspace'
|
|
|
|
|
task :init do
|
2013-02-13 03:23:23 +00:00
|
|
|
%x(npm install)
|
|
|
|
|
|
2010-10-21 00:14:31 +00:00
|
|
|
FileUtils.mkdir(BUILD_DIR) unless File.directory?(BUILD_DIR)
|
2011-07-12 00:31:29 +00:00
|
|
|
|
|
|
|
|
v = YAML::load( File.open( 'version.yaml' ) )
|
|
|
|
|
match = v['version'].match(/^([^-]*)(-snapshot)?$/)
|
|
|
|
|
|
2012-08-20 15:28:04 +00:00
|
|
|
NG_VERSION = Struct.new(:full, :major, :minor, :dot, :codename, :stable).
|
2011-07-12 00:31:29 +00:00
|
|
|
new(match[1] + (match[2] ? ('-' + %x(git rev-parse HEAD)[0..7]) : ''),
|
|
|
|
|
match[1].split('.')[0],
|
|
|
|
|
match[1].split('.')[1],
|
2012-03-14 06:24:17 +00:00
|
|
|
match[1].split('.')[2].sub(/\D+.*$/, ''),
|
2012-08-20 15:28:04 +00:00
|
|
|
v['codename'],
|
|
|
|
|
v['stable'])
|
2010-10-21 00:14:31 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2010-10-16 04:38:41 +00:00
|
|
|
desc 'Clean Generated Files'
|
|
|
|
|
task :clean do
|
2010-10-20 04:19:28 +00:00
|
|
|
FileUtils.rm_r(BUILD_DIR, :force => true)
|
|
|
|
|
FileUtils.mkdir(BUILD_DIR)
|
2012-10-17 22:44:18 +00:00
|
|
|
FileUtils.rm_r('test_out', :force => true)
|
2010-10-16 04:38:41 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
desc 'Concat Scenario'
|
|
|
|
|
task :concat_scenario => :init do
|
2012-03-28 17:50:10 +00:00
|
|
|
|
|
|
|
|
concat_file('angular-scenario.js', [
|
2011-09-12 16:56:02 +00:00
|
|
|
'lib/jquery/jquery.js',
|
2012-03-23 21:03:24 +00:00
|
|
|
'src/ngScenario/angular.prefix',
|
2011-08-15 23:17:12 +00:00
|
|
|
files['angularSrc'],
|
|
|
|
|
files['angularScenario'],
|
2012-03-23 21:03:24 +00:00
|
|
|
'src/ngScenario/angular.suffix',
|
2012-03-27 04:18:01 +00:00
|
|
|
], gen_css('css/angular.css') + "\n" + gen_css('css/angular-scenario.css'))
|
2010-10-16 04:38:41 +00:00
|
|
|
end
|
|
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
|
2010-01-10 16:58:57 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
desc 'Concat AngularJS files'
|
|
|
|
|
task :concat => :init do
|
2012-03-28 17:50:10 +00:00
|
|
|
concat_file('angular.js', [
|
2012-03-27 04:18:01 +00:00
|
|
|
'src/angular.prefix',
|
|
|
|
|
files['angularSrc'],
|
|
|
|
|
'src/angular.suffix',
|
|
|
|
|
], gen_css('css/angular.css', true))
|
2011-07-29 21:22:37 +00:00
|
|
|
|
2012-03-23 21:03:24 +00:00
|
|
|
FileUtils.cp_r 'src/ngLocale', path_to('i18n')
|
2012-01-07 02:10:47 +00:00
|
|
|
|
2012-03-28 17:50:10 +00:00
|
|
|
concat_file('angular-loader.js', [
|
2012-01-07 02:10:47 +00:00
|
|
|
'src/loader.prefix',
|
|
|
|
|
'src/loader.js',
|
2012-03-27 04:18:01 +00:00
|
|
|
'src/loader.suffix'])
|
2012-03-28 17:50:10 +00:00
|
|
|
|
2012-01-07 02:10:47 +00:00
|
|
|
|
2012-04-10 23:50:31 +00:00
|
|
|
concat_module('sanitize', [
|
|
|
|
|
'src/ngSanitize/sanitize.js',
|
|
|
|
|
'src/ngSanitize/directive/ngBindHtml.js',
|
|
|
|
|
'src/ngSanitize/filter/linky.js'])
|
|
|
|
|
|
|
|
|
|
concat_module('resource', ['src/ngResource/resource.js'])
|
|
|
|
|
concat_module('cookies', ['src/ngCookies/cookies.js'])
|
2012-04-29 05:45:28 +00:00
|
|
|
concat_module('bootstrap', ['src/bootstrap/bootstrap.js'])
|
|
|
|
|
concat_module('bootstrap-prettify', ['src/bootstrap/bootstrap-prettify.js',
|
|
|
|
|
'src/bootstrap/google-prettify/prettify.js'],
|
|
|
|
|
gen_css('src/bootstrap/google-prettify/prettify.css', true))
|
2012-04-10 23:50:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
FileUtils.cp 'src/ngMock/angular-mocks.js', path_to('angular-mocks.js')
|
2012-03-28 17:50:10 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
rewrite_file(path_to('angular-mocks.js')) do |content|
|
|
|
|
|
content.sub!('"NG_VERSION_FULL"', NG_VERSION.full)
|
|
|
|
|
end
|
|
|
|
|
end
|
2012-01-07 02:10:47 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
|
|
|
|
|
desc 'Minify JavaScript'
|
2012-10-18 10:26:51 +00:00
|
|
|
task :minify => [:init, :concat, :concat_scenario] do
|
2012-08-28 19:38:34 +00:00
|
|
|
[ 'angular.js',
|
|
|
|
|
'angular-cookies.js',
|
|
|
|
|
'angular-loader.js',
|
|
|
|
|
'angular-resource.js',
|
|
|
|
|
'angular-sanitize.js',
|
|
|
|
|
'angular-bootstrap.js',
|
|
|
|
|
'angular-bootstrap-prettify.js'
|
|
|
|
|
].each do |file|
|
2013-02-12 06:46:38 +00:00
|
|
|
fork { closure_compile(file) }
|
2012-08-28 19:38:34 +00:00
|
|
|
end
|
2012-10-17 21:38:11 +00:00
|
|
|
|
|
|
|
|
Process.waitall
|
2010-01-06 00:36:58 +00:00
|
|
|
end
|
|
|
|
|
|
2010-10-16 04:38:41 +00:00
|
|
|
|
2013-01-15 17:13:28 +00:00
|
|
|
desc 'Generate version.txt and version.json files'
|
2012-09-04 23:38:01 +00:00
|
|
|
task :version => [:init] do
|
|
|
|
|
`echo #{NG_VERSION.full} > #{path_to('version.txt')}`
|
2013-01-15 17:13:28 +00:00
|
|
|
`echo '{
|
|
|
|
|
"full": "#{NG_VERSION.full}",
|
|
|
|
|
"major": "#{NG_VERSION.major}",
|
|
|
|
|
"minor": "#{NG_VERSION.minor}",
|
|
|
|
|
"dot": "#{NG_VERSION.dot}",
|
|
|
|
|
"codename": "#{NG_VERSION.codename}"\n}' > #{path_to('version.json')}`
|
2012-09-04 23:38:01 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2010-10-27 22:31:10 +00:00
|
|
|
desc 'Generate docs'
|
2011-07-21 02:29:54 +00:00
|
|
|
task :docs => [:init] do
|
2011-01-10 22:48:13 +00:00
|
|
|
`node docs/src/gen-docs.js`
|
2012-08-27 19:25:40 +00:00
|
|
|
|
|
|
|
|
[ path_to('docs/.htaccess'),
|
|
|
|
|
path_to('docs/index.html'),
|
|
|
|
|
path_to('docs/index-debug.html'),
|
|
|
|
|
path_to('docs/index-nocache.html'),
|
|
|
|
|
path_to('docs/index-jq.html'),
|
|
|
|
|
path_to('docs/index-jq-debug.html'),
|
|
|
|
|
path_to('docs/index-jq-nocache.html'),
|
|
|
|
|
path_to('docs/docs-scenario.html')
|
|
|
|
|
].each do |src|
|
|
|
|
|
rewrite_file(src) do |content|
|
2012-08-20 15:28:04 +00:00
|
|
|
content.sub!('"NG_VERSION_FULL"', NG_VERSION.full).
|
2012-08-27 19:25:40 +00:00
|
|
|
sub('"NG_VERSION_STABLE"', NG_VERSION.stable)
|
2012-08-20 15:28:04 +00:00
|
|
|
end
|
2012-08-27 19:25:40 +00:00
|
|
|
end
|
2010-10-27 22:31:10 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2010-10-12 23:28:46 +00:00
|
|
|
desc 'Create angular distribution'
|
2012-09-04 23:38:01 +00:00
|
|
|
task :package => [:clean, :minify, :version, :docs] do
|
2012-08-28 19:38:34 +00:00
|
|
|
zip_dir = "angular-#{NG_VERSION.full}"
|
|
|
|
|
zip_file = "#{zip_dir}.zip"
|
2011-06-07 19:53:40 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
FileUtils.ln_s BUILD_DIR, zip_dir
|
2012-08-31 20:49:49 +00:00
|
|
|
%x(zip -r #{zip_file} #{zip_dir})
|
2012-08-28 19:38:34 +00:00
|
|
|
FileUtils.rm zip_dir
|
2010-10-12 23:28:46 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
FileUtils.mv zip_file, path_to(zip_file)
|
2011-06-30 17:58:09 +00:00
|
|
|
|
2012-08-28 19:38:34 +00:00
|
|
|
puts "Package created: #{path_to(zip_file)}"
|
2010-10-12 23:28:46 +00:00
|
|
|
end
|
|
|
|
|
|
2010-10-16 04:38:41 +00:00
|
|
|
|
2012-09-15 15:11:32 +00:00
|
|
|
desc 'Start development webserver'
|
|
|
|
|
task :webserver, :port do |t, args|
|
2012-10-17 19:43:40 +00:00
|
|
|
exec "node lib/nodeserver/server.js #{args[:port]}"
|
2012-09-15 15:11:32 +00:00
|
|
|
end
|
2010-10-16 04:38:41 +00:00
|
|
|
|
2012-08-30 08:10:28 +00:00
|
|
|
|
2012-09-15 15:11:32 +00:00
|
|
|
desc 'Run all AngularJS tests'
|
|
|
|
|
task :test, :browsers, :misc_options do |t, args|
|
2012-08-30 08:10:28 +00:00
|
|
|
[ 'test:jqlite',
|
|
|
|
|
'test:jquery',
|
|
|
|
|
'test:modules',
|
|
|
|
|
'test:e2e'
|
|
|
|
|
].each do |task|
|
|
|
|
|
Rake::Task[task].invoke(args[:browsers], args[:misc_options])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace :test do
|
|
|
|
|
|
2012-09-15 15:11:32 +00:00
|
|
|
desc 'Run all unit tests (single run)'
|
|
|
|
|
task :unit, :browsers, :misc_options do |t, args|
|
|
|
|
|
[ 'test:jqlite',
|
|
|
|
|
'test:jquery',
|
|
|
|
|
'test:modules'
|
|
|
|
|
].each do |task|
|
|
|
|
|
Rake::Task[task].invoke(args[:browsers], args[:misc_options])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2012-08-30 08:10:28 +00:00
|
|
|
desc 'Run jqLite-based unit test suite (single run)'
|
|
|
|
|
task :jqlite, :browsers, :misc_options do |t, args|
|
|
|
|
|
start_testacular('testacular-jqlite.conf.js', true, args[:browsers], args[:misc_options])
|
2010-01-06 00:36:58 +00:00
|
|
|
end
|
|
|
|
|
|
2012-08-30 08:10:28 +00:00
|
|
|
|
|
|
|
|
desc 'Run jQuery-based unit test suite (single run)'
|
2012-09-17 17:31:44 +00:00
|
|
|
task :jquery, :browsers, :misc_options do |t, args|
|
2012-08-30 08:10:28 +00:00
|
|
|
start_testacular('testacular-jquery.conf.js', true, args[:browsers], args[:misc_options])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
desc 'Run bundled modules unit test suite (single run)'
|
|
|
|
|
task :modules, :browsers, :misc_options do |t, args|
|
|
|
|
|
start_testacular('testacular-modules.conf.js', true, args[:browsers], args[:misc_options])
|
2010-01-06 00:36:58 +00:00
|
|
|
end
|
2010-10-16 04:38:41 +00:00
|
|
|
|
2012-08-30 08:10:28 +00:00
|
|
|
|
|
|
|
|
desc 'Run e2e test suite (single run)'
|
|
|
|
|
task :e2e, :browsers, :misc_options do |t, args|
|
|
|
|
|
start_testacular('testacular-e2e.conf.js', true, args[:browsers], args[:misc_options])
|
|
|
|
|
end
|
2010-01-06 00:36:58 +00:00
|
|
|
end
|
|
|
|
|
|
2010-10-16 04:38:41 +00:00
|
|
|
|
2012-08-30 08:10:28 +00:00
|
|
|
namespace :autotest do
|
|
|
|
|
|
|
|
|
|
desc 'Run jqLite-based unit test suite (autowatch)'
|
|
|
|
|
task :jqlite, :browsers, :misc_options do |t, args|
|
|
|
|
|
start_testacular('testacular-jqlite.conf.js', false, args[:browsers], args[:misc_options])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
desc 'Run jQuery-based unit test suite (autowatch)'
|
|
|
|
|
task :jquery, :browsers, :misc_options do |t, args|
|
|
|
|
|
start_testacular('testacular-jquery.conf.js', false, args[:browsers], args[:misc_options])
|
|
|
|
|
end
|
2010-01-06 00:36:58 +00:00
|
|
|
end
|
|
|
|
|
|
2010-10-16 04:38:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
###################
|
|
|
|
|
# utility methods #
|
|
|
|
|
###################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
|
# generates css snippet from a given files and optionally applies simple minification rules
|
|
|
|
|
#
|
|
|
|
|
def gen_css(cssFile, minify = false)
|
|
|
|
|
css = ''
|
|
|
|
|
File.open(cssFile, 'r') do |f|
|
|
|
|
|
css = f.read
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if minify
|
|
|
|
|
css.gsub! /\n/, ''
|
|
|
|
|
css.gsub! /\/\*.*?\*\//, ''
|
|
|
|
|
css.gsub! /:\s+/, ':'
|
|
|
|
|
css.gsub! /\s*\{\s*/, '{'
|
|
|
|
|
css.gsub! /\s*\}\s*/, '}'
|
|
|
|
|
css.gsub! /\s*\,\s*/, ','
|
|
|
|
|
css.gsub! /\s*\;\s*/, ';'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
#escape for js
|
2010-10-19 22:34:58 +00:00
|
|
|
css.gsub! /\\/, "\\\\\\"
|
|
|
|
|
css.gsub! /'/, "\\\\'"
|
2010-10-16 04:38:41 +00:00
|
|
|
css.gsub! /\n/, "\\n"
|
|
|
|
|
|
2011-03-11 21:57:08 +00:00
|
|
|
return %Q{angular.element(document).find('head').append('<style type="text/css">#{css}</style>');}
|
2010-10-20 04:19:28 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
|
# returns path to the file in the build directory
|
|
|
|
|
#
|
|
|
|
|
def path_to(filename)
|
2010-10-27 22:31:10 +00:00
|
|
|
return File.join(BUILD_DIR, *filename)
|
2010-10-20 04:19:28 +00:00
|
|
|
end
|
2012-03-27 04:18:01 +00:00
|
|
|
|
2012-04-05 16:52:09 +00:00
|
|
|
|
2012-12-16 08:48:22 +00:00
|
|
|
##
|
|
|
|
|
# returns the 32-bit mode force flags for java compiler if supported, this makes the build much
|
|
|
|
|
# faster
|
|
|
|
|
#
|
|
|
|
|
def java32flags
|
|
|
|
|
return '-d32 -client' unless Rake::Win32.windows? || `java -version -d32 2>&1`.match(/Error/i)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2012-03-28 17:50:10 +00:00
|
|
|
def closure_compile(filename)
|
2012-08-28 19:38:34 +00:00
|
|
|
puts "Minifying #{filename} ..."
|
2012-04-05 06:10:50 +00:00
|
|
|
|
|
|
|
|
min_path = path_to(filename.gsub(/\.js$/, '.min.js'))
|
|
|
|
|
|
2012-10-17 22:36:48 +00:00
|
|
|
%x(java \
|
2012-12-16 08:48:22 +00:00
|
|
|
#{java32flags()} \
|
2012-10-17 22:36:48 +00:00
|
|
|
-jar lib/closure-compiler/compiler.jar \
|
2012-03-27 04:18:01 +00:00
|
|
|
--compilation_level SIMPLE_OPTIMIZATIONS \
|
|
|
|
|
--language_in ECMASCRIPT5_STRICT \
|
|
|
|
|
--js #{path_to(filename)} \
|
2012-04-05 06:10:50 +00:00
|
|
|
--js_output_file #{min_path})
|
|
|
|
|
|
2012-04-05 16:52:09 +00:00
|
|
|
rewrite_file(min_path) do |content|
|
|
|
|
|
content.sub!("'use strict';", "").
|
|
|
|
|
sub!(/\(function\([^)]*\)\{/, "\\0'use strict';")
|
2012-04-05 06:10:50 +00:00
|
|
|
end
|
2012-03-27 04:18:01 +00:00
|
|
|
end
|
|
|
|
|
|
2012-04-05 16:52:09 +00:00
|
|
|
|
2012-03-28 17:50:10 +00:00
|
|
|
def concat_file(filename, deps, footer='')
|
2012-08-28 19:38:34 +00:00
|
|
|
puts "Creating #{filename} ..."
|
2012-03-27 04:18:01 +00:00
|
|
|
File.open(path_to(filename), 'w') do |f|
|
|
|
|
|
concat = 'cat ' + deps.flatten.join(' ')
|
|
|
|
|
|
|
|
|
|
content = %x{#{concat}}.
|
|
|
|
|
gsub('"NG_VERSION_FULL"', NG_VERSION.full).
|
|
|
|
|
gsub('"NG_VERSION_MAJOR"', NG_VERSION.major).
|
|
|
|
|
gsub('"NG_VERSION_MINOR"', NG_VERSION.minor).
|
|
|
|
|
gsub('"NG_VERSION_DOT"', NG_VERSION.dot).
|
|
|
|
|
gsub('"NG_VERSION_CODENAME"', NG_VERSION.codename).
|
|
|
|
|
gsub(/^\s*['"]use strict['"];?\s*$/, ''). # remove all file-specific strict mode flags
|
2012-04-05 06:10:50 +00:00
|
|
|
sub(/\(function\([^)]*\)\s*\{/, "\\0\n'use strict';") # add single strict mode flag
|
2012-03-27 04:18:01 +00:00
|
|
|
|
|
|
|
|
f.write(content)
|
|
|
|
|
f.write(footer)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2012-04-05 16:52:09 +00:00
|
|
|
|
2012-04-29 05:45:28 +00:00
|
|
|
def concat_module(name, files, footer='')
|
|
|
|
|
concat_file('angular-' + name + '.js', ['src/module.prefix'] + files + ['src/module.suffix'], footer)
|
2012-04-10 23:50:31 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2012-04-05 16:52:09 +00:00
|
|
|
def rewrite_file(filename)
|
|
|
|
|
File.open(filename, File::RDWR) do |f|
|
|
|
|
|
content = f.read
|
|
|
|
|
|
|
|
|
|
content = yield content
|
|
|
|
|
|
|
|
|
|
raise "File rewrite failed - No content!" unless content
|
|
|
|
|
|
|
|
|
|
f.truncate 0
|
|
|
|
|
f.rewind
|
|
|
|
|
f.write content
|
|
|
|
|
end
|
|
|
|
|
end
|
2012-08-30 08:10:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def start_testacular(config, singleRun, browsers, misc_options)
|
2013-02-13 03:23:23 +00:00
|
|
|
Rake::Task[:init].invoke
|
|
|
|
|
|
2012-10-21 06:20:16 +00:00
|
|
|
sh "./node_modules/testacular/bin/testacular start " +
|
2012-08-30 08:10:28 +00:00
|
|
|
"#{config} " +
|
|
|
|
|
"#{'--single-run=true' if singleRun} " +
|
|
|
|
|
"#{'--browsers=' + browsers.gsub('+', ',') if browsers} " +
|
2012-09-20 08:12:53 +00:00
|
|
|
"#{(misc_options || '').gsub('+', ',')}"
|
2012-08-30 08:10:28 +00:00
|
|
|
end
|