newjs 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +68 -0
  4. data/README.txt +9 -0
  5. data/Rakefile +4 -0
  6. data/app_generators/newjs/USAGE +9 -0
  7. data/app_generators/newjs/newjs_generator.rb +113 -0
  8. data/app_generators/newjs/templates/History.txt.erb +4 -0
  9. data/app_generators/newjs/templates/License.txt.erb +20 -0
  10. data/app_generators/newjs/templates/README.txt +1 -0
  11. data/app_generators/newjs/templates/Rakefile.erb +82 -0
  12. data/app_generators/newjs/templates/config/javascript_test_autotest.yml.sample +15 -0
  13. data/app_generators/newjs/templates/lib/jstest.rb +382 -0
  14. data/app_generators/newjs/templates/lib/protodoc.rb +36 -0
  15. data/app_generators/newjs/templates/script/js_autotest +1 -0
  16. data/app_generators/newjs/templates/script/rstakeout +98 -0
  17. data/app_generators/newjs/templates/src/HEADER.erb +8 -0
  18. data/app_generators/newjs/templates/src/library.js.erb +7 -0
  19. data/app_generators/newjs/templates/tasks/environment.rake +7 -0
  20. data/app_generators/newjs/templates/tasks/javascript_test_autotest_tasks.rake +44 -0
  21. data/app_generators/newjs/templates/test/assets/prototype.js +4236 -0
  22. data/app_generators/newjs/templates/test/assets/unittest.css +50 -0
  23. data/app_generators/newjs/templates/test/assets/unittest.js +556 -0
  24. data/bin/newjs +17 -0
  25. data/config/hoe.rb +75 -0
  26. data/config/requirements.rb +17 -0
  27. data/javascript_test_generators/javascript_test/USAGE +2 -0
  28. data/javascript_test_generators/javascript_test/javascript_test_generator.rb +54 -0
  29. data/javascript_test_generators/javascript_test/templates/test/test.html.erb +58 -0
  30. data/lib/newjs.rb +7 -0
  31. data/lib/newjs/autotest.rb +3 -0
  32. data/lib/newjs/autotest/javascript_test_autotest.rb +22 -0
  33. data/lib/newjs/autotest/javascript_test_autotest/config.rb +20 -0
  34. data/lib/newjs/autotest/javascript_test_ext.rb +29 -0
  35. data/lib/newjs/jstest.rb +382 -0
  36. data/lib/newjs/version.rb +9 -0
  37. data/log/debug.log +0 -0
  38. data/newjs_generators/install_website/USAGE +5 -0
  39. data/newjs_generators/install_website/install_website_generator.rb +79 -0
  40. data/newjs_generators/install_website/templates/script/txt2html +74 -0
  41. data/newjs_generators/install_website/templates/script/win_script.cmd +1 -0
  42. data/newjs_generators/install_website/templates/tasks/website.rake +17 -0
  43. data/newjs_generators/install_website/templates/website/index.html +11 -0
  44. data/newjs_generators/install_website/templates/website/index.txt +37 -0
  45. data/newjs_theme_generators/plain_theme/USAGE +0 -0
  46. data/newjs_theme_generators/plain_theme/plain_theme_generator.rb +54 -0
  47. data/newjs_theme_generators/plain_theme/templates/website/javascripts/rounded_corners_lite.inc.js +285 -0
  48. data/newjs_theme_generators/plain_theme/templates/website/stylesheets/screen.css +138 -0
  49. data/newjs_theme_generators/plain_theme/templates/website/template.html.erb +48 -0
  50. data/script/destroy +14 -0
  51. data/script/generate +14 -0
  52. data/script/txt2html +74 -0
  53. data/setup.rb +1585 -0
  54. data/tasks/deployment.rake +34 -0
  55. data/tasks/environment.rake +7 -0
  56. data/tasks/website.rake +17 -0
  57. data/test/test_generator_helper.rb +20 -0
  58. data/test/test_helper.rb +4 -0
  59. data/test/test_install_website_generator.rb +39 -0
  60. data/test/test_javascript_test_generator.rb +43 -0
  61. data/test/test_newjs_generator.rb +63 -0
  62. data/test/test_plain_theme_generator.rb +37 -0
  63. data/website/images/example-unittest-log.jpg +0 -0
  64. data/website/index.html +271 -0
  65. data/website/index.txt +181 -0
  66. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  67. data/website/stylesheets/screen.css +138 -0
  68. data/website/template.html.erb +48 -0
  69. metadata +168 -0
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2008-02-14
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Dr Nic Williams
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,68 @@
1
+ History.txt
2
+ License.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ app_generators/newjs/USAGE
7
+ app_generators/newjs/newjs_generator.rb
8
+ app_generators/newjs/templates/History.txt.erb
9
+ app_generators/newjs/templates/License.txt.erb
10
+ app_generators/newjs/templates/README.txt
11
+ app_generators/newjs/templates/Rakefile.erb
12
+ app_generators/newjs/templates/config/javascript_test_autotest.yml.sample
13
+ app_generators/newjs/templates/lib/jstest.rb
14
+ app_generators/newjs/templates/lib/protodoc.rb
15
+ app_generators/newjs/templates/script/js_autotest
16
+ app_generators/newjs/templates/script/rstakeout
17
+ app_generators/newjs/templates/src/HEADER.erb
18
+ app_generators/newjs/templates/src/library.js.erb
19
+ app_generators/newjs/templates/tasks/environment.rake
20
+ app_generators/newjs/templates/tasks/javascript_test_autotest_tasks.rake
21
+ app_generators/newjs/templates/test/assets/prototype.js
22
+ app_generators/newjs/templates/test/assets/unittest.css
23
+ app_generators/newjs/templates/test/assets/unittest.js
24
+ bin/newjs
25
+ config/hoe.rb
26
+ config/requirements.rb
27
+ javascript_test_generators/javascript_test/USAGE
28
+ javascript_test_generators/javascript_test/javascript_test_generator.rb
29
+ javascript_test_generators/javascript_test/templates/test/test.html.erb
30
+ lib/newjs.rb
31
+ lib/newjs/autotest.rb
32
+ lib/newjs/autotest/javascript_test_autotest.rb
33
+ lib/newjs/autotest/javascript_test_autotest/config.rb
34
+ lib/newjs/autotest/javascript_test_ext.rb
35
+ lib/newjs/jstest.rb
36
+ lib/newjs/version.rb
37
+ log/debug.log
38
+ newjs_generators/install_website/USAGE
39
+ newjs_generators/install_website/install_website_generator.rb
40
+ newjs_generators/install_website/templates/script/txt2html
41
+ newjs_generators/install_website/templates/script/win_script.cmd
42
+ newjs_generators/install_website/templates/tasks/website.rake
43
+ newjs_generators/install_website/templates/website/index.html
44
+ newjs_generators/install_website/templates/website/index.txt
45
+ newjs_theme_generators/plain_theme/USAGE
46
+ newjs_theme_generators/plain_theme/plain_theme_generator.rb
47
+ newjs_theme_generators/plain_theme/templates/website/javascripts/rounded_corners_lite.inc.js
48
+ newjs_theme_generators/plain_theme/templates/website/stylesheets/screen.css
49
+ newjs_theme_generators/plain_theme/templates/website/template.html.erb
50
+ script/destroy
51
+ script/generate
52
+ script/txt2html
53
+ setup.rb
54
+ tasks/deployment.rake
55
+ tasks/environment.rake
56
+ tasks/website.rake
57
+ test/test_generator_helper.rb
58
+ test/test_helper.rb
59
+ test/test_install_website_generator.rb
60
+ test/test_javascript_test_generator.rb
61
+ test/test_newjs_generator.rb
62
+ test/test_plain_theme_generator.rb
63
+ website/images/example-unittest-log.jpg
64
+ website/index.html
65
+ website/index.txt
66
+ website/javascripts/rounded_corners_lite.inc.js
67
+ website/stylesheets/screen.css
68
+ website/template.html.erb
data/README.txt ADDED
@@ -0,0 +1,9 @@
1
+ Description:
2
+ The +newjs+ command creates a new JavaScript project/application
3
+ with a default directory structure and configuration at the path you specify.
4
+
5
+ Example:
6
+ +newjs path/to/my-app-name+
7
+
8
+ This generates a skeletal JavaScript project/application
9
+ installation in path/to/my-app-name
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
@@ -0,0 +1,9 @@
1
+ Description:
2
+ The 'newjs' command creates a new JavaScript project/application
3
+ with a default directory structure and configuration at the path you specify.
4
+
5
+ Example:
6
+ newjs path/to/my-app-name
7
+
8
+ This generates a skeletal JavaScript project/application
9
+ installation in path/to/my-app-name
@@ -0,0 +1,113 @@
1
+ class NewjsGenerator < RubiGen::Base
2
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
3
+ Config::CONFIG['ruby_install_name'])
4
+
5
+ default_options :shebang => DEFAULT_SHEBANG,
6
+ :author => nil,
7
+ :email => nil,
8
+ :version => '0.0.1'
9
+
10
+
11
+ attr_reader :name, :module_name
12
+ attr_reader :version, :version_str, :author, :email
13
+ attr_reader :title, :url
14
+
15
+
16
+ def initialize(runtime_args, runtime_options = {})
17
+ super
18
+ usage if args.empty?
19
+ @destination_root = File.expand_path(args.shift)
20
+ @name = base_name
21
+ @module_name = name.camelize
22
+ extract_options
23
+ @title ||= @name.titleize
24
+ @url ||= "http://NOTE-ENTER-URL.com"
25
+ end
26
+
27
+ def manifest
28
+ script_options = { :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang] }
29
+ windows = (RUBY_PLATFORM =~ /dos|win32|cygwin/i) || (RUBY_PLATFORM =~ /(:?mswin|mingw)/)
30
+
31
+ record do |m|
32
+ # Ensure appropriate folder(s) exists
33
+ m.directory ''
34
+ BASEDIRS.each { |path| m.directory path }
35
+
36
+ # Create stubs
37
+ # m.template "template.rb", "some_file_after_erb.rb"
38
+ # m.file "file", "some_file_copied"
39
+ m.file_copy_each %w[unittest.css unittest.js prototype.js], "test/assets"
40
+ m.file_copy_each %w[javascript_test_autotest_tasks.rake environment.rake], "tasks"
41
+ m.file_copy_each %w[javascript_test_autotest.yml.sample], "config"
42
+ m.file_copy_each %w[protodoc.rb jstest.rb], "lib"
43
+ m.file_copy_each %w[README.txt]
44
+ m.template_copy_each %w[Rakefile.erb History.txt.erb License.txt.erb]
45
+ m.template_copy_each %w[HEADER.erb], "src"
46
+ m.template "src/library.js.erb", "src/#{name}.js"
47
+
48
+ %w[rstakeout js_autotest].each do |file|
49
+ m.template "script/#{file}", "script/#{file}", script_options
50
+ m.template "script/win_script.cmd", "script/#{file}.cmd",
51
+ :assigns => { :filename => file } if windows
52
+ end
53
+
54
+ m.dependency "install_rubigen_scripts",
55
+ [destination_root, 'javascript', 'javascript_test', 'newjs', 'newjs_theme'],
56
+ :shebang => options[:shebang], :collision => :force
57
+ end
58
+ end
59
+
60
+ protected
61
+ def banner
62
+ <<-EOS
63
+ Creates a JavaScript project.
64
+
65
+ USAGE: #{spec.name} name"
66
+ EOS
67
+ end
68
+
69
+ def add_options!(opts)
70
+ opts.separator ''
71
+ opts.separator 'Options:'
72
+ # For each option below, place the default
73
+ # at the top of the file next to "default_options"
74
+ opts.on("-a", "--author=\"Your Name\"", String,
75
+ "Default: none") { |x| options[:author] = x }
76
+ opts.on("-e", "--email=\"your@email.com\"", String,
77
+ "Your email to be inserted into generated files.",
78
+ "Default: ~/.rubyforge/user-config.yml[email]") { |x| options[:email] = x }
79
+ opts.on("-t", "--title=\"Project Title\"", String,
80
+ "Human-readable/marketing name for project.",
81
+ "Default: Project Name") { |x| options[:title] = x }
82
+ opts.on("-u", "--url=\"http://url-to-project.com\"", String,
83
+ "Default: http://NOTE-ENTER-URL.com") { |x| options[:url] = x }
84
+ opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
85
+ opts.on("-V", "--set-version=X.Y.Z", String,
86
+ "Initial version of the project you are creating.",
87
+ "Default: 0.0.1") { |x| options[:version] = x }
88
+ end
89
+
90
+ def extract_options
91
+ @version = options[:version].to_s.split(/\./)
92
+ @version_str = @version.join('.')
93
+ @author = options[:author]
94
+ @email = options[:email]
95
+ unless @author && @email
96
+ require 'newgem/rubyforge'
97
+ rubyforge_config = Newgem::Rubyforge.new
98
+ @author ||= rubyforge_config.full_name
99
+ @email ||= rubyforge_config.email
100
+ end
101
+ end
102
+
103
+ # Installation skeleton. Intermediate directories are automatically
104
+ # created so don't sweat their absence here.
105
+ BASEDIRS = %w(
106
+ config
107
+ lib
108
+ src
109
+ script
110
+ tasks
111
+ test/assets
112
+ )
113
+ end
@@ -0,0 +1,4 @@
1
+ == <%= version_str %> <%= Date.today %>
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
@@ -0,0 +1,20 @@
1
+ Copyright (c) <%= Time.now.year %> <%= author %>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
1
+ README
@@ -0,0 +1,82 @@
1
+ require 'rubygems'
2
+ begin
3
+ require 'rake'
4
+ rescue LoadError
5
+ puts 'This script should only be accessed via the "rake" command.'
6
+ puts 'Installation: gem install rake -y'
7
+ exit
8
+ end
9
+ require 'rake'
10
+ require 'rake/clean'
11
+ require 'rake/packagetask'
12
+
13
+ $:.unshift File.dirname(__FILE__) + "/lib"
14
+
15
+ APP_ROOT = File.expand_path(File.dirname(__FILE__))
16
+ APP_SRC_DIR = File.join(APP_ROOT, 'src')
17
+ APP_DIST_DIR = File.join(APP_ROOT, 'dist')
18
+ APP_PKG_DIR = File.join(APP_ROOT, 'pkg')
19
+ APP_VERSION = '<%= version_str %>'
20
+
21
+ task :default => [:dist, :package, :clean_package_source]
22
+
23
+ desc "Builds the distribution"
24
+ task :dist do
25
+ $:.unshift File.join(APP_ROOT, 'lib')
26
+ require 'protodoc'
27
+ require 'fileutils'
28
+ FileUtils.mkdir_p APP_DIST_DIR
29
+
30
+ Dir.chdir(APP_SRC_DIR) do
31
+ File.open(File.join(APP_DIST_DIR, '<%= name %>.js'), 'w+') do |dist|
32
+ dist << Protodoc::Preprocessor.new('<%= name %>.js')
33
+ end
34
+ end
35
+ end
36
+
37
+ Rake::PackageTask.new('<%= name %>', APP_VERSION) do |package|
38
+ package.need_tar_gz = true
39
+ package.package_dir = APP_PKG_DIR
40
+ package.package_files.include(
41
+ '[A-Z]*',
42
+ 'config/*.sample',
43
+ 'dist/<%= name %>.js',
44
+ 'lib/**',
45
+ 'src/**',
46
+ 'script/**',
47
+ 'tasks/**',
48
+ 'test/**',
49
+ 'website/**'
50
+ )
51
+ end
52
+
53
+ desc "Builds the distribution, runs the JavaScript unit tests and collects their results."
54
+ task :test => [:dist, :test_units]
55
+
56
+ require 'jstest'
57
+ desc "Runs all the JavaScript unit tests and collects the results"
58
+ JavaScriptTestTask.new(:test_units) do |t|
59
+ testcases = ENV['TESTCASES']
60
+ tests_to_run = ENV['TESTS'] && ENV['TESTS'].split(',')
61
+ browsers_to_test = ENV['BROWSERS'] && ENV['BROWSERS'].split(',')
62
+
63
+ t.mount("/dist")
64
+ t.mount("/src")
65
+ t.mount("/test")
66
+
67
+ Dir["test/*_test.html"].sort.each do |test_file|
68
+ tests = testcases ? { :url => "/#{test_file}", :testcases => testcases } : "/#{test_file}"
69
+ test_filename = test_file[/.*\/(.+?)\.html/, 1]
70
+ t.run(tests) unless tests_to_run && !tests_to_run.include?(test_filename)
71
+ end
72
+
73
+ %w( safari firefox ie konqueror opera ).each do |browser|
74
+ t.browser(browser.to_sym) unless browsers_to_test && !browsers_to_test.include?(browser)
75
+ end
76
+ end
77
+
78
+ task :clean_package_source do
79
+ rm_rf File.join(APP_PKG_DIR, "'<%= name %>'-#{APP_VERSION}")
80
+ end
81
+
82
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
@@ -0,0 +1,15 @@
1
+ # This file has been copied here by the javascript_test_autotest plugin.
2
+ # Comment/uncomment the browsers you wish to autotest with.
3
+ # Same schema as per selenium-on-rails plugin, which is nice.
4
+ browsers:
5
+ # Windows
6
+ # firefox: 'c:\Program Files\Mozilla Firefox\firefox.exe'
7
+ # ie: 'c:\Program Files\Internet Explorer\iexplore.exe'
8
+
9
+ # Mac OS X
10
+ # firefox: '/Applications/Firefox.app/Contents/MacOS/firefox-bin'
11
+ safari: '/Applications/Safari.app/Contents/MacOS/Safari'
12
+
13
+ # Unix
14
+ # ?
15
+ # ?
@@ -0,0 +1,382 @@
1
+ require 'rake/tasklib'
2
+ require 'thread'
3
+ require 'webrick'
4
+ require 'fileutils'
5
+ include FileUtils
6
+
7
+ class Browser
8
+ def supported?; true; end
9
+ def setup ; end
10
+ def open(url) ; end
11
+ def teardown ; end
12
+
13
+ def host
14
+ require 'rbconfig'
15
+ Config::CONFIG['host']
16
+ end
17
+
18
+ def macos?
19
+ host.include?('darwin')
20
+ end
21
+
22
+ def windows?
23
+ host.include?('mswin')
24
+ end
25
+
26
+ def linux?
27
+ host.include?('linux')
28
+ end
29
+
30
+ def applescript(script)
31
+ raise "Can't run AppleScript on #{host}" unless macos?
32
+ system "osascript -e '#{script}' 2>&1 >/dev/null"
33
+ end
34
+ end
35
+
36
+ class FirefoxBrowser < Browser
37
+ def initialize(path=File.join(ENV['ProgramFiles'] || 'c:\Program Files', '\Mozilla Firefox\firefox.exe'))
38
+ @path = path
39
+ end
40
+
41
+ def visit(url)
42
+ system("open -a Firefox '#{url}'") if macos?
43
+ system("#{@path} #{url}") if windows?
44
+ system("firefox #{url}") if linux?
45
+ end
46
+
47
+ def to_s
48
+ "Firefox"
49
+ end
50
+ end
51
+
52
+ class SafariBrowser < Browser
53
+ def supported?
54
+ macos?
55
+ end
56
+
57
+ def setup
58
+ applescript('tell application "Safari" to make new document')
59
+ end
60
+
61
+ def visit(url)
62
+ applescript('tell application "Safari" to set URL of front document to "' + url + '"')
63
+ end
64
+
65
+ def teardown
66
+ #applescript('tell application "Safari" to close front document')
67
+ end
68
+
69
+ def to_s
70
+ "Safari"
71
+ end
72
+ end
73
+
74
+ class IEBrowser < Browser
75
+ def setup
76
+ require 'win32ole' if windows?
77
+ end
78
+
79
+ def supported?
80
+ windows?
81
+ end
82
+
83
+ def visit(url)
84
+ if windows?
85
+ ie = WIN32OLE.new('InternetExplorer.Application')
86
+ ie.visible = true
87
+ ie.Navigate(url)
88
+ while ie.ReadyState != 4 do
89
+ sleep(1)
90
+ end
91
+ end
92
+ end
93
+
94
+ def to_s
95
+ "Internet Explorer"
96
+ end
97
+ end
98
+
99
+ class KonquerorBrowser < Browser
100
+ @@configDir = File.join((ENV['HOME'] || ''), '.kde', 'share', 'config')
101
+ @@globalConfig = File.join(@@configDir, 'kdeglobals')
102
+ @@konquerorConfig = File.join(@@configDir, 'konquerorrc')
103
+
104
+ def supported?
105
+ linux?
106
+ end
107
+
108
+ # Forces KDE's default browser to be Konqueror during the tests, and forces
109
+ # Konqueror to open external URL requests in new tabs instead of a new
110
+ # window.
111
+ def setup
112
+ cd @@configDir, :verbose => false do
113
+ copy @@globalConfig, "#{@@globalConfig}.bak", :preserve => true, :verbose => false
114
+ copy @@konquerorConfig, "#{@@konquerorConfig}.bak", :preserve => true, :verbose => false
115
+ # Too lazy to write it in Ruby... Is sed dependency so bad?
116
+ system "sed -ri /^BrowserApplication=/d '#{@@globalConfig}'"
117
+ system "sed -ri /^KonquerorTabforExternalURL=/s:false:true: '#{@@konquerorConfig}'"
118
+ end
119
+ end
120
+
121
+ def teardown
122
+ cd @@configDir, :verbose => false do
123
+ copy "#{@@globalConfig}.bak", @@globalConfig, :preserve => true, :verbose => false
124
+ copy "#{@@konquerorConfig}.bak", @@konquerorConfig, :preserve => true, :verbose => false
125
+ end
126
+ end
127
+
128
+ def visit(url)
129
+ system("kfmclient openURL #{url}")
130
+ end
131
+
132
+ def to_s
133
+ "Konqueror"
134
+ end
135
+ end
136
+
137
+ class OperaBrowser < Browser
138
+ def initialize(path='c:\Program Files\Opera\Opera.exe')
139
+ @path = path
140
+ end
141
+
142
+ def setup
143
+ if windows?
144
+ puts %{
145
+ MAJOR ANNOYANCE on Windows.
146
+ You have to shut down Opera manually after each test
147
+ for the script to proceed.
148
+ Any suggestions on fixing this is GREATLY appreciated!
149
+ Thank you for your understanding.
150
+ }
151
+ end
152
+ end
153
+
154
+ def visit(url)
155
+ applescript('tell application "Opera" to GetURL "' + url + '"') if macos?
156
+ system("#{@path} #{url}") if windows?
157
+ system("opera #{url}") if linux?
158
+ end
159
+
160
+ def to_s
161
+ "Opera"
162
+ end
163
+ end
164
+
165
+ # shut up, webrick :-)
166
+ class ::WEBrick::HTTPServer
167
+ def access_log(config, req, res)
168
+ # nop
169
+ end
170
+ end
171
+
172
+ class ::WEBrick::BasicLog
173
+ def log(level, data)
174
+ # nop
175
+ end
176
+ end
177
+
178
+ class WEBrick::HTTPResponse
179
+ alias send send_response
180
+ def send_response(socket)
181
+ send(socket) unless fail_silently?
182
+ end
183
+
184
+ def fail_silently?
185
+ @fail_silently
186
+ end
187
+
188
+ def fail_silently
189
+ @fail_silently = true
190
+ end
191
+ end
192
+
193
+ class WEBrick::HTTPRequest
194
+ def to_json
195
+ headers = []
196
+ each { |k, v| headers.push "#{k.inspect}: #{v.inspect}" }
197
+ headers = "{" << headers.join(', ') << "}"
198
+ %({ "headers": #{headers}, "body": #{body.inspect}, "method": #{request_method.inspect} })
199
+ end
200
+ end
201
+
202
+ class WEBrick::HTTPServlet::AbstractServlet
203
+ def prevent_caching(res)
204
+ res['ETag'] = nil
205
+ res['Last-Modified'] = Time.now + 100**4
206
+ res['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'
207
+ res['Pragma'] = 'no-cache'
208
+ res['Expires'] = Time.now - 100**4
209
+ end
210
+ end
211
+
212
+ class BasicServlet < WEBrick::HTTPServlet::AbstractServlet
213
+ def do_GET(req, res)
214
+ prevent_caching(res)
215
+ res['Content-Type'] = "text/plain"
216
+
217
+ req.query.each do |k, v|
218
+ res[k] = v unless k == 'responseBody'
219
+ end
220
+ res.body = req.query["responseBody"]
221
+
222
+ raise WEBrick::HTTPStatus::OK
223
+ end
224
+
225
+ def do_POST(req, res)
226
+ do_GET(req, res)
227
+ end
228
+ end
229
+
230
+ class SlowServlet < BasicServlet
231
+ def do_GET(req, res)
232
+ sleep(2)
233
+ super
234
+ end
235
+ end
236
+
237
+ class DownServlet < BasicServlet
238
+ def do_GET(req, res)
239
+ res.fail_silently
240
+ end
241
+ end
242
+
243
+ class InspectionServlet < BasicServlet
244
+ def do_GET(req, res)
245
+ prevent_caching(res)
246
+ res['Content-Type'] = "application/json"
247
+ res.body = req.to_json
248
+ raise WEBrick::HTTPStatus::OK
249
+ end
250
+ end
251
+
252
+ class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler
253
+ def do_GET(req, res)
254
+ super
255
+ set_default_content_type(res, req.path)
256
+ prevent_caching(res)
257
+ end
258
+
259
+ def set_default_content_type(res, path)
260
+ res['Content-Type'] = case path
261
+ when /\.js$/ then 'text/javascript'
262
+ when /\.html$/ then 'text/html'
263
+ when /\.css$/ then 'text/css'
264
+ else 'text/plain'
265
+ end
266
+ end
267
+ end
268
+
269
+ class JavaScriptTestTask < ::Rake::TaskLib
270
+
271
+ def initialize(name=:test)
272
+ @name = name
273
+ @tests = []
274
+ @browsers = []
275
+
276
+ @queue = Queue.new
277
+
278
+ @server = WEBrick::HTTPServer.new(:Port => 4711) # TODO: make port configurable
279
+ @server.mount_proc("/results") do |req, res|
280
+ @queue.push({
281
+ :tests => req.query['tests'].to_i,
282
+ :assertions => req.query['assertions'].to_i,
283
+ :failures => req.query['failures'].to_i,
284
+ :errors => req.query['errors'].to_i
285
+ })
286
+ res.body = "OK"
287
+ end
288
+ @server.mount("/response", BasicServlet)
289
+ @server.mount("/slow", SlowServlet)
290
+ @server.mount("/down", DownServlet)
291
+ @server.mount("/inspect", InspectionServlet)
292
+ yield self if block_given?
293
+ define
294
+ end
295
+
296
+ def define
297
+ task @name do
298
+ trap("INT") { @server.shutdown }
299
+ t = Thread.new { @server.start }
300
+
301
+ # run all combinations of browsers and tests
302
+ @browsers.each do |browser|
303
+ if browser.supported?
304
+ t0 = Time.now
305
+ results = {:tests => 0, :assertions => 0, :failures => 0, :errors => 0}
306
+ errors = []
307
+ failures = []
308
+ browser.setup
309
+ puts "\nStarted tests in #{browser}"
310
+ @tests.each do |test|
311
+ params = "resultsURL=http://localhost:4711/results&t=" + ("%.6f" % Time.now.to_f)
312
+ if test.is_a?(Hash)
313
+ params << "&tests=#{test[:testcases]}" if test[:testcases]
314
+ test = test[:url]
315
+ end
316
+ browser.visit("http://localhost:4711#{test}?#{params}")
317
+
318
+ result = @queue.pop
319
+ result.each { |k, v| results[k] += v }
320
+ value = "."
321
+
322
+ if result[:failures] > 0
323
+ value = "F"
324
+ failures.push(test)
325
+ end
326
+
327
+ if result[:errors] > 0
328
+ value = "E"
329
+ errors.push(test)
330
+ end
331
+
332
+ print value
333
+ end
334
+
335
+ puts "\nFinished in #{(Time.now - t0).round.to_s} seconds."
336
+ puts " Failures: #{failures.join(', ')}" unless failures.empty?
337
+ puts " Errors: #{errors.join(', ')}" unless errors.empty?
338
+ puts "#{results[:tests]} tests, #{results[:assertions]} assertions, #{results[:failures]} failures, #{results[:errors]} errors"
339
+ browser.teardown
340
+ else
341
+ puts "\nSkipping #{browser}, not supported on this OS"
342
+ end
343
+ end
344
+
345
+ @server.shutdown
346
+ t.join
347
+ end
348
+ end
349
+
350
+ def mount(path, dir=nil)
351
+ dir = Dir.pwd + path unless dir
352
+
353
+ # don't cache anything in our tests
354
+ @server.mount(path, NonCachingFileHandler, dir)
355
+ end
356
+
357
+ # test should be specified as a url or as a hash of the form
358
+ # {:url => "url", :testcases => "testFoo,testBar"}
359
+ def run(test)
360
+ @tests<<test
361
+ end
362
+
363
+ def browser(browser)
364
+ browser =
365
+ case(browser)
366
+ when :firefox
367
+ FirefoxBrowser.new
368
+ when :safari
369
+ SafariBrowser.new
370
+ when :ie
371
+ IEBrowser.new
372
+ when :konqueror
373
+ KonquerorBrowser.new
374
+ when :opera
375
+ OperaBrowser.new
376
+ else
377
+ browser
378
+ end
379
+
380
+ @browsers<<browser
381
+ end
382
+ end