ghostbuster 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/.gitignore +2 -1
  2. data/Rakefile +66 -24
  3. data/lib/ghostbuster.coffee +13 -7
  4. data/lib/ghostbuster.rb +50 -12
  5. data/lib/ghostbuster/config.rb +3 -1
  6. data/lib/ghostbuster/version.rb +1 -1
  7. data/test/non_working_ghost/Gemfile +6 -0
  8. data/{ghost → test/non_working_ghost}/Ghostfile +1 -1
  9. data/{ghost → test/non_working_ghost}/config.ru +0 -0
  10. data/{ghost → test/non_working_ghost}/start.sh +0 -0
  11. data/{ghost → test/non_working_ghost}/stop.sh +0 -0
  12. data/test/non_working_ghost/test_ghost.coffee +15 -0
  13. data/test/non_working_ghost/test_ghostmore.coffee +9 -0
  14. data/{ghost → test/non_working_ghost}/test_withoutroot.js +0 -0
  15. data/{ghost → test/non_working_ghost}/views/form.erb +0 -0
  16. data/{ghost → test/non_working_ghost}/views/index.erb +0 -0
  17. data/{ghost → test/non_working_ghost}/views/slow.erb +0 -0
  18. data/test/server1/config.ru +23 -0
  19. data/test/server1/start.sh +3 -0
  20. data/test/server1/stop.sh +3 -0
  21. data/test/server1/views/form.erb +12 -0
  22. data/test/server1/views/index.erb +15 -0
  23. data/test/server1/views/slow.erb +12 -0
  24. data/test/working_ghost/Gemfile +6 -0
  25. data/test/working_ghost/Ghostfile +4 -0
  26. data/test/working_ghost/Rakefile +1 -0
  27. data/test/working_ghost/config.ru +23 -0
  28. data/test/working_ghost/start.sh +3 -0
  29. data/test/working_ghost/stop.sh +3 -0
  30. data/{ghost → test/working_ghost}/test_ghost.coffee +0 -14
  31. data/{ghost → test/working_ghost}/test_ghostmore.coffee +0 -7
  32. data/{ghost → test/working_ghost}/test_injs.js +1 -1
  33. data/test/working_ghost/views/form.erb +12 -0
  34. data/test/working_ghost/views/index.erb +15 -0
  35. data/test/working_ghost/views/slow.erb +12 -0
  36. metadata +63 -17
  37. data/log/thin.log +0 -24
data/.gitignore CHANGED
@@ -2,4 +2,5 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
- ghost/log/thin.log
5
+ *.png
6
+ this.log
data/Rakefile CHANGED
@@ -1,30 +1,72 @@
1
1
  require 'bundler/gem_tasks'
2
- $: << 'lib'
3
- require 'ghostbuster/install_rake'
4
2
 
5
- def test_output
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
- desc "Run tests"
11
- task :test do
12
- out = test_output
13
- if File.read(File.join(File.dirname(__FILE__), 'test', 'output')) == out
14
- puts "Everything is great!"
15
- else
16
- puts out
17
- raise "Things aren't great."
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 "Update tests"
22
- task :'test:update' do
23
- File.open(File.join(File.dirname(__FILE__), 'test', 'output'), 'w') {|f| f << test_output}
24
- puts "Test output updated"
25
- end
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 "Show output"
28
- task :"test:output" do
29
- puts test_output
30
- end
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']
@@ -10,7 +10,11 @@ class Test
10
10
  @assertions = []
11
11
  @seenCallbacks = []
12
12
  @assertionIndex = 0
13
- nameForRender: -> "#{@runner.suite.screenshot_dir}/#{@runner.nameForRender()}-#{@name.toLowerCase()}".replace(///\s///g, '_').replace(///'///g, '')
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, ++@assertionIndex, opts, valueFetcher))
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, @idx, @opts, @fetcher) ->
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 assertion.nameForRender()
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.querySelector('#{selector}').length;
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
- console.log "GhostBuster"
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 { exec("#{@config.phantom_bin} #{@ghost_lib} #{@config.screenshots?} #{@config.screenshot_x} #{@config.screenshot_y} #{File.expand_path(@config.screenshot_dir)} #{Dir[@config.pattern].to_a.join(' ')}") }
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.1
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  class Ghostbuster
2
- VERSION = '0.2.4'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -0,0 +1,6 @@
1
+ source :rubygems
2
+
3
+ gem 'ghostbuster', :path => '../..'
4
+ gem 'thin'
5
+ gem 'sinatra'
6
+ gem 'rake'
@@ -1,4 +1,4 @@
1
1
  ghost.pattern = "test_*.{coffee,js}"
2
- ghost.do_not_take_screenshots! # or do_not_takescreenshots! defaults to true
2
+ ghost.take_screenshots! # or do_not_takescreenshots! defaults to true
3
3
  ghost.screenshot_dir = '.'
4
4
  ghost.screenshot_dimensions 800, 2000
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()
@@ -0,0 +1,9 @@
1
+ phantom.test.root = "http://127.0.0.1:4567"
2
+
3
+
4
+ phantom.test.add "This test will explode!", ->
5
+ throw "I hate you!"
6
+
7
+ phantom.test.add "This test has no succeed", ->
8
+ @get '/form', ->
9
+ "so, like, this test sucks"
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,3 @@
1
+ #!/bin/bash
2
+
3
+ bundle exec thin --port 4567 -P thin.pid -d -R config.ru start
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ bundle exec thin --port 4567 -P thin.pid -d -R config.ru stop
@@ -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,6 @@
1
+ source :rubygems
2
+
3
+ gem 'ghostbuster', :path => '../..'
4
+ gem 'thin'
5
+ gem 'sinatra'
6
+ gem 'rake'
@@ -0,0 +1,4 @@
1
+ ghost.pattern = "test_*.{coffee,js}"
2
+ ghost.take_screenshots! # or do_not_takescreenshots! defaults to true
3
+ ghost.screenshot_dir = '.'
4
+ ghost.screenshot_dimensions 800, 2000
@@ -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
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ source ../server1/start.sh
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ source ../server1/stop.sh
@@ -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: 31
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 4
10
- version: 0.2.4
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-08-31 00:00:00 -07:00
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
- - log/thin.log
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