From 31016b84618af0c5b44d1af76ca25d18f42b6f6d Mon Sep 17 00:00:00 2001 From: Paul Lambert Date: Mon, 14 Feb 2011 19:50:52 -0800 Subject: [PATCH 1/5] adding sc-jstd executable stub for bundler discovery --- bin/sc-jstd | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100755 bin/sc-jstd diff --git a/bin/sc-jstd b/bin/sc-jstd new file mode 100755 index 00000000..3713e141 --- /dev/null +++ b/bin/sc-jstd @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +# =========================================================================== +# Project: Abbot - SproutCore Build Tools +# Copyright: ©2010 Apple Inc. +# portions copyright @2006-2011 Strobe Inc. +# and contributors +# =========================================================================== + +if caller.empty? + puts "FATAL: You need to invoke sc-jstd from an installed gem or through bundler. For more information, please visit http://github.com/sproutcore/abbot/wiki/Using-Abbot-1.4-From-Source" + exit +end + +require "sproutcore" + +SC::Tools.invoke 'jstd' + +# EOF From 56c648144c3c06d0d3216855c004e9ad1329560f Mon Sep 17 00:00:00 2001 From: Paul Lambert Date: Tue, 15 Feb 2011 15:15:31 -0800 Subject: [PATCH 2/5] Adding conf file generator and server for JsTestDriver unit test integration --- lib/sproutcore/tools/jstd.rb | 91 ++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 lib/sproutcore/tools/jstd.rb diff --git a/lib/sproutcore/tools/jstd.rb b/lib/sproutcore/tools/jstd.rb new file mode 100644 index 00000000..d8cb4fa0 --- /dev/null +++ b/lib/sproutcore/tools/jstd.rb @@ -0,0 +1,91 @@ +# =========================================================================== +# Copyright: ©2011 Paul Lambert & Sproutcore Contributors +# For Abbot, and licensed under same terms as Sproutcore itself +# =========================================================================== + +require 'nokogiri' +require 'open-uri' +require 'thread' +require 'yaml' +require 'digest/md5' + +module SC + class Tools + + desc "jstd TARGET [OPTIONS]", "Generates configuration file for JsTestDriver (http://code.google.com/p/js-test-driver/wiki/ConfigurationFile)" + method_options :daemonize => false, + :pid => :string, + :port => :string, + :jstdport => :string, + :jstdhost => :string, + :jstdconfpath => :string, + :app => :string, + :host => :string, + :irb => false, + :filesystem => true + + def jstd(*targets) + # set defaults + port = options[:port] = options[:port] || "4225" + jstdport = options[:jstdport] || "4224" + jstdhost = options[:jstdhost] || "http://localhost" + jstdconfpath = options[:jstdconfpath] || "jsTestDriver.conf" + host = options[:host] || "http://localhost" + + # find app target + target = requires_target!(*targets) + fatal! "Target must be an app" unless target[:target_type] == :app + target_name = target[:target_name].to_s + + project = requires_project! + # apparently necessary as getting target results in connections being refused + # unless project is subsequently reloaded + project.reload! + + # wrap logic to rebuild configuration file in a Proc/closure + # allowing for it to be rebuilt 'on the fly', which makes for + # a much nicer testing loop. See rack/builder.rb for monitoring and + # invokation of this callback + project.monitor_proc = Proc.new do + url = "#{host}:#{port}#{target_name}/en/current/tests.html" + doc = Nokogiri::HTML(open(url)) + dir = "tmp/jstd" + Dir.mkdir(dir) if not Dir.exists?(dir) + + loadPaths = [] + doc.css('script').each do |link| + js = link['src'] + if js + loadPaths << "#{host}:#{port}#{js}" + elsif (link.content and link.content.length > 0) + js = link.content + + filename = "#{dir}/#{Digest::MD5.hexdigest(js)}.js" + File.open(filename, "w") do |f| + f.write(js) + end + + loadPaths << filename + end + end + project.nomonitor_pattern = Regexp.new(Regexp.escape(jstdconfpath)) + + # write out to yaml conf + conf = {"server"=>"#{jstdhost}:#{jstdport}", "load"=>loadPaths} + File.open(jstdconfpath, "w") do |f| + f.write(YAML::dump(conf)) + end + + SC.logger.info "Wrote to #{jstdconfpath}" + end + + Thread.new do + sleep(4) # give server a chance to start up + project.monitor_proc.call # call once to make sure everything's fresh and valid + end + + server() + end + + end +end From 51d474094957306da8e47ee8d9941011dbae9209 Mon Sep 17 00:00:00 2001 From: Paul Lambert Date: Tue, 15 Feb 2011 15:16:19 -0800 Subject: [PATCH 3/5] Adding conf file generator and server for JsTestDriver unit test integration --- lib/sproutcore/models/project.rb | 6 ++++++ lib/sproutcore/rack/builder.rb | 9 +++++++-- lib/sproutcore/tools.rb | 1 + sproutcore.gemspec | 1 + 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/sproutcore/models/project.rb b/lib/sproutcore/models/project.rb index 3df9d85c..7fe086cc 100644 --- a/lib/sproutcore/models/project.rb +++ b/lib/sproutcore/models/project.rb @@ -41,6 +41,12 @@ class Project # Parent project this project shoud inherit build rules and targets from attr_reader :parent_project + + # Proc that will be called when changes are detected to a monitored project + attr_accessor :monitor_proc + + # regex so that certain files don't trigger monitor update + attr_accessor :nomonitor_pattern def inspect "SC::Project(#{File.basename(project_root || '')})" diff --git a/lib/sproutcore/rack/builder.rb b/lib/sproutcore/rack/builder.rb index 2215bf05..866d0777 100644 --- a/lib/sproutcore/rack/builder.rb +++ b/lib/sproutcore/rack/builder.rb @@ -214,6 +214,9 @@ def monitor_project! @project_mtime = files.map { |x| File.mtime(x).to_i }.max Thread.new do + # TODO instead of polling every second, should investigate using a FS event + # monitor like fssm (https://github.com/ttilley/fssm). Would be both quicker + # and less resource intensive than polling while @should_monitor # only need to start scanning again 2 seconds after the last @@ -224,8 +227,7 @@ def monitor_project! # follow 1-level of symlinks files += Dir.glob(@project_root / '**' / '*' / '**' / '*') tmp_path = /^#{Regexp.escape(@project_root / 'tmp')}/ - files.reject! { |f| f =~ tmp_path } - files.reject! { |f| File.directory?(f) } + files.reject! { |f| (f =~ tmp_path || File.directory?(f) || f =~ @project.nomonitor_pattern) } cur_file_count = files.size cur_mtime = files.map { |x| File.mtime(x).to_i }.max @@ -235,6 +237,9 @@ def monitor_project! @project_did_change = true @project_file_count = cur_file_count @project_mtime = cur_mtime + # place for some extra project maintainen + extra_action = @project.monitor_proc + extra_action.call if (extra_action && extra_action.respond_to?(:call)) end end diff --git a/lib/sproutcore/tools.rb b/lib/sproutcore/tools.rb index f8cc5016..c6237cef 100644 --- a/lib/sproutcore/tools.rb +++ b/lib/sproutcore/tools.rb @@ -404,6 +404,7 @@ def self.start(args = ARGV) require "sproutcore/tools/docs" require "sproutcore/tools/gen" require "sproutcore/tools/init" +require "sproutcore/tools/jstd" require "sproutcore/tools/manifest" require "sproutcore/tools/server" diff --git a/sproutcore.gemspec b/sproutcore.gemspec index c42e89ab..546a6c41 100644 --- a/sproutcore.gemspec +++ b/sproutcore.gemspec @@ -19,6 +19,7 @@ Gem::Specification.new do |s| s.add_dependency 'erubis', "~> 2.6.6" s.add_dependency 'thor', '~> 0.14.3' s.add_dependency 'haml', '~> 3.0.24' + s.add_dependency 'nokogiri', '~> 1.4.4' s.add_dependency 'compass', '~> 0.10.5' s.add_dependency 'chunky_png', '~> 0.12.0' From 4313773a6d0b3041320a72413fb49efa528e1939 Mon Sep 17 00:00:00 2001 From: Wesley Workman Date: Sun, 17 Jul 2011 00:05:12 -0400 Subject: [PATCH 4/5] Added support for SC.Modules with js-test-driver. --- lib/sproutcore.rb | 6 ++++++ lib/sproutcore/builders/module.rb | 9 +++++---- lib/sproutcore/tools/jstd.rb | 1 + sproutcore.gemspec | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/sproutcore.rb b/lib/sproutcore.rb index 8577b8d4..ae990f40 100644 --- a/lib/sproutcore.rb +++ b/lib/sproutcore.rb @@ -98,6 +98,12 @@ def self.builtin_project @builtin_project ||= SC::Project.new(PATH) end + # This is used by sc-jstd. When using sc-jstd you will have two servers running, sc-server and + # the jstd server. Because the browser will be connecting to the jstd server directly these + # url paths need to be absolute. Not the most ideal approach, but this avoids alot of refactoring. + def self.module_url_prefix; return @module_url_prefix if @module_url_prefix; return "" end + def self.module_url_prefix=(module_url_prefix); @module_url_prefix = module_url_prefix; end + # Returns the current project, if defined. This is normally only set # when you start sc-server in interactive mode. def self.project; @project; end diff --git a/lib/sproutcore/builders/module.rb b/lib/sproutcore/builders/module.rb index 09aeda21..2ba9ca49 100644 --- a/lib/sproutcore/builders/module.rb +++ b/lib/sproutcore/builders/module.rb @@ -40,6 +40,7 @@ def build(dst_path) EOT output = "" + module_url_prefix = SC.module_url_prefix entry.targets.each do |t| next unless t[:target_type] == :module @@ -48,19 +49,19 @@ def build(dst_path) script_entry = manifest.find_entry('javascript.js') next if not script_entry - script_url = script_entry.cacheable_url + script_url = module_url_prefix + script_entry.cacheable_url string_entry = manifest.find_entry('javascript-strings.js') next if not string_entry - string_url = string_entry.cacheable_url + string_url = module_url_prefix + string_entry.cacheable_url module_info = t.module_info({ :variation => entry[:variation] }) output << eruby.evaluate({ :target_name => t[:target_name].to_s.sub(/^\//,''), :dependencies => module_info[:requires].map{ |t| "'#{t[:target_name].to_s.sub(/^\//,'')}'" }, - :styles => module_info[:css_urls].map{ |url| "'#{url}'" }, - :styles2x => module_info[:css_2x_urls].map {|url| "'#{url}'"}, + :styles => module_info[:css_urls].map{ |url| "'#{module_url_prefix}#{url}'" }, + :styles2x => module_info[:css_2x_urls].map {|url| "'#{module_url_prefix}#{url}'"}, :script => script_url, :string => string_url, :prefetched => t[:prefetched_module] diff --git a/lib/sproutcore/tools/jstd.rb b/lib/sproutcore/tools/jstd.rb index d8cb4fa0..8ef413ef 100644 --- a/lib/sproutcore/tools/jstd.rb +++ b/lib/sproutcore/tools/jstd.rb @@ -31,6 +31,7 @@ def jstd(*targets) jstdhost = options[:jstdhost] || "http://localhost" jstdconfpath = options[:jstdconfpath] || "jsTestDriver.conf" host = options[:host] || "http://localhost" + SC.module_url_prefix = "#{host}:#{port}" # find app target target = requires_target!(*targets) diff --git a/sproutcore.gemspec b/sproutcore.gemspec index c0e3e7aa..a220bcda 100644 --- a/sproutcore.gemspec +++ b/sproutcore.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |s| s.add_dependency 'thor', '~> 0.14.3' s.add_dependency 'haml', '~> 3.1.1' s.add_dependency 'compass', '~> 0.11.1' - s.add_dependency 'nokogiri', '~> 1.4.4' + s.add_dependency 'nokogiri', '~> 1.5.0' s.add_dependency 'em-http-request', '~> 1.0.0.beta' From 52689a0da3ec7ce1de0d0dcea17ae72d2405b020 Mon Sep 17 00:00:00 2001 From: Wesley Workman Date: Sun, 17 Jul 2011 00:49:26 -0400 Subject: [PATCH 5/5] Removed gemspec dependency on nokogiri as requested by tomdale here https://github.com/sproutcore/abbot/pull/31 . --- bin/sc-jstd | 7 +++++++ lib/sproutcore/tools/jstd.rb | 3 ++- sproutcore.gemspec | 1 - 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/sc-jstd b/bin/sc-jstd index 3713e141..f18676ce 100755 --- a/bin/sc-jstd +++ b/bin/sc-jstd @@ -13,6 +13,13 @@ end require "sproutcore" +begin + gem 'nokogiri' +rescue LoadError + puts "FATAL: Missing nokogiri. Please install nokogiri (~1.5.0) to use sc-jstd." + exit +end + SC::Tools.invoke 'jstd' # EOF diff --git a/lib/sproutcore/tools/jstd.rb b/lib/sproutcore/tools/jstd.rb index 8ef413ef..8e2ad347 100644 --- a/lib/sproutcore/tools/jstd.rb +++ b/lib/sproutcore/tools/jstd.rb @@ -3,7 +3,6 @@ # For Abbot, and licensed under same terms as Sproutcore itself # =========================================================================== -require 'nokogiri' require 'open-uri' require 'thread' require 'yaml' @@ -25,6 +24,8 @@ class Tools :filesystem => true def jstd(*targets) + require 'nokogiri' + # set defaults port = options[:port] = options[:port] || "4225" jstdport = options[:jstdport] || "4224" diff --git a/sproutcore.gemspec b/sproutcore.gemspec index a220bcda..206628c9 100644 --- a/sproutcore.gemspec +++ b/sproutcore.gemspec @@ -23,7 +23,6 @@ Gem::Specification.new do |s| s.add_dependency 'thor', '~> 0.14.3' s.add_dependency 'haml', '~> 3.1.1' s.add_dependency 'compass', '~> 0.11.1' - s.add_dependency 'nokogiri', '~> 1.5.0' s.add_dependency 'em-http-request', '~> 1.0.0.beta'