From f83cb7f766949ad8aa00aa4864d99eecb7b05c3d Mon Sep 17 00:00:00 2001 From: "Davis W. Frank" Date: Thu, 9 Jun 2011 19:24:51 -0700 Subject: [PATCH] Runner.html is now generated (ensures all source & specs get tested); beginnings of refactoring of Rake tasks. --- Rakefile | 251 ++++++++++------------------- lib/jasmine.js | 5 +- spec/templates/runner.html.erb | 42 +++++ spec/templates/script_tag.html.erb | 1 + src/core/Block.js | 2 +- src/core/Runner.js | 2 +- src/core/Suite.js | 2 +- tasks/build_dist.rb | 31 ++++ tasks/build_specs.rb | 32 ++++ tasks/docs.rb | 0 tasks/helpers.rb | 52 ++++++ tasks/spec.rb | 18 +++ 12 files changed, 270 insertions(+), 168 deletions(-) create mode 100644 spec/templates/runner.html.erb create mode 100644 spec/templates/script_tag.html.erb create mode 100644 tasks/build_dist.rb create mode 100644 tasks/build_specs.rb create mode 100644 tasks/docs.rb create mode 100644 tasks/helpers.rb create mode 100644 tasks/spec.rb diff --git a/Rakefile b/Rakefile index 89a8ccb5..369c9966 100644 --- a/Rakefile +++ b/Rakefile @@ -1,170 +1,97 @@ require 'json' +require 'tilt' -def jasmine_sources - first_sources = JSON.parse(File.read('src/SourcesList.json')).collect {|f| "src/core/#{f}"} - - sources = first_sources - sources += Dir.glob('src/core/*.js').reject {|f| first_sources.include?(f)}.sort - sources +Dir["#{File.dirname(__FILE__)}/tasks/**/*.rb"].each do |file| + require file end -def jasmine_html_sources - ["src/html/TrivialReporter.js"] -end - -def jasmine_version - "#{version_hash['major']}.#{version_hash['minor']}.#{version_hash['build']}" -end - -def version_hash - require 'json' - @version ||= JSON.parse(File.new("src/core/version.json").read); -end - - -def substitute_jasmine_version(filename) - contents = File.read(filename) - contents = contents.gsub(/##JASMINE_VERSION##/, (jasmine_version)) - contents = contents.gsub(/[^\n]*REMOVE_THIS_LINE_FROM_BUILD[^\n]*/, '') - File.open(filename, 'w') { |f| f.write(contents) } +task :require_node do + raise "\nNode.js is required to develop code for Jasmine. Please visit http://nodejs.org to install.\n\n" unless node_installed? end task :default => :spec -desc "Run spec suite: Browser, Node, JSHint" -task :spec => ["jasmine:build", "spec:node", "spec:browser"] - -namespace :spec do - desc 'Run specs in Node.js' - task :node do - raise "Node is required to run all jasmine specs" unless system("node spec/node_suite.js") - end - - desc "Run specs in the default browser (MacOS only)" - task :browser do - system("open spec/runner.html") - end -end - -namespace :jasmine do - - desc 'Prepares for distribution' - task :dist => ['jasmine:build', - 'jasmine:doc', - 'jasmine:build_pages', - 'jasmine:build_example_project', - 'jasmine:fill_index_downloads'] - - desc 'Check jasmine sources for coding problems' - task :lint do - puts "Running JSHint via Node.js" - system("node jshint/run.js") || exit(1) - end - - desc "Alias to JSHint" - task :hint => :lint - - desc 'Builds lib/jasmine from source' - task :build => :lint do - puts 'Building Jasmine from source' - - sources = jasmine_sources - version = version_hash - - File.open("lib/jasmine.js", 'w') do |jasmine| - sources.each do |source_filename| - jasmine.puts(File.read(source_filename)) - end - - jasmine.puts %{ -jasmine.version_= { - "major": #{version['major'].to_json}, - "minor": #{version['minor'].to_json}, - "build": #{version['build'].to_json}, - "revision": #{Time.now.to_i} -}; -} - end - - File.open("lib/jasmine-html.js", 'w') do |jasmine_html| - jasmine_html_sources.each do |source_filename| - jasmine_html.puts(File.read(source_filename)) - end - end - - FileUtils.cp("src/html/jasmine.css", "lib/jasmine.css") - end - - downloads_file = 'pages/download.html' - task :need_pages_submodule do - unless File.exist?(downloads_file) - raise "Jasmine pages submodule isn't present. Run git submodule update --init" - end - end - - desc "Build the Github pages HTML" - task :build_pages => :need_pages_submodule do - Dir.chdir("pages") do - FileUtils.rm_r('pages_output') if File.exist?('pages_output') - Dir.chdir('pages_source') do - system("frank export ../pages_output") - end - puts "\nCopying Frank output to the root of the gh-pages branch\n\n" - system("cp -r pages_output/* .") - end - end - - desc "Build jasmine documentation" - task :doc => :need_pages_submodule do - puts 'Creating Jasmine Documentation' - require 'rubygems' - require 'jsdoc_helper' - - FileUtils.rm_r "pages/jsdoc", :force => true - - JsdocHelper::Rake::Task.new(:lambda_jsdoc) do |t| - t[:files] = jasmine_sources << jasmine_html_sources - t[:options] = "-a" - t[:out] = "pages/jsdoc" - # JsdocHelper bug: template must be relative to the JsdocHelper gem, ick - t[:template] = File.join("../".*(100), Dir::getwd, "jsdoc-template") - end - Rake::Task[:lambda_jsdoc].invoke - end - - desc "Build example project" - task :build_example_project => :need_pages_submodule do - require 'tmpdir' - - temp_dir = File.join(Dir.tmpdir, 'jasmine-standalone-project') - puts "Building Example Project in #{temp_dir}" - FileUtils.rm_r temp_dir if File.exist?(temp_dir) - Dir.mkdir(temp_dir) - - root = File.expand_path(File.dirname(__FILE__)) - FileUtils.cp_r File.join(root, 'example/.'), File.join(temp_dir) - substitute_jasmine_version(File.join(temp_dir, "SpecRunner.html")) - - lib_dir = File.join(temp_dir, "lib/jasmine-#{jasmine_version}") - FileUtils.mkdir_p(lib_dir) - { - "lib/jasmine.js" => "jasmine.js", - "lib/jasmine-html.js" => "jasmine-html.js", - "src/html/jasmine.css" => "jasmine.css", - "MIT.LICENSE" => "MIT.LICENSE" - }.each_pair do |src, dest| - FileUtils.cp(File.join(root, src), File.join(lib_dir, dest)) - end - - dist_dir = File.join(root, 'pages/downloads') - zip_file_name = File.join(dist_dir, "jasmine-standalone-#{jasmine_version}.zip") - puts "Zipping Example Project and moving to #{zip_file_name}" - FileUtils.mkdir(dist_dir) unless File.exist?(dist_dir) - if File.exist?(zip_file_name) - puts "WARNING!!! #{zip_file_name} already exists!" - FileUtils.rm(zip_file_name) - end - exec "cd #{temp_dir} && zip -r #{zip_file_name} . -x .[a-zA-Z0-9]*" - end - -end +#namespace :jasmine do +# +# desc 'Prepares for distribution' +# task :dist => ['jasmine:build', +# 'jasmine:doc', +# 'jasmine:build_pages', +# 'jasmine:build_example_project', +# 'jasmine:fill_index_downloads'] +# +# end +# +# downloads_file = 'pages/download.html' +# task :need_pages_submodule do +# unless File.exist?(downloads_file) +# raise "Jasmine pages submodule isn't present. Run git submodule update --init" +# end +# end +# +# desc "Build the Github pages HTML" +# task :build_pages => :need_pages_submodule do +# Dir.chdir("pages") do +# FileUtils.rm_r('pages_output') if File.exist?('pages_output') +# Dir.chdir('pages_source') do +# system("frank export ../pages_output") +# end +# puts "\nCopying Frank output to the root of the gh-pages branch\n\n" +# system("cp -r pages_output/* .") +# end +# end +# +# desc "Build jasmine documentation" +# task :doc => :need_pages_submodule do +# puts 'Creating Jasmine Documentation' +# require 'rubygems' +# require 'jsdoc_helper' +# +# FileUtils.rm_r "pages/jsdoc", :force => true +# +# JsdocHelper::Rake::Task.new(:lambda_jsdoc) do |t| +# t[:files] = jasmine_sources << jasmine_html_sources +# t[:options] = "-a" +# t[:out] = "pages/jsdoc" +# # JsdocHelper bug: template must be relative to the JsdocHelper gem, ick +# t[:template] = File.join("../".*(100), Dir::getwd, "jsdoc-template") +# end +# Rake::Task[:lambda_jsdoc].invoke +# end +# +# desc "Build example project" +# task :build_example_project => :need_pages_submodule do +# require 'tmpdir' +# +# temp_dir = File.join(Dir.tmpdir, 'jasmine-standalone-project') +# puts "Building Example Project in #{temp_dir}" +# FileUtils.rm_r temp_dir if File.exist?(temp_dir) +# Dir.mkdir(temp_dir) +# +# root = File.expand_path(File.dirname(__FILE__)) +# FileUtils.cp_r File.join(root, 'example/.'), File.join(temp_dir) +# substitute_jasmine_version(File.join(temp_dir, "SpecRunner.html")) +# +# lib_dir = File.join(temp_dir, "lib/jasmine-#{jasmine_version}") +# FileUtils.mkdir_p(lib_dir) +# { +# "lib/jasmine.js" => "jasmine.js", +# "lib/jasmine-html.js" => "jasmine-html.js", +# "src/html/jasmine.css" => "jasmine.css", +# "MIT.LICENSE" => "MIT.LICENSE" +# }.each_pair do |src, dest| +# FileUtils.cp(File.join(root, src), File.join(lib_dir, dest)) +# end +# +# dist_dir = File.join(root, 'pages/downloads') +# zip_file_name = File.join(dist_dir, "jasmine-standalone-#{jasmine_version}.zip") +# puts "Zipping Example Project and moving to #{zip_file_name}" +# FileUtils.mkdir(dist_dir) unless File.exist?(dist_dir) +# if File.exist?(zip_file_name) +# puts "WARNING!!! #{zip_file_name} already exists!" +# FileUtils.rm(zip_file_name) +# end +# exec "cd #{temp_dir} && zip -r #{zip_file_name} . -x .[a-zA-Z0-9]*" +# end +# +#end diff --git a/lib/jasmine.js b/lib/jasmine.js index 1710a6d6..f7355b1c 100644 --- a/lib/jasmine.js +++ b/lib/jasmine.js @@ -2463,10 +2463,9 @@ jasmine.getGlobal().clearInterval = function(timeoutKey) { } }; - jasmine.version_= { "major": 1, "minor": 1, "build": 0, - "revision": 1307546962 -}; + "revision": 1307672575 +} diff --git a/spec/templates/runner.html.erb b/spec/templates/runner.html.erb new file mode 100644 index 00000000..13a5bfba --- /dev/null +++ b/spec/templates/runner.html.erb @@ -0,0 +1,42 @@ + + + + Jasmine Test Runner + + + + + + <%= source_tags %> + + <%= spec_file_tags %> + + + + + + + + + diff --git a/spec/templates/script_tag.html.erb b/spec/templates/script_tag.html.erb new file mode 100644 index 00000000..09f7030d --- /dev/null +++ b/spec/templates/script_tag.html.erb @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/core/Block.js b/src/core/Block.js index 75964a18..b24221e1 100644 --- a/src/core/Block.js +++ b/src/core/Block.js @@ -19,4 +19,4 @@ jasmine.Block.prototype.execute = function(onComplete) { this.spec.fail(e); } onComplete(); -}; \ No newline at end of file +}; diff --git a/src/core/Runner.js b/src/core/Runner.js index 05e7fd99..34d1801e 100644 --- a/src/core/Runner.js +++ b/src/core/Runner.js @@ -74,4 +74,4 @@ jasmine.Runner.prototype.topLevelSuites = function() { jasmine.Runner.prototype.results = function() { return this.queue.results(); -}; \ No newline at end of file +}; diff --git a/src/core/Suite.js b/src/core/Suite.js index 0b573523..78f19ab1 100644 --- a/src/core/Suite.js +++ b/src/core/Suite.js @@ -79,4 +79,4 @@ jasmine.Suite.prototype.execute = function(onComplete) { this.queue.start(function () { self.finish(onComplete); }); -}; \ No newline at end of file +}; diff --git a/tasks/build_dist.rb b/tasks/build_dist.rb new file mode 100644 index 00000000..6a8c4b60 --- /dev/null +++ b/tasks/build_dist.rb @@ -0,0 +1,31 @@ +desc "Build core jasmine.js" +task :build_jasmine_js => :lint do + puts 'Building Jasmine from source' + + File.open("lib/jasmine.js", 'w') do |jasmine_js| + core_sources.each do |source_filename| + file = File.read(source_filename) +# file += "\n" unless file.match(/\n$/) + file.chomp + jasmine_js << file + end + + jasmine_js << version_source + end + + File.open("lib/jasmine-html.js", 'w') do |jasmine_html| + html_sources.each do |source_filename| + jasmine_html.puts(File.read(source_filename)) + end + end + + FileUtils.cp("src/html/jasmine.css", "lib/jasmine.css") +end + +desc 'Check jasmine sources for coding problems' +task :lint do + puts "Running JSHint via Node.js" + system("node jshint/run.js") || exit(1) +end + +task :hint => :lint diff --git a/tasks/build_specs.rb b/tasks/build_specs.rb new file mode 100644 index 00000000..2c76a695 --- /dev/null +++ b/tasks/build_specs.rb @@ -0,0 +1,32 @@ +require 'ostruct' + +desc "build the browser spec runner.html based on current tree" +task :build_runner_html do + template = Tilt.new('spec/templates/runner.html.erb') + + File.open('spec/runner.html', 'w+') do |f| + scope = OpenStruct.new(:source_tags => other_source_file_tags, + :spec_file_tags => spec_file_tags) + f << template.render(scope) + end +end + +def other_source_file_tags + other_files = html_sources + console_sources + script_tags_for other_files.collect { |f| "../#{f}" } +end + +def spec_file_tags + spec_files = core_specfiles + html_specfiles + console_specfiles + script_tags_for spec_files.collect { |f| "../#{f}" } +end + +def script_tags_for(files) + script_tag = Tilt::new('spec/templates/script_tag.html.erb') + + files.inject([]) do |tags, f| + scope = OpenStruct.new :file => f + tags << script_tag.render(scope) + tags + end.join("\n ") +end \ No newline at end of file diff --git a/tasks/docs.rb b/tasks/docs.rb new file mode 100644 index 00000000..e69de29b diff --git a/tasks/helpers.rb b/tasks/helpers.rb new file mode 100644 index 00000000..84be2c5d --- /dev/null +++ b/tasks/helpers.rb @@ -0,0 +1,52 @@ +require 'json' + +def core_sources + first_sources = JSON.parse(File.read('src/SourcesList.json')).collect { |f| "src/core/#{f}" } + + remaining_sources = Dir.glob('src/core/*.js').reject { |f| first_sources.include?(f) }.sort + + first_sources + remaining_sources +end + +def html_sources + Dir.glob('src/html/*.js') +end + +def console_sources + Dir.glob('src/console/*.js') +end + +def core_specfiles + Dir.glob('spec/core/*.js') +end + +def html_specfiles + Dir.glob('spec/html/*.js') +end + +def console_specfiles + Dir.glob('spec/console/*.js') +end + +def version_string + "#{version_hash['major']}.#{version_hash['minor']}.#{version_hash['build']}" +end + +def version_source +<<-JS +jasmine.version_= { + "major": #{version_hash['major'].to_json}, + "minor": #{version_hash['minor'].to_json}, + "build": #{version_hash['build'].to_json}, + "revision": #{Time.now.to_i} +} +JS +end + +def version_hash + @version ||= JSON.parse(File.new("src/core/version.json").read); +end + +def node_installed? + `which node` =~ /node/ +end diff --git a/tasks/spec.rb b/tasks/spec.rb new file mode 100644 index 00000000..4e411cb7 --- /dev/null +++ b/tasks/spec.rb @@ -0,0 +1,18 @@ +desc "Run spec suite: Browser, Node, JSHint" +task :spec => ["build_jasmine_js", "spec:node", "spec:browser"] + +desc 'Run specs in Node.js' +task "spec:node" => :require_node do + puts "Running all appropriate specs via Node.js" + system("node spec/node_suite.js") +end + +desc "Run specs in the default browser (MacOS only)" +task "spec:browser" => :build_runner_html do + puts "Running all appropriate specs via the default web browser" + system("open spec/runner.html") +end + +#def core_spec_count +# +#end \ No newline at end of file