ghostbuster 0.2.4 → 0.3.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.
- data/.gitignore +2 -1
- data/Rakefile +66 -24
- data/lib/ghostbuster.coffee +13 -7
- data/lib/ghostbuster.rb +50 -12
- data/lib/ghostbuster/config.rb +3 -1
- data/lib/ghostbuster/version.rb +1 -1
- data/test/non_working_ghost/Gemfile +6 -0
- data/{ghost → test/non_working_ghost}/Ghostfile +1 -1
- data/{ghost → test/non_working_ghost}/config.ru +0 -0
- data/{ghost → test/non_working_ghost}/start.sh +0 -0
- data/{ghost → test/non_working_ghost}/stop.sh +0 -0
- data/test/non_working_ghost/test_ghost.coffee +15 -0
- data/test/non_working_ghost/test_ghostmore.coffee +9 -0
- data/{ghost → test/non_working_ghost}/test_withoutroot.js +0 -0
- data/{ghost → test/non_working_ghost}/views/form.erb +0 -0
- data/{ghost → test/non_working_ghost}/views/index.erb +0 -0
- data/{ghost → test/non_working_ghost}/views/slow.erb +0 -0
- data/test/server1/config.ru +23 -0
- data/test/server1/start.sh +3 -0
- data/test/server1/stop.sh +3 -0
- data/test/server1/views/form.erb +12 -0
- data/test/server1/views/index.erb +15 -0
- data/test/server1/views/slow.erb +12 -0
- data/test/working_ghost/Gemfile +6 -0
- data/test/working_ghost/Ghostfile +4 -0
- data/test/working_ghost/Rakefile +1 -0
- data/test/working_ghost/config.ru +23 -0
- data/test/working_ghost/start.sh +3 -0
- data/test/working_ghost/stop.sh +3 -0
- data/{ghost → test/working_ghost}/test_ghost.coffee +0 -14
- data/{ghost → test/working_ghost}/test_ghostmore.coffee +0 -7
- data/{ghost → test/working_ghost}/test_injs.js +1 -1
- data/test/working_ghost/views/form.erb +12 -0
- data/test/working_ghost/views/index.erb +15 -0
- data/test/working_ghost/views/slow.erb +12 -0
- metadata +63 -17
- data/log/thin.log +0 -24
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1,30 +1,72 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
-
$: << 'lib'
|
3
|
-
require 'ghostbuster/install_rake'
|
4
2
|
|
5
|
-
|
6
|
-
out = `bundle exec rake test:ghostbuster`
|
7
|
-
$?.success? ? out.gsub(/server .*?\n/m, "server\n") : raise("there was a problem")
|
8
|
-
end
|
3
|
+
STDOUT.sync = true
|
9
4
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
5
|
+
namespace :test do
|
6
|
+
desc "Run test for `working' test suite (via binary)"
|
7
|
+
task :working_via_bin do
|
8
|
+
print "working_ghost via bin ... "
|
9
|
+
Dir.chdir("test/working_ghost") do
|
10
|
+
matcher = [/9 success, 0 failure, 1 pending/]
|
11
|
+
fork {
|
12
|
+
ENV['BUNDLE_GEMFILE'] = File.expand_path("./Gemfile")
|
13
|
+
`bundle install`
|
14
|
+
out = `bundle exec ghostbuster . 2>&1`
|
15
|
+
unless matcher.all?{|m|out[m]}
|
16
|
+
puts out
|
17
|
+
exit(1)
|
18
|
+
end
|
19
|
+
raise("There are a weird number of screenshots") unless Dir['*.png'].to_a.size == 12
|
20
|
+
exit
|
21
|
+
}
|
22
|
+
_, status = Process.wait2
|
23
|
+
puts status.success? ? "PASSED" : "FAILED"
|
24
|
+
end
|
18
25
|
end
|
19
|
-
end
|
20
26
|
|
21
|
-
desc "
|
22
|
-
task :
|
23
|
-
|
24
|
-
|
25
|
-
|
27
|
+
desc "Run test for `working' test suite (via rake)"
|
28
|
+
task :working_via_rake do
|
29
|
+
print "working_ghost via rake ... "
|
30
|
+
Dir.chdir("test/working_ghost") do
|
31
|
+
matcher = [/9 success, 0 failure, 1 pending/]
|
32
|
+
fork {
|
33
|
+
ENV['BUNDLE_GEMFILE'] = File.expand_path("./Gemfile")
|
34
|
+
`bundle install`
|
35
|
+
out = `bundle exec rake test:ghostbuster 2>&1`
|
36
|
+
unless matcher.all?{|m|out[m]}
|
37
|
+
puts out
|
38
|
+
exit(1)
|
39
|
+
end
|
40
|
+
raise("There are a weird number of screenshots") unless Dir['*.png'].to_a.size == 12
|
41
|
+
exit
|
42
|
+
}
|
43
|
+
_, status = Process.wait2
|
44
|
+
puts status.success? ? "PASSED" : "FAILED"
|
45
|
+
end
|
46
|
+
end
|
26
47
|
|
27
|
-
desc "
|
28
|
-
task :
|
29
|
-
|
30
|
-
|
48
|
+
desc "Run test for `non_working' test suite"
|
49
|
+
task :non_working do
|
50
|
+
print "non_working_ghost ... "
|
51
|
+
Dir.chdir("test/non_working_ghost") do
|
52
|
+
matcher = [/0 success, 5 failure, 0 pending/, /Bad link traversal\s+Assert location failed: Excepted http:\/\/127\.0\.0\.1:4567\/not-correct, got http:\/\/127\.0\.0\.1:4567\//, /Form input not equal\s+Assert first for selector #out did not meet expectations/, /This test will explode!\s+I hate you!/, /This test has no succeed\s+This test took too long/]
|
53
|
+
fork {
|
54
|
+
ENV['BUNDLE_GEMFILE'] = File.expand_path("./Gemfile")
|
55
|
+
`bundle install`
|
56
|
+
out = `bundle exec ghostbuster . 2>&1`
|
57
|
+
begin
|
58
|
+
matcher.each{|m| out[m] or raise("Couldn't match for #{m.inspect}")}
|
59
|
+
exit
|
60
|
+
rescue
|
61
|
+
puts $!.message
|
62
|
+
puts out
|
63
|
+
exit(1)
|
64
|
+
end
|
65
|
+
}
|
66
|
+
_, status = Process.wait2
|
67
|
+
puts status.success? ? "PASSED" : "FAILED"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
task :test => [:'test:working_via_bin', :'test:working_via_rake', :'test:non_working']
|
data/lib/ghostbuster.coffee
CHANGED
@@ -10,7 +10,11 @@ class Test
|
|
10
10
|
@assertions = []
|
11
11
|
@seenCallbacks = []
|
12
12
|
@assertionIndex = 0
|
13
|
-
nameForRender: ->
|
13
|
+
nameForRender: ->
|
14
|
+
name = "#{@runner.suite.screenshot_dir}/#{@runner.nameForRender()}-#{@name.toLowerCase()}"
|
15
|
+
name = name.replace(///\s///g, '_')
|
16
|
+
name = name.replace(///'///g, '')
|
17
|
+
"#{name}-#{++@assertionIndex}.png"
|
14
18
|
getLastError: -> @runner.lastErrors[@name]
|
15
19
|
resetLastError: -> delete @runner.lastErrors[@name]
|
16
20
|
setLastError: (error) ->
|
@@ -56,6 +60,8 @@ class Test
|
|
56
60
|
test.seenCallbacks.push getCallback # traversing links causes this to get re-fired.
|
57
61
|
switch status
|
58
62
|
when 'success'
|
63
|
+
if test.runner.useScreenshots()
|
64
|
+
test.page.render test.nameForRender()
|
59
65
|
test.body = new Body(test)
|
60
66
|
getCallback.call(test) if getCallback
|
61
67
|
when 'fail'
|
@@ -69,18 +75,17 @@ class Test
|
|
69
75
|
@stopTestTimer()
|
70
76
|
@callback(false, msg)
|
71
77
|
assert: (opts, valueFetcher) ->
|
72
|
-
@assertions.push(new Assertion(this,
|
78
|
+
@assertions.push(new Assertion(this, opts, valueFetcher))
|
73
79
|
@assertions[0].start() if @assertions.length == 1
|
74
80
|
wait: (time, callback) ->
|
75
81
|
test = this
|
76
82
|
setTimeout (-> callback.call(test)), time * 1000
|
77
83
|
|
78
84
|
class Assertion
|
79
|
-
constructor: (@test, @
|
85
|
+
constructor: (@test, @opts, @fetcher) ->
|
80
86
|
@count = 0
|
81
87
|
@totalTime = if @opts['total'] then @opts['total'] * 1000 else 1000
|
82
88
|
@everyTime = if @opts['every'] then @opts['every'] else 75
|
83
|
-
nameForRender: -> "#{@test.nameForRender()}-#{@idx}.png"
|
84
89
|
start: ->
|
85
90
|
test = @test
|
86
91
|
assertion = this
|
@@ -99,7 +104,7 @@ class Assertion
|
|
99
104
|
test.assertions.splice(test.assertions.indexOf(assertion), 1)
|
100
105
|
clearTimeout assertion.fatal
|
101
106
|
if test.runner.useScreenshots()
|
102
|
-
test.page.render
|
107
|
+
test.page.render test.nameForRender()
|
103
108
|
if test.assertions.length > 0
|
104
109
|
test.assertions[0].start()
|
105
110
|
else
|
@@ -144,7 +149,7 @@ class Body
|
|
144
149
|
var evaluator = function() {
|
145
150
|
try {
|
146
151
|
var assertionCallback = #{assertionCallback.toString()};
|
147
|
-
var count = document.
|
152
|
+
var count = document.querySelectorAll('#{selector}').length;
|
148
153
|
var ret = assertionCallback(count);
|
149
154
|
if (ret) {
|
150
155
|
return true;
|
@@ -313,7 +318,8 @@ class TestFile
|
|
313
318
|
console.log " \033[31m\u2717\033[0m #{name}\n #{@lastErrors[name] || "There was a problem"}"
|
314
319
|
console.log ""
|
315
320
|
@suite.report(success, failure, pending)
|
316
|
-
|
321
|
+
|
322
|
+
console.log "Running tests..."
|
317
323
|
|
318
324
|
class TestSuite
|
319
325
|
constructor: (@args) ->
|
data/lib/ghostbuster.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'digest/md5'
|
3
|
+
|
1
4
|
require 'ghostbuster/version'
|
2
5
|
require 'ghostbuster/shell'
|
3
6
|
require 'ghostbuster/config'
|
@@ -8,30 +11,40 @@ class Ghostbuster
|
|
8
11
|
autoload :Runner, 'ghostbuster/runner'
|
9
12
|
|
10
13
|
def initialize(path)
|
14
|
+
STDOUT.sync = true
|
11
15
|
@path = path && File.exist?(path) ? path : '.'
|
12
16
|
@dir = File.directory?(@path) ? @path : File.basename(@path)
|
13
17
|
@file = File.directory?(@dir) ? File.join(@dir, 'Ghostfile') : @dir
|
14
18
|
@ghost_lib = File.expand_path(File.join(File.dirname(__FILE__), "ghostbuster.coffee"))
|
15
|
-
@config = Config.new(@file)
|
16
|
-
STDOUT.sync = true
|
17
19
|
end
|
18
20
|
|
19
21
|
def run
|
20
22
|
status = 1
|
21
23
|
Dir.chdir(@dir) do
|
24
|
+
load_config
|
22
25
|
spinner "Starting server" do
|
23
26
|
sh @config.start_command
|
24
27
|
sleep 2
|
25
28
|
end
|
26
29
|
begin
|
27
|
-
_, status = Process.waitpid2 fork {
|
30
|
+
_, status = Process.waitpid2 fork {
|
31
|
+
exec("#{@config.phantom_bin} #{@ghost_lib} #{@config.screenshots?} #{@config.screenshot_x} #{@config.screenshot_y} #{@temporary_screenshot_dir} #{Dir[@config.pattern].to_a.join(' ')}")
|
32
|
+
}
|
33
|
+
spinner "Copying screenshots" do
|
34
|
+
compress_and_copy_screenshots if status.success? && @config.screenshots?
|
35
|
+
end
|
28
36
|
ensure
|
29
37
|
spinner "Stopping server" do
|
30
38
|
sh @config.stop_command
|
31
39
|
end
|
40
|
+
if @config.screenshots?
|
41
|
+
spinner "Cleaning up temporary screenshots" do
|
42
|
+
cleanup_screenshots
|
43
|
+
end
|
44
|
+
end
|
32
45
|
end
|
33
46
|
end
|
34
|
-
exit(status)
|
47
|
+
exit(status.to_i)
|
35
48
|
end
|
36
49
|
|
37
50
|
def self.run(path)
|
@@ -39,22 +52,47 @@ class Ghostbuster
|
|
39
52
|
end
|
40
53
|
|
41
54
|
private
|
55
|
+
def compress_and_copy_screenshots
|
56
|
+
FileUtils.rm_f(File.join(@config.screenshot_dir, "*.png"))
|
57
|
+
files = Dir[File.join(@temporary_screenshot_dir, '*.png')].to_a
|
58
|
+
files.map{|f| f[/(.*?)-\d+\.png$/, 1]}.uniq.each do |cluster|
|
59
|
+
images = files.select{|f| f[cluster]}.sort_by{|f| Integer(f[/\-(\d+)\.png$/, 1])}
|
60
|
+
idx = 0
|
61
|
+
while idx < (images.size - 1)
|
62
|
+
if Digest::MD5.file(images[idx]) == Digest::MD5.file(images[idx + 1])
|
63
|
+
images.slice!(idx + 1)
|
64
|
+
else
|
65
|
+
idx += 1
|
66
|
+
end
|
67
|
+
end
|
68
|
+
images.each_with_index do |f, idx|
|
69
|
+
FileUtils.mv(f, File.join(@config.screenshot_dir, "#{File.basename(f)[/(.*?)\-\d+\.png$/, 1]}-%03d.png" % (idx + 1)))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def cleanup_screenshots
|
75
|
+
FileUtils.rm_rf @temporary_screenshot_dir
|
76
|
+
end
|
77
|
+
|
78
|
+
def load_config
|
79
|
+
@config = Config.new(@file)
|
80
|
+
@temporary_screenshot_dir = File.join(@config.temp_dir, "ghost-#{Process.pid}-#{Time.new.to_i}")
|
81
|
+
FileUtils.mkdir_p(@temporary_screenshot_dir) if @config.screenshots?
|
82
|
+
end
|
83
|
+
|
42
84
|
def spinner(msg, &blk)
|
43
|
-
STDOUT.sync = true
|
44
|
-
print msg
|
45
|
-
print " "
|
46
85
|
spin = Thread.new do
|
47
86
|
i = 0
|
87
|
+
s = '/-\\|'
|
48
88
|
loop do
|
49
|
-
s
|
50
|
-
print s[i % 4].chr
|
89
|
+
print "\r#{msg} #{s[i % 4].chr}"
|
51
90
|
i += 1
|
52
|
-
sleep 0.
|
53
|
-
print "\b"
|
91
|
+
sleep 0.05
|
54
92
|
end
|
55
93
|
end
|
56
94
|
yield
|
57
95
|
spin.kill
|
58
|
-
puts
|
96
|
+
puts "\r#{msg} ✓"
|
59
97
|
end
|
60
98
|
end
|
data/lib/ghostbuster/config.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Ghostbuster
|
2
2
|
class Config
|
3
|
-
attr_accessor :pattern, :screenshot_dir, :start_command, :stop_command, :phantom_bin
|
3
|
+
attr_accessor :pattern, :screenshot_dir, :start_command, :stop_command, :phantom_bin, :temp_dir
|
4
4
|
attr_reader :screenshot_x, :screenshot_y
|
5
5
|
def initialize(path_to_file = nil)
|
6
6
|
@config_file = path_to_file || './Ghostfile'
|
@@ -9,10 +9,12 @@ class Ghostbuster
|
|
9
9
|
@phantom_bin = File.join(ENV['HOME'], '.ghostbuster', 'phantomjs')
|
10
10
|
@screenshot_dir = "."
|
11
11
|
@screenshots = true
|
12
|
+
@temp_dir = "/tmp"
|
12
13
|
@start_command, @stop_command = "./start.sh", "./stop.sh"
|
13
14
|
if File.exist?(@config_file)
|
14
15
|
instance_eval File.read(@config_file), @config_file, 1
|
15
16
|
end
|
17
|
+
@screenshot_dir = File.expand_path(@screenshot_dir)
|
16
18
|
end
|
17
19
|
|
18
20
|
def ghost
|
data/lib/ghostbuster/version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
phantom.test.root = "http://127.0.0.1:4567"
|
2
|
+
|
3
|
+
phantom.test.add "Bad link traversal", ->
|
4
|
+
@get '/', ->
|
5
|
+
@body.click 'a'
|
6
|
+
@body.assertLocation('/not-correct')
|
7
|
+
@succeed()
|
8
|
+
|
9
|
+
phantom.test.add "Form input not equal", ->
|
10
|
+
@get '/form', ->
|
11
|
+
@body.input "#in", "this is my input"
|
12
|
+
@body.click "#btn"
|
13
|
+
@body.assertFirst '#out', (out) ->
|
14
|
+
out.innerHTML == 'this is NOT my input'
|
15
|
+
@succeed()
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
|
4
|
+
class App < Sinatra::Base
|
5
|
+
get "/" do
|
6
|
+
erb :index
|
7
|
+
end
|
8
|
+
|
9
|
+
get "/form" do
|
10
|
+
erb :form
|
11
|
+
end
|
12
|
+
|
13
|
+
get "/slow" do
|
14
|
+
erb :slow
|
15
|
+
end
|
16
|
+
|
17
|
+
get "/slow-index" do
|
18
|
+
sleep 2
|
19
|
+
erb :index
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
run App
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>This is my index</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<form>
|
7
|
+
<input type="text" id="in">
|
8
|
+
<input type="button" id="btn" onclick="document.getElementById('out').innerHTML = document.getElementById('in').value;">
|
9
|
+
</form>
|
10
|
+
<p id="out"></p>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>This is my index</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<h1>First header</h1>
|
7
|
+
<p>This is my paragraph</p>
|
8
|
+
<ul>
|
9
|
+
<li>List item 1</li>
|
10
|
+
<li>List item 2</li>
|
11
|
+
<li>List item 3</li>
|
12
|
+
</ul>
|
13
|
+
<a href="/form">form</a>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>This is my index</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<form>
|
7
|
+
<input type="text" id="in">
|
8
|
+
<input type="button" id="btn" onclick="setTimeout( function() { document.getElementById('out').innerHTML = document.getElementById('in').value;}, 2000);">
|
9
|
+
</form>
|
10
|
+
<p id="out"></p>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'ghostbuster/install_rake'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
|
4
|
+
class App < Sinatra::Base
|
5
|
+
get "/" do
|
6
|
+
erb :index
|
7
|
+
end
|
8
|
+
|
9
|
+
get "/form" do
|
10
|
+
erb :form
|
11
|
+
end
|
12
|
+
|
13
|
+
get "/slow" do
|
14
|
+
erb :slow
|
15
|
+
end
|
16
|
+
|
17
|
+
get "/slow-index" do
|
18
|
+
sleep 2
|
19
|
+
erb :index
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
run App
|
@@ -27,17 +27,3 @@ phantom.test.add "Link traversal", ->
|
|
27
27
|
@body.click 'a'
|
28
28
|
@body.assertLocation('/form')
|
29
29
|
@succeed()
|
30
|
-
|
31
|
-
phantom.test.add "Bad link traversal", ->
|
32
|
-
@get '/', ->
|
33
|
-
@body.click 'a'
|
34
|
-
@body.assertLocation('/not-correct')
|
35
|
-
@succeed()
|
36
|
-
|
37
|
-
phantom.test.add "Form input not equal", ->
|
38
|
-
@get '/form', ->
|
39
|
-
@body.input "#in", "this is my input"
|
40
|
-
@body.click "#btn"
|
41
|
-
@body.assertFirst '#out', (out) ->
|
42
|
-
out.innerHTML == 'this is NOT my input'
|
43
|
-
@succeed()
|
@@ -31,10 +31,3 @@ phantom.test.add "Before block var", ->
|
|
31
31
|
@body.assertFirst '#out', (out) ->
|
32
32
|
out.innerHTML == 'sample'
|
33
33
|
@succeed()
|
34
|
-
|
35
|
-
phantom.test.add "This test will explode!", ->
|
36
|
-
throw "I hate you!"
|
37
|
-
|
38
|
-
phantom.test.add "This test has no succeed", ->
|
39
|
-
@get '/form', ->
|
40
|
-
"so, like, this test sucks"
|
@@ -2,7 +2,7 @@ phantom.test.root = "http://127.0.0.1:4567"
|
|
2
2
|
|
3
3
|
phantom.test.add("Test for 3 li's", function() {
|
4
4
|
this.get('/', function() {
|
5
|
-
this.body.assertCount('li', function(count) { return count == 3})
|
5
|
+
this.body.assertCount('li', function(count) { return count == 3 })
|
6
6
|
})
|
7
7
|
this.succeed();
|
8
8
|
});
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>This is my index</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<form>
|
7
|
+
<input type="text" id="in">
|
8
|
+
<input type="button" id="btn" onclick="document.getElementById('out').innerHTML = document.getElementById('in').value;">
|
9
|
+
</form>
|
10
|
+
<p id="out"></p>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>This is my index</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<h1>First header</h1>
|
7
|
+
<p>This is my paragraph</p>
|
8
|
+
<ul>
|
9
|
+
<li>List item 1</li>
|
10
|
+
<li>List item 2</li>
|
11
|
+
<li>List item 3</li>
|
12
|
+
</ul>
|
13
|
+
<a href="/form">form</a>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>This is my index</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<form>
|
7
|
+
<input type="text" id="in">
|
8
|
+
<input type="button" id="btn" onclick="setTimeout( function() { document.getElementById('out').innerHTML = document.getElementById('in').value;}, 2000);">
|
9
|
+
</form>
|
10
|
+
<p id="out"></p>
|
11
|
+
</body>
|
12
|
+
</html>
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ghostbuster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Josh Hull
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-09-01 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -97,17 +97,6 @@ files:
|
|
97
97
|
- Rakefile
|
98
98
|
- bin/ghostbuster
|
99
99
|
- bin/setup-ghostbuster
|
100
|
-
- ghost/Ghostfile
|
101
|
-
- ghost/config.ru
|
102
|
-
- ghost/start.sh
|
103
|
-
- ghost/stop.sh
|
104
|
-
- ghost/test_ghost.coffee
|
105
|
-
- ghost/test_ghostmore.coffee
|
106
|
-
- ghost/test_injs.js
|
107
|
-
- ghost/test_withoutroot.js
|
108
|
-
- ghost/views/form.erb
|
109
|
-
- ghost/views/index.erb
|
110
|
-
- ghost/views/slow.erb
|
111
100
|
- ghostbuster.gemspec
|
112
101
|
- lib/ghostbuster.coffee
|
113
102
|
- lib/ghostbuster.rb
|
@@ -117,8 +106,36 @@ files:
|
|
117
106
|
- lib/ghostbuster/runner.rb
|
118
107
|
- lib/ghostbuster/shell.rb
|
119
108
|
- lib/ghostbuster/version.rb
|
120
|
-
-
|
109
|
+
- test/non_working_ghost/Gemfile
|
110
|
+
- test/non_working_ghost/Ghostfile
|
111
|
+
- test/non_working_ghost/config.ru
|
112
|
+
- test/non_working_ghost/start.sh
|
113
|
+
- test/non_working_ghost/stop.sh
|
114
|
+
- test/non_working_ghost/test_ghost.coffee
|
115
|
+
- test/non_working_ghost/test_ghostmore.coffee
|
116
|
+
- test/non_working_ghost/test_withoutroot.js
|
117
|
+
- test/non_working_ghost/views/form.erb
|
118
|
+
- test/non_working_ghost/views/index.erb
|
119
|
+
- test/non_working_ghost/views/slow.erb
|
121
120
|
- test/output
|
121
|
+
- test/server1/config.ru
|
122
|
+
- test/server1/start.sh
|
123
|
+
- test/server1/stop.sh
|
124
|
+
- test/server1/views/form.erb
|
125
|
+
- test/server1/views/index.erb
|
126
|
+
- test/server1/views/slow.erb
|
127
|
+
- test/working_ghost/Gemfile
|
128
|
+
- test/working_ghost/Ghostfile
|
129
|
+
- test/working_ghost/Rakefile
|
130
|
+
- test/working_ghost/config.ru
|
131
|
+
- test/working_ghost/start.sh
|
132
|
+
- test/working_ghost/stop.sh
|
133
|
+
- test/working_ghost/test_ghost.coffee
|
134
|
+
- test/working_ghost/test_ghostmore.coffee
|
135
|
+
- test/working_ghost/test_injs.js
|
136
|
+
- test/working_ghost/views/form.erb
|
137
|
+
- test/working_ghost/views/index.erb
|
138
|
+
- test/working_ghost/views/slow.erb
|
122
139
|
has_rdoc: true
|
123
140
|
homepage: https://github.com/joshbuddy/ghostbuster
|
124
141
|
licenses: []
|
@@ -154,4 +171,33 @@ signing_key:
|
|
154
171
|
specification_version: 3
|
155
172
|
summary: Integration testing ftw
|
156
173
|
test_files:
|
174
|
+
- test/non_working_ghost/Gemfile
|
175
|
+
- test/non_working_ghost/Ghostfile
|
176
|
+
- test/non_working_ghost/config.ru
|
177
|
+
- test/non_working_ghost/start.sh
|
178
|
+
- test/non_working_ghost/stop.sh
|
179
|
+
- test/non_working_ghost/test_ghost.coffee
|
180
|
+
- test/non_working_ghost/test_ghostmore.coffee
|
181
|
+
- test/non_working_ghost/test_withoutroot.js
|
182
|
+
- test/non_working_ghost/views/form.erb
|
183
|
+
- test/non_working_ghost/views/index.erb
|
184
|
+
- test/non_working_ghost/views/slow.erb
|
157
185
|
- test/output
|
186
|
+
- test/server1/config.ru
|
187
|
+
- test/server1/start.sh
|
188
|
+
- test/server1/stop.sh
|
189
|
+
- test/server1/views/form.erb
|
190
|
+
- test/server1/views/index.erb
|
191
|
+
- test/server1/views/slow.erb
|
192
|
+
- test/working_ghost/Gemfile
|
193
|
+
- test/working_ghost/Ghostfile
|
194
|
+
- test/working_ghost/Rakefile
|
195
|
+
- test/working_ghost/config.ru
|
196
|
+
- test/working_ghost/start.sh
|
197
|
+
- test/working_ghost/stop.sh
|
198
|
+
- test/working_ghost/test_ghost.coffee
|
199
|
+
- test/working_ghost/test_ghostmore.coffee
|
200
|
+
- test/working_ghost/test_injs.js
|
201
|
+
- test/working_ghost/views/form.erb
|
202
|
+
- test/working_ghost/views/index.erb
|
203
|
+
- test/working_ghost/views/slow.erb
|
data/log/thin.log
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
>> Writing PID to thin.pid
|
2
|
-
>> Exiting!
|
3
|
-
/Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/rack/adapter/loader.rb:35:in `read': No such file or directory - config.ru (Errno::ENOENT)
|
4
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/rack/adapter/loader.rb:35:in `load'
|
5
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/controllers/controller.rb:181:in `load_rackup_config'
|
6
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/controllers/controller.rb:71:in `start'
|
7
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/runner.rb:185:in `send'
|
8
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/runner.rb:185:in `run_command'
|
9
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/runner.rb:151:in `run!'
|
10
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/bin/thin:6
|
11
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/bin/thin:19:in `load'
|
12
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/bin/thin:19
|
13
|
-
>> Writing PID to thin.pid
|
14
|
-
>> Exiting!
|
15
|
-
/Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/rack/adapter/loader.rb:35:in `read': No such file or directory - config.ru (Errno::ENOENT)
|
16
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/rack/adapter/loader.rb:35:in `load'
|
17
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/controllers/controller.rb:181:in `load_rackup_config'
|
18
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/controllers/controller.rb:71:in `start'
|
19
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/runner.rb:185:in `send'
|
20
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/runner.rb:185:in `run_command'
|
21
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/lib/thin/runner.rb:151:in `run!'
|
22
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/gems/thin-1.2.11/bin/thin:6
|
23
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/bin/thin:19:in `load'
|
24
|
-
from /Users/joshbuddy/.rvm/gems/ree-1.8.7-2011.03/bin/thin:19
|