timcharper-spork 0.5.10 → 0.6.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.
@@ -68,6 +68,7 @@ Feature: Rails Integration
68
68
 
69
69
 
70
70
  Scenario: Running spork with a rails app and a non-standard port
71
+ Given this scenario is pending until rspec releases a version that supports --port
71
72
  Given a file named "spec/did_it_work_spec.rb" with:
72
73
  """
73
74
  describe "Did it work?" do
@@ -0,0 +1,3 @@
1
+ Given /^this scenario is pending.+/ do
2
+ pending
3
+ end
@@ -54,7 +54,7 @@ class Spork::AppFramework
54
54
 
55
55
  # Abstract: The path to the file that loads the project environment, ie config/environment.rb. Returns nil if there is none.
56
56
  def entry_point
57
- raise NotImplemented
57
+ raise NotImplementedError
58
58
  end
59
59
 
60
60
  def preload(&block)
@@ -0,0 +1,30 @@
1
+ class Spork::RunStrategy::Forking < Spork::RunStrategy
2
+ def self.available?
3
+ Kernel.respond_to?(:fork)
4
+ end
5
+
6
+ def run(argv, stderr, stdout)
7
+ abort if running?
8
+
9
+ @child = ::Spork::Forker.new do
10
+ $stdout, $stderr = stdout, stderr
11
+ load test_framework.helper_file
12
+ Spork.exec_each_run
13
+ test_framework.run_tests(argv, stderr, stdout)
14
+ end
15
+ @child.result
16
+ end
17
+
18
+ def abort
19
+ @child && @child.abort
20
+ end
21
+
22
+ def preload
23
+ test_framework.preload
24
+ end
25
+
26
+ def running?
27
+ @child && @child.running?
28
+ end
29
+
30
+ end
@@ -0,0 +1,40 @@
1
+ class Spork::RunStrategy
2
+ attr_reader :test_framework
3
+ @@run_strategies = []
4
+
5
+ def initialize(test_framework)
6
+ @test_framework = test_framework
7
+ end
8
+
9
+ def preload
10
+ raise NotImplementedError
11
+ end
12
+
13
+ def run(argv, input, output)
14
+ raise NotImplementedError
15
+ end
16
+
17
+ def cleanup
18
+ raise NotImplementedError
19
+ end
20
+
21
+ def running?
22
+ raise NotImplementedError
23
+ end
24
+
25
+ def abort
26
+ raise NotImplementedError
27
+ end
28
+
29
+ protected
30
+ def self.factory(test_framework)
31
+ Spork::RunStrategy::Forking.new(test_framework)
32
+ end
33
+
34
+ def self.inherited(subclass)
35
+ @@run_strategies << subclass
36
+ end
37
+
38
+ end
39
+
40
+ Dir[File.dirname(__FILE__) + "/run_strategy/*.rb"].each { |file| require file }
data/lib/spork/runner.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'optparse'
2
2
  require 'spork/server'
3
+ require 'spork/test_framework'
4
+ require 'spork/run_strategy'
3
5
 
4
6
  module Spork
5
7
  # This is used by bin/spork. It's wrapped in a class because it's easier to test that way.
6
8
  class Runner
7
- attr_reader :server
9
+ attr_reader :test_framework
8
10
 
9
11
  def self.run(args, output, error)
10
12
  self.new(args, output, error).run
@@ -30,74 +32,49 @@ module Spork
30
32
  if @options[:help]
31
33
  @output.puts opt
32
34
  @output.puts
33
- @output.puts supported_servers_text
35
+ @output.puts supported_test_frameworks_text
34
36
  exit(0)
35
37
  end
36
38
  end
37
39
 
38
- def supported_servers_text
40
+ def supported_test_frameworks_text
39
41
  text = StringIO.new
40
42
 
41
43
  text.puts "Supported test frameworks:"
42
- text.puts Spork::Server.supported_servers.sort { |a,b| a.server_name <=> b.server_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.server_name }
44
+ text.puts Spork::TestFramework.supported_test_frameworks.sort { |a,b| a.short_name <=> b.short_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.short_name }
43
45
  text.puts "\nLegend: ( ) - not detected in project (*) - detected\n"
44
46
  text.string
45
47
  end
46
48
 
47
49
  # Returns a server for the specified (or the detected default) testing framework. Returns nil if none detected, or if the specified is not supported or available.
48
- def find_server
49
- if options[:server_matcher]
50
- @server = Spork::Server.supported_servers(options[:server_matcher]).first
51
- unless @server
52
- @error.puts <<-ERROR
53
- #{options[:server_matcher].inspect} didn't match a supported test framework.
54
-
55
- #{supported_servers_text}
56
- ERROR
57
- return
58
- end
59
-
60
- unless @server.available?
61
- @error.puts <<-USEFUL_ERROR
62
- I can't find the helper file #{@server.helper_file} for the #{@server.server_name} testing framework.
63
- Are you running me from the project directory?
64
- USEFUL_ERROR
65
- return
66
- end
67
- else
68
- @server = Spork::Server.available_servers.first
69
- if @server.nil?
70
- @error.puts <<-USEFUL_ERROR
71
- I can't find any testing frameworks to use.
72
- Are you running me from a project directory?
73
- USEFUL_ERROR
74
- return
75
- end
76
- end
77
- @server
50
+ def find_test_framework
51
+ Spork::TestFramework.factory(@output, @error, options[:server_matcher])
52
+ rescue Spork::TestFramework::NoFrameworksAvailable => e
53
+ @error.puts e.message
54
+ rescue Spork::TestFramework::FactoryException => e
55
+ @error.puts "#{e.message}\n\n#{supported_test_frameworks_text}"
78
56
  end
79
57
 
80
58
  def run
81
- return false unless find_server
59
+ return false unless test_framework = find_test_framework
82
60
  ENV["DRB"] = 'true'
83
- @error.puts "Using #{server.server_name}"
61
+ @error.puts "Using #{test_framework.short_name}"
84
62
  @error.flush
85
63
 
86
- server.port = options[:port]
87
-
88
64
  case
89
65
  when options[:bootstrap]
90
- server.bootstrap
66
+ test_framework.bootstrap
91
67
  when options[:diagnose]
92
68
  require 'spork/diagnoser'
93
69
 
94
- Spork::Diagnoser.install_hook!(server.entry_point)
95
- server.preload
70
+ Spork::Diagnoser.install_hook!(test_framework.entry_point)
71
+ test_framework.preload
96
72
  Spork::Diagnoser.output_results(@output)
97
73
  return true
98
74
  else
99
- return(false) unless server.preload
100
- server.run
75
+ run_strategy = Spork::RunStrategy.factory(test_framework)
76
+ return(false) unless run_strategy.preload
77
+ Spork::Server.run(:port => @options[:port] || test_framework.default_port, :run_strategy => run_strategy)
101
78
  return true
102
79
  end
103
80
  end
data/lib/spork/server.rb CHANGED
@@ -8,78 +8,16 @@ require 'spork/app_framework.rb'
8
8
  #
9
9
  # (This was originally based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate)
10
10
  class Spork::Server
11
- @@supported_servers = []
12
-
13
- LOAD_PREFERENCE = ['RSpec', 'Cucumber']
14
- BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
15
-
11
+ attr_reader :run_strategy
16
12
  include Spork::CustomIOStreams
17
13
 
18
- # Abstract method: returns the servers port. Override this to return the port that should be used by the test framework.
19
- def self.port
20
- raise NotImplemented
21
- end
22
-
23
- # Abstract method: returns the entry file that loads the testing environment, such as spec/spec_helper.rb.
24
- def self.helper_file
25
- raise NotImplemented
26
- end
27
-
28
- # Convenience method that turns the class name without the namespace
29
- def self.server_name
30
- self.name.gsub('Spork::Server::', '')
14
+ def initialize(options = {})
15
+ @run_strategy = options[:run_strategy]
16
+ @port = options[:port]
31
17
  end
32
18
 
33
- # Returns a list of all testing servers that have detected their testing framework being used in the project.
34
- def self.available_servers
35
- supported_servers.select { |s| s.available? }
36
- end
37
-
38
- # Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
39
- def self.supported_servers(starting_with = nil)
40
- @@supported_servers.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
41
- return @@supported_servers if starting_with.nil?
42
- @@supported_servers.select do |s|
43
- s.server_name.match(/^#{Regexp.escape(starting_with)}/i)
44
- end
45
- end
46
-
47
- # Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
48
- def self.available?
49
- File.exist?(helper_file)
50
- end
51
-
52
- # Used to specify
53
- def self.load_preference_index
54
- LOAD_PREFERENCE.index(server_name) || LOAD_PREFERENCE.length
55
- end
56
-
57
- # Detects if the test helper has been bootstrapped.
58
- def self.bootstrapped?
59
- File.read(helper_file).include?("Spork.prefork")
60
- end
61
-
62
- # Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
63
- def self.bootstrap
64
- if bootstrapped?
65
- stderr.puts "Already bootstrapped!"
66
- return
67
- end
68
- stderr.puts "Bootstrapping #{helper_file}."
69
- contents = File.read(helper_file)
70
- bootstrap_code = File.read(BOOTSTRAP_FILE)
71
- File.open(helper_file, "wb") do |f|
72
- f.puts bootstrap_code
73
- f.puts contents
74
- end
75
-
76
- stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
77
- true
78
- end
79
-
80
- def self.run
81
- return unless available?
82
- new.listen
19
+ def self.run(options = {})
20
+ new(options).listen
83
21
  end
84
22
 
85
23
  # Sets up signals and starts the DRb service. If it's successful, it doesn't return. Not ever. You don't need to override this.
@@ -93,18 +31,8 @@ class Spork::Server
93
31
  DRb.thread.join
94
32
  end
95
33
 
96
- def port
97
- self.class.instance_variable_get("@port") || self.class.port
98
- end
34
+ attr_accessor :port
99
35
 
100
- def self.port= p
101
- @port = p
102
- end
103
-
104
- def helper_file
105
- self.class.helper_file
106
- end
107
-
108
36
  # This is the public facing method that is served up by DRb. To use it from the client side (in a testing framework):
109
37
  #
110
38
  # DRb.start_service("druby://localhost:0") # this allows Ruby to do some magical stuff so you can pass an output stream over DRb.
@@ -114,66 +42,10 @@ class Spork::Server
114
42
  #
115
43
  # When implementing a test server, don't override this method: override run_tests instead.
116
44
  def run(argv, stderr, stdout)
117
- abort if running?
118
-
119
- @child = ::Spork::Forker.new do
120
- $stdout, $stderr = stdout, stderr
121
- Spork.exec_each_run { load helper_file }
122
- run_tests(argv, stderr, stdout)
123
- end
124
- @child.result
45
+ run_strategy.run(argv, stderr, stdout)
125
46
  end
126
47
 
127
- # returns whether or not the child (a test run) is running right now.
128
- def running?
129
- @child && @child.running?
130
- end
131
-
132
- protected
133
- # Abstract method: here is where the server runs the tests.
134
- def run_tests(argv, input, output)
135
- raise NotImplemented
136
- end
137
-
138
48
  private
139
- def self.inherited(subclass)
140
- @@supported_servers << subclass
141
- end
142
-
143
- def self.framework
144
- @framework ||= Spork::AppFramework.detect_framework
145
- end
146
-
147
- def self.entry_point
148
- bootstrapped? ? helper_file : framework.entry_point
149
- end
150
-
151
- def self.preload
152
- Spork.exec_prefork do
153
- unless bootstrapped?
154
- stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
155
- stderr.flush
156
-
157
- if framework.bootstrap_required?
158
- stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
159
- stderr.flush
160
- return false
161
- else
162
- load(framework.entry_point)
163
- end
164
- end
165
-
166
- framework.preload do
167
- if bootstrapped?
168
- stderr.puts "Loading Spork.prefork block..."
169
- stderr.flush
170
- load(helper_file)
171
- end
172
- end
173
- end
174
- true
175
- end
176
-
177
49
  def restart
178
50
  stderr.puts "restarting"
179
51
  stderr.flush
@@ -183,12 +55,8 @@ class Spork::Server
183
55
  exec(command_line)
184
56
  end
185
57
 
186
- def abort
187
- @child && @child.abort
188
- end
189
-
190
58
  def sig_int_received
191
- if running?
59
+ if run_strategy.running?
192
60
  abort
193
61
  stderr.puts "Running tests stopped. Press CTRL-C again to stop the server."
194
62
  stderr.flush
@@ -197,5 +65,3 @@ class Spork::Server
197
65
  end
198
66
  end
199
67
  end
200
-
201
- Dir[File.dirname(__FILE__) + "/server/*.rb"].each { |file| require file }
@@ -0,0 +1,24 @@
1
+ class Spork::TestFramework::Cucumber < Spork::TestFramework
2
+ DEFAULT_PORT = 8990
3
+ HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
4
+
5
+ class << self
6
+ # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
7
+ attr_accessor :mother_object
8
+ end
9
+
10
+ def preload
11
+ require 'cucumber'
12
+ begin
13
+ @step_mother = ::Cucumber::StepMother.new
14
+ @step_mother.load_programming_language('rb')
15
+ rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR PRE-0.4 IS DROPPED
16
+ @step_mother = Spork::Server::Cucumber.mother_object
17
+ end
18
+ super
19
+ end
20
+
21
+ def run_tests(argv, stderr, stdout)
22
+ ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(@step_mother)
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class Spork::TestFramework::RSpec < Spork::TestFramework
2
+ DEFAULT_PORT = 8989
3
+ HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
4
+
5
+ def run_tests(argv, stderr, stdout)
6
+ ::Spec::Runner::CommandLine.run(
7
+ ::Spec::Runner::OptionParser.parse(
8
+ argv,
9
+ stderr,
10
+ stdout
11
+ )
12
+ )
13
+ end
14
+ end
@@ -0,0 +1,167 @@
1
+ class Spork::TestFramework
2
+ LOAD_PREFERENCE = ['RSpec', 'Cucumber']
3
+ BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
4
+
5
+ @@supported_test_frameworks = []
6
+ attr_reader :stdout, :stderr
7
+
8
+ class FactoryException < Exception; end
9
+
10
+ class NoFrameworksAvailable < FactoryException
11
+ def message
12
+ "I can't find any testing frameworks to use. Are you running me from a project directory?"
13
+ end
14
+ end
15
+
16
+ class FrameworkNotAvailable < FactoryException
17
+ def initialize(framework)
18
+ @framework = framework
19
+ end
20
+
21
+ def message
22
+ "I can't find the file #{e.test_framework.helper_file} for the #{e.test_framework.short_name} testing framework.\nAre you running me from the project directory?"
23
+ end
24
+ end
25
+
26
+ class NoFrameworkMatched < FactoryException
27
+ def initialize(beginning_with)
28
+ @beginning_with = beginning_with
29
+ end
30
+
31
+ def message
32
+ "Couldn't find a supported test framework that begins with '#{@beginning_with}'"
33
+ end
34
+ end
35
+
36
+ def initialize(stdout = STDOUT, stderr = STDERR)
37
+ @stdout, @stderr = stdout, stderr
38
+ end
39
+
40
+ def self.factory(output = STDOUT, error = STDERR, beginning_with = nil)
41
+ if beginning_with
42
+ @klass = supported_test_frameworks(beginning_with).first
43
+ raise(NoFrameworkMatched.new(beginning_with)) if @klass.nil?
44
+ raise(FrameworkNotAvailable.new(@klass)) unless @klass.available?
45
+ else
46
+ @klass = available_test_frameworks.first
47
+ raise(NoFrameworksAvailable.new) unless @klass
48
+ end
49
+ @klass.new(output, error)
50
+ end
51
+
52
+ def self.helper_file
53
+ self::HELPER_FILE
54
+ end
55
+
56
+ def self.default_port
57
+ (ENV["#{short_name.upcase}_DRB"] || self::DEFAULT_PORT).to_i
58
+ end
59
+
60
+ def self.short_name
61
+ self.name.gsub('Spork::TestFramework::', '')
62
+ end
63
+
64
+ # Returns a list of all testing servers that have detected their testing framework being used in the project.
65
+ def self.available_test_frameworks
66
+ supported_test_frameworks.select { |s| s.available? }
67
+ end
68
+
69
+ # Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
70
+ def self.supported_test_frameworks(starting_with = nil)
71
+ @@supported_test_frameworks.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
72
+ return @@supported_test_frameworks if starting_with.nil?
73
+ @@supported_test_frameworks.select do |s|
74
+ s.short_name.match(/^#{Regexp.escape(starting_with)}/i)
75
+ end
76
+ end
77
+
78
+ def short_name
79
+ self.class.short_name
80
+ end
81
+
82
+ def helper_file
83
+ self.class.helper_file
84
+ end
85
+
86
+ # Detects if the test helper has been bootstrapped.
87
+ def bootstrapped?
88
+ File.read(helper_file).include?("Spork.prefork")
89
+ end
90
+
91
+ # Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
92
+ def bootstrap
93
+ if bootstrapped?
94
+ stderr.puts "Already bootstrapped!"
95
+ return
96
+ end
97
+ stderr.puts "Bootstrapping #{helper_file}."
98
+ contents = File.read(helper_file)
99
+ bootstrap_code = File.read(BOOTSTRAP_FILE)
100
+ File.open(helper_file, "wb") do |f|
101
+ f.puts bootstrap_code
102
+ f.puts contents
103
+ end
104
+
105
+ stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
106
+ true
107
+ end
108
+
109
+ # Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
110
+ def self.available?
111
+ File.exist?(helper_file)
112
+ end
113
+
114
+ # Used to specify
115
+ def self.load_preference_index
116
+ LOAD_PREFERENCE.index(short_name) || LOAD_PREFERENCE.length
117
+ end
118
+
119
+ def preload
120
+ Spork.exec_prefork do
121
+ unless bootstrapped?
122
+ stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
123
+ stderr.flush
124
+
125
+ if framework.bootstrap_required?
126
+ stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
127
+ stderr.flush
128
+ return false
129
+ else
130
+ load(framework.entry_point)
131
+ end
132
+ end
133
+
134
+ framework.preload do
135
+ if bootstrapped?
136
+ stderr.puts "Loading Spork.prefork block..."
137
+ stderr.flush
138
+ load(helper_file)
139
+ end
140
+ end
141
+ end
142
+ true
143
+ end
144
+
145
+ def run_tests(argv, stderr, stdout)
146
+ raise NotImplementedError
147
+ end
148
+
149
+ def entry_point
150
+ bootstrapped? ? helper_file : framework.entry_point
151
+ end
152
+
153
+ def default_port
154
+ self.class.default_port
155
+ end
156
+
157
+ protected
158
+ def self.inherited(subclass)
159
+ @@supported_test_frameworks << subclass
160
+ end
161
+
162
+ def framework
163
+ @framework ||= Spork::AppFramework.detect_framework
164
+ end
165
+ end
166
+
167
+ Spork.detect_and_require('spork/test_framework/*.rb')
data/lib/spork.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
2
2
  module Spork
3
3
  BINARY = File.expand_path(File.dirname(__FILE__) + '/../bin/spork')
4
- LIBDIR = File.expand_path(File.dirname(__FILE__))
4
+ LIBDIR = File.expand_path("..", File.dirname(__FILE__))
5
5
 
6
6
  class << self
7
7
  # Run a block, during prefork mode. By default, if prefork is called twice in the same file and line number, the supplied block will only be ran once.
@@ -70,6 +70,12 @@ module Spork
70
70
  trap_method((class << klass; self; end), method_name)
71
71
  end
72
72
 
73
+ def detect_and_require(subfolder)
74
+ ([LIBDIR] + Gem.latest_load_paths.grep(/spork/)).uniq.each do |gem_path|
75
+ Dir.glob(File.join(gem_path, subfolder)).each { |file| require file }
76
+ end
77
+ end
78
+
73
79
  private
74
80
  def alias_method_names(method_name, feature)
75
81
  /^(.+?)([\?\!]{0,1})$/.match(method_name.to_s)
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- require 'spec'
3
2
 
4
3
  unless $spec_helper_loaded
5
4
  $spec_helper_loaded = true
@@ -9,7 +8,6 @@ unless $spec_helper_loaded
9
8
 
10
9
  require 'spork'
11
10
  require 'spork/runner.rb'
12
- require 'spork/server.rb'
13
11
  require 'spork/diagnoser.rb'
14
12
  require 'stringio'
15
13
  require 'fileutils'
@@ -34,7 +32,11 @@ unless $spec_helper_loaded
34
32
  File.open(filename, 'wb') { |f| f << contents }
35
33
  end
36
34
  end
37
-
35
+
36
+ def create_helper_file(test_framework = FakeFramework)
37
+ create_file(test_framework.helper_file, "# stub spec helper file")
38
+ end
39
+
38
40
  def in_current_dir(&block)
39
41
  Dir.chdir(current_dir, &block)
40
42
  end
@@ -104,4 +106,6 @@ unless $spec_helper_loaded
104
106
  end
105
107
  end
106
108
  end
109
+
110
+ Dir.glob(File.dirname(__FILE__) + "/support/*.rb").each { |f| require(f) }
107
111
  end
@@ -0,0 +1,38 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Spork::RunStrategy::Forking do
4
+ before(:each) do
5
+ @fake_framework = FakeFramework.new
6
+ @run_strategy = Spork::RunStrategy::Forking.new(@fake_framework)
7
+
8
+ end
9
+
10
+ it "returns the result of the run_tests method from the forked child" do
11
+ create_helper_file
12
+ @fake_framework.stub!(:run_tests).and_return("tests were ran")
13
+ @run_strategy.run("test", STDOUT, STDIN).should == "tests were ran"
14
+ end
15
+
16
+ it "aborts the current running thread when another run is started" do
17
+ create_helper_file
18
+ @fake_framework.wait_time = 0.25
19
+ first_run = Thread.new { @run_strategy.run("test", STDOUT, STDIN).should == nil }
20
+ sleep(0.05)
21
+ @run_strategy.run("test", STDOUT, STDIN).should == true
22
+
23
+ # wait for the first to finish
24
+ first_run.join
25
+ end
26
+
27
+ it "can abort the current run" do
28
+ create_helper_file
29
+ @fake_framework.wait_time = 5
30
+ started_at = Time.now
31
+ first_run = Thread.new { @run_strategy.run("test", STDOUT, STDIN).should == true }
32
+ sleep(0.05)
33
+ @run_strategy.send(:abort)
34
+ sleep(0.01) while @run_strategy.running?
35
+
36
+ (Time.now - started_at).should < @fake_framework.wait_time
37
+ end
38
+ end
@@ -1,60 +1,54 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe Spork::Runner do
4
+ def use_test_server(klass = Spork::TestFramework::RSpec)
5
+ @test_framework = klass.new
6
+ Spork::TestFramework.stub!(:factory).and_return(@test_framework)
7
+ end
8
+
4
9
  before(:each) do
5
10
  @out, @err = StringIO.new, StringIO.new
6
11
  end
7
12
 
8
13
  it "finds a matching server with a prefix" do
9
- Spork::Runner.new(["rs"], @out, @err).find_server.should == Spork::Server::RSpec
14
+ Spork::Runner.new(["rs"], @out, @err).find_test_framework.class.should == Spork::TestFramework::RSpec
10
15
  end
11
16
 
12
17
  it "shows an error message if no matching server was found" do
13
18
  Spork::Runner.new(["argle_bargle"], @out, @err).run.should == false
14
- @err.string.should include(%("argle_bargle" didn't match a supported test framework))
15
- end
16
-
17
- it "defaults to use rspec over cucumber" do
18
- Spork::Server::RSpec.stub!(:available?).and_return(true)
19
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
20
- Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::RSpec
21
- end
22
-
23
- it "defaults to use cucumber when rspec not available" do
24
- Spork::Server::RSpec.stub!(:available?).and_return(false)
25
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
26
- Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::Cucumber
19
+ @err.string.should include(%(Couldn't find a supported test framework that begins with 'argle_bargle'))
27
20
  end
28
21
 
29
22
  it "bootstraps a server when -b is passed in" do
30
- Spork::Server::RSpec.stub!(:available?).and_return(true)
31
- Spork::Server::RSpec.should_receive(:bootstrap).and_return(true)
23
+ use_test_server
24
+ @test_framework.should_receive(:bootstrap)
32
25
  Spork::Runner.new(['rspec', '-b'], @out, @err).run
33
26
  end
34
27
 
35
28
  it "aborts if it can't preload" do
36
- Spork::Server::RSpec.stub!(:available?).and_return(true)
37
- Spork::Server::RSpec.should_receive(:preload).and_return(false)
38
- Spork::Server::RSpec.should_not_receive(:run)
29
+ use_test_server
30
+ @test_framework.should_receive(:preload).and_return(false)
31
+ Spork::Server.should_not_receive(:run)
39
32
  Spork::Runner.new(['rspec'], @out, @err).run
40
33
  end
41
34
 
42
35
  it "runs the server if all is well" do
43
- Spork::Server::RSpec.stub!(:available?).and_return(true)
44
- Spork::Server::RSpec.should_receive(:preload).and_return(true)
45
- Spork::Server::RSpec.should_receive(:run).and_return(true)
36
+ use_test_server
37
+ @test_framework.should_receive(:preload).and_return(true)
38
+ Spork::Server.should_receive(:run)
46
39
  Spork::Runner.new(['rspec'], @out, @err).run
47
40
  @err.string.should include("Using RSpec")
48
41
  end
49
42
 
50
43
  it "outputs a list of supported servers, along with supported asterisk" do
51
- Spork::Server.stub!(:supported_servers).and_return([Spork::Server::RSpec, Spork::Server::Cucumber])
52
- Spork::Server::RSpec.stub!(:available?).and_return(true)
53
- Spork::Server::Cucumber.stub!(:available?).and_return(false)
44
+ Spork::Server.stub!(:supported_test_frameworks).and_return([Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber])
45
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
46
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(false)
54
47
 
55
- Spork::Runner.new(['rspec'], @out, @err).supported_servers_text.should == <<-EOF
48
+ Spork::Runner.new(['rspec'], @out, @err).supported_test_frameworks_text.should == <<-EOF
56
49
  Supported test frameworks:
57
50
  ( ) Cucumber
51
+ ( ) FakeFramework
58
52
  (*) RSpec
59
53
 
60
54
  Legend: ( ) - not detected in project (*) - detected
@@ -1,141 +1,15 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
-
4
- class FakeServer < Spork::Server
5
- attr_accessor :wait_time
6
-
7
- include Spork::TestIOStreams
8
-
9
- def self.helper_file
10
- SPEC_TMP_DIR + "/fake/test_helper.rb"
11
- end
12
-
13
- def self.port
14
- 1000
15
- end
16
-
17
- def run_tests(argv, input, output)
18
- sleep(@wait_time || 0.5)
19
- true
20
- end
21
- end
22
-
23
3
  describe Spork::Server do
24
- describe ".available_servers" do
25
- before(:each) do
26
- Spork::Server.supported_servers.each { |s| s.stub!(:available?).and_return(false) }
27
- end
28
-
29
- it "returns a list of all available servers" do
30
- Spork::Server.available_servers.should == []
31
- Spork::Server::RSpec.stub!(:available?).and_return(true)
32
- Spork::Server.available_servers.should == [Spork::Server::RSpec]
33
- end
34
-
35
- it "returns rspec before cucumber when both are available" do
36
- Spork::Server::RSpec.stub!(:available?).and_return(true)
37
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
38
- Spork::Server.available_servers.should == [Spork::Server::RSpec, Spork::Server::Cucumber]
39
- end
40
- end
41
-
42
- describe ".supported_servers" do
43
- it "returns all defined servers" do
44
- Spork::Server.supported_servers.should include(Spork::Server::RSpec)
45
- Spork::Server.supported_servers.should include(Spork::Server::Cucumber)
46
- end
47
-
48
- it "returns a list of servers matching a case-insensitive prefix" do
49
- Spork::Server.supported_servers("rspec").should == [Spork::Server::RSpec]
50
- Spork::Server.supported_servers("rs").should == [Spork::Server::RSpec]
51
- Spork::Server.supported_servers("cuc").should == [Spork::Server::Cucumber]
52
- end
53
- end
54
-
55
4
  describe "a fake server" do
56
- def create_helper_file
57
- create_file(FakeServer.helper_file, "# stub spec helper file")
58
- end
59
-
60
5
  before(:each) do
61
- @fake = FakeServer.new
62
- end
63
-
64
- it "should be available when the helper_file exists" do
65
- FakeServer.available?.should == false
66
- create_helper_file
67
- FakeServer.available?.should == true
68
- end
69
-
70
- it "has a name" do
71
- FakeServer.server_name.should == "FakeServer"
72
- end
73
-
74
- it "tells if it's testing framework is being used" do
75
- Spork::Server.available_servers.should_not include(FakeServer)
76
- create_helper_file
77
- Spork::Server.available_servers.should include(FakeServer)
78
- end
79
-
80
- it "recognizes if the helper_file has been bootstrapped" do
81
- bootstrap_contents = File.read(FakeServer::BOOTSTRAP_FILE)
82
- File.stub!(:read).with(FakeServer.helper_file).and_return("")
83
- FakeServer.bootstrapped?.should == false
84
- File.stub!(:read).with(FakeServer.helper_file).and_return(bootstrap_contents)
85
- FakeServer.bootstrapped?.should == true
86
- end
87
-
88
- it "bootstraps a file" do
89
- create_helper_file
90
- FakeServer.bootstrap
91
-
92
- $test_stderr.string.should include("Bootstrapping")
93
- $test_stderr.string.should include("Edit")
94
- $test_stderr.string.should include("favorite text editor")
95
-
96
- File.read(FakeServer.helper_file).should include(File.read(FakeServer::BOOTSTRAP_FILE))
6
+ @fake_run_strategy = FakeRunStrategy.new
7
+ @server = Spork::Server.new(:run_strategy => @fake_run_strategy)
97
8
  end
98
-
99
- it "aborts the current running thread when another run is started" do
100
- create_helper_file
101
- @fake.wait_time = 0.25
102
- first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == nil }
103
- sleep(0.05)
104
- @fake.run("test", STDOUT, STDIN).should == true
105
9
 
106
- # wait for the first to finish
107
- first_run.join
108
- end
109
-
110
- it "can abort the current run" do
111
- create_helper_file
112
- @fake.wait_time = 5
113
- started_at = Time.now
114
- first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == true }
115
- sleep(0.05)
116
- @fake.send(:abort)
117
- sleep(0.01) while @fake.running?
118
-
119
- (Time.now - started_at).should < @fake.wait_time
120
- end
121
-
122
- it "returns the result of the run_tests method from the forked child" do
123
- create_helper_file
124
- @fake.stub!(:run_tests).and_return("tests were ran")
125
- @fake.run("test", STDOUT, STDIN).should == "tests were ran"
126
- end
127
-
128
10
  it "accepts a port" do
129
- create_helper_file
130
- @fake.class.port = 12345
131
- @fake.port.should == 12345
132
- end
133
-
134
- it "falls back to a default port" do
135
- create_helper_file
136
- @fake.class.port = nil
137
- @fake.port.should == FakeServer.port
11
+ @server.port = 12345
12
+ @server.port.should == 12345
138
13
  end
139
-
140
14
  end
141
15
  end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + "/../test_framework_spec"
3
+
4
+ describe Spork::TestFramework::Cucumber do
5
+ before(:each) do
6
+ @klass = Spork::TestFramework::Cucumber
7
+ @server = @klass.new
8
+ end
9
+
10
+ it_should_behave_like "a TestFramework"
11
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + "/../test_framework_spec"
3
+
4
+ describe Spork::TestFramework::RSpec do
5
+ before(:each) do
6
+ @klass = Spork::TestFramework::RSpec
7
+ end
8
+
9
+ it_should_behave_like "a TestFramework"
10
+ end
@@ -0,0 +1,114 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "a TestFramework", :shared => true do
4
+ describe ".default_port" do
5
+ it "uses the DEFAULT_PORT when the environment variable is not set" do
6
+ @klass.default_port.should == @klass::DEFAULT_PORT
7
+ end
8
+
9
+ it 'uses ENV["#{short_name.upcase}_DRB"] as port if present' do
10
+ env_name = "#{@klass.short_name.upcase}_DRB"
11
+ orig, ENV[env_name] = ENV[env_name], "9000"
12
+ begin
13
+ @klass.default_port.should == 9000
14
+ ensure
15
+ ENV[env_name] = orig
16
+ end
17
+ end
18
+ end
19
+
20
+ describe ".helper_file" do
21
+ it "returns ::HELPER_FILE for the TestFramework" do
22
+ @klass.helper_file.should == @klass::HELPER_FILE
23
+ end
24
+ end
25
+ end
26
+
27
+ describe Spork::TestFramework do
28
+
29
+ before(:each) do
30
+ @fake = FakeFramework.new
31
+ end
32
+
33
+ describe ".available_test_frameworks" do
34
+ before(:each) do
35
+ Spork::TestFramework.supported_test_frameworks.each { |s| s.stub!(:available?).and_return(false) }
36
+ end
37
+
38
+ it "returns a list of all available servers" do
39
+ Spork::TestFramework.available_test_frameworks.should == []
40
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
41
+ Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec]
42
+ end
43
+
44
+ it "returns rspec before cucumber when both are available" do
45
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
46
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
47
+ Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber]
48
+ end
49
+ end
50
+
51
+ describe ".supported_test_frameworks" do
52
+ it "returns all defined servers" do
53
+ Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::RSpec)
54
+ Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::Cucumber)
55
+ end
56
+
57
+ it "returns a list of servers matching a case-insensitive prefix" do
58
+ Spork::TestFramework.supported_test_frameworks("rspec").should == [Spork::TestFramework::RSpec]
59
+ Spork::TestFramework.supported_test_frameworks("rs").should == [Spork::TestFramework::RSpec]
60
+ Spork::TestFramework.supported_test_frameworks("cuc").should == [Spork::TestFramework::Cucumber]
61
+ end
62
+ end
63
+
64
+ describe ".short_name" do
65
+ it "returns the name of the framework, without the namespace prefix" do
66
+ Spork::TestFramework::Cucumber.short_name.should == "Cucumber"
67
+ end
68
+ end
69
+
70
+ describe ".available?" do
71
+ it "returns true when the helper_file exists" do
72
+ FakeFramework.available?.should == false
73
+ create_helper_file(FakeFramework)
74
+ FakeFramework.available?.should == true
75
+ end
76
+ end
77
+
78
+ describe ".bootstrapped?" do
79
+ it "recognizes if the helper_file has been bootstrapped" do
80
+ bootstrap_contents = File.read(FakeFramework::BOOTSTRAP_FILE)
81
+ File.stub!(:read).with(@fake.helper_file).and_return("")
82
+ @fake.bootstrapped?.should == false
83
+ File.stub!(:read).with(@fake.helper_file).and_return(bootstrap_contents)
84
+ @fake.bootstrapped?.should == true
85
+ end
86
+ end
87
+
88
+ describe ".bootstrap" do
89
+ it "bootstraps a file" do
90
+ create_helper_file
91
+ @fake.bootstrap
92
+
93
+ $test_stderr.string.should include("Bootstrapping")
94
+ $test_stderr.string.should include("Edit")
95
+ $test_stderr.string.should include("favorite text editor")
96
+
97
+ File.read(@fake.helper_file).should include(File.read(FakeFramework::BOOTSTRAP_FILE))
98
+ end
99
+ end
100
+
101
+ describe ".factory" do
102
+ it "defaults to use rspec over cucumber" do
103
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
104
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
105
+ Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::RSpec
106
+ end
107
+
108
+ it "defaults to use cucumber when rspec not available" do
109
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(false)
110
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
111
+ Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::Cucumber
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,15 @@
1
+ class FakeFramework < Spork::TestFramework
2
+ include Spork::TestIOStreams
3
+
4
+ attr_accessor :wait_time
5
+ DEFAULT_PORT = 1000
6
+
7
+ def self.helper_file
8
+ SPEC_TMP_DIR + "/fake/test_helper.rb"
9
+ end
10
+
11
+ def run_tests(argv, input, output)
12
+ sleep(@wait_time || 0.5)
13
+ true
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ class FakeRunStrategy < Spork::RunStrategy
2
+ def initialize(*args)
3
+ end
4
+
5
+ def self.available?
6
+ true
7
+ end
8
+
9
+ def run(argv, stderr, stdout)
10
+ sleep(@wait_time || 0.5)
11
+ true
12
+ end
13
+
14
+ def running?
15
+ false
16
+ end
17
+
18
+ def preload
19
+ true
20
+ end
21
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timcharper-spork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.10
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Harper
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-31 00:00:00 -07:00
12
+ date: 2009-09-12 00:00:00 -07:00
13
13
  default_executable: spork
14
14
  dependencies: []
15
15
 
@@ -31,6 +31,7 @@ files:
31
31
  - features/diagnostic_mode.feature
32
32
  - features/rails_delayed_loading_workarounds.feature
33
33
  - features/rspec_rails_integration.feature
34
+ - features/steps/general_steps.rb
34
35
  - features/steps/rails_steps.rb
35
36
  - features/steps/sandbox_steps.rb
36
37
  - features/support/env.rb
@@ -45,21 +46,28 @@ files:
45
46
  - lib/spork/custom_io_streams.rb
46
47
  - lib/spork/diagnoser.rb
47
48
  - lib/spork/forker.rb
49
+ - lib/spork/run_strategy.rb
50
+ - lib/spork/run_strategy/forking.rb
48
51
  - lib/spork/runner.rb
49
52
  - lib/spork/server.rb
50
- - lib/spork/server/cucumber.rb
51
- - lib/spork/server/rspec.rb
53
+ - lib/spork/test_framework.rb
54
+ - lib/spork/test_framework/cucumber.rb
55
+ - lib/spork/test_framework/rspec.rb
52
56
  - spec/spec_helper.rb
53
57
  - spec/spork/app_framework/rails_spec.rb
54
58
  - spec/spork/app_framework/unknown_spec.rb
55
59
  - spec/spork/app_framework_spec.rb
56
60
  - spec/spork/diagnoser_spec.rb
57
61
  - spec/spork/forker_spec.rb
62
+ - spec/spork/run_strategy/forking_spec.rb
58
63
  - spec/spork/runner_spec.rb
59
- - spec/spork/server/cucumber_spec.rb
60
- - spec/spork/server/rspec_spec.rb
61
64
  - spec/spork/server_spec.rb
65
+ - spec/spork/test_framework/cucumber_spec.rb
66
+ - spec/spork/test_framework/rspec_spec.rb
67
+ - spec/spork/test_framework_spec.rb
62
68
  - spec/spork_spec.rb
69
+ - spec/support/fake_framework.rb
70
+ - spec/support/fake_run_strategy.rb
63
71
  has_rdoc: false
64
72
  homepage: http://github.com/timcharper/spork
65
73
  post_install_message:
@@ -94,8 +102,12 @@ test_files:
94
102
  - spec/spork/app_framework_spec.rb
95
103
  - spec/spork/diagnoser_spec.rb
96
104
  - spec/spork/forker_spec.rb
105
+ - spec/spork/run_strategy/forking_spec.rb
97
106
  - spec/spork/runner_spec.rb
98
- - spec/spork/server/cucumber_spec.rb
99
- - spec/spork/server/rspec_spec.rb
100
107
  - spec/spork/server_spec.rb
108
+ - spec/spork/test_framework/cucumber_spec.rb
109
+ - spec/spork/test_framework/rspec_spec.rb
110
+ - spec/spork/test_framework_spec.rb
101
111
  - spec/spork_spec.rb
112
+ - spec/support/fake_framework.rb
113
+ - spec/support/fake_run_strategy.rb
@@ -1,35 +0,0 @@
1
- require 'cucumber'
2
-
3
- class Spork::Server::Cucumber < Spork::Server
4
- CUCUMBER_PORT = 8990
5
- CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
6
-
7
- class << self
8
- def port
9
- (ENV['CUCUMBER_DRB'] || CUCUMBER_PORT).to_i
10
- end
11
-
12
- def helper_file
13
- CUCUMBER_HELPER_FILE
14
- end
15
-
16
- # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
17
- attr_accessor :step_mother
18
- end
19
-
20
- # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
21
- def step_mother
22
- self.class.step_mother
23
- end
24
-
25
- def run_tests(argv, stderr, stdout)
26
- ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(step_mother)
27
- end
28
- end
29
-
30
- begin
31
- Spork::Server::Cucumber.step_mother = ::Cucumber::StepMother.new
32
- Spork::Server::Cucumber.step_mother.load_programming_language('rb') if defined?(Spork::Server)
33
- rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
34
- Spork::Server::Cucumber.step_mother = self
35
- end
@@ -1,22 +0,0 @@
1
- class Spork::Server::RSpec < Spork::Server
2
- RSPEC_PORT = 8989
3
- RSPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
4
-
5
- def self.port
6
- (ENV['RSPEC_DRB'] || RSPEC_PORT).to_i
7
- end
8
-
9
- def self.helper_file
10
- RSPEC_HELPER_FILE
11
- end
12
-
13
- def run_tests(argv, stderr, stdout)
14
- ::Spec::Runner::CommandLine.run(
15
- ::Spec::Runner::OptionParser.parse(
16
- argv,
17
- stderr,
18
- stdout
19
- )
20
- )
21
- end
22
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe Spork::Server::Cucumber do
4
- before(:each) do
5
- @server = Spork::Server::Cucumber.new
6
- end
7
-
8
- it "uses the CUCUMBER_PORT for it's default port" do
9
- @server.port.should == Spork::Server::Cucumber::CUCUMBER_PORT
10
- end
11
-
12
- it "uses ENV['CUCUMBER_DRB'] as port if present" do
13
- orig = ENV['CUCUMBER_DRB']
14
- begin
15
- ENV['CUCUMBER_DRB'] = "9000"
16
- @server.port.should == 9000
17
- ensure
18
- ENV['CUCUMBER_DRB'] = orig
19
- end
20
- end
21
-
22
- it "uses the CUCUMBER_HELPER_FILE for it's helper_file" do
23
- @server.helper_file.should == Spork::Server::Cucumber::CUCUMBER_HELPER_FILE
24
- end
25
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe Spork::Server::RSpec do
4
- before(:each) do
5
- @server = Spork::Server::RSpec.new
6
- end
7
-
8
- it "uses the RSPEC_PORT for it's default port" do
9
- @server.port.should == Spork::Server::RSpec::RSPEC_PORT
10
- end
11
-
12
- it "uses ENV['RSPEC_DRB'] as port if present" do
13
- orig = ENV['RSPEC_DRB']
14
- begin
15
- ENV['RSPEC_DRB'] = "9000"
16
- @server.port.should == 9000
17
- ensure
18
- ENV['RSPEC_DRB'] = orig
19
- end
20
- end
21
-
22
- it "uses the RSPEC_HELPER_FILE for it's helper_file" do
23
- @server.helper_file.should == Spork::Server::RSpec::RSPEC_HELPER_FILE
24
- end
25
- end