spork 0.4.2 → 0.4.4
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/lib/spork.rb +18 -6
- data/lib/spork/forker.rb +54 -0
- data/lib/spork/server.rb +7 -12
- data/lib/spork/server/cucumber.rb +15 -11
- data/spec/spec_helper.rb +0 -29
- data/spec/spork/forker_spec.rb +36 -0
- data/spec/spork/server/rspec_spec.rb +6 -2
- data/spec/spork/server_spec.rb +8 -1
- data/spec/spork_spec.rb +11 -0
- metadata +5 -2
    
        data/lib/spork.rb
    CHANGED
    
    | @@ -1,17 +1,23 @@ | |
| 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 | 
            -
              SPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
         | 
| 4 | 
            -
              
         | 
| 5 3 | 
             
              class << self
         | 
| 4 | 
            +
                def already_preforked
         | 
| 5 | 
            +
                  @already_preforked ||= []
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
                
         | 
| 8 | 
            +
                def already_run
         | 
| 9 | 
            +
                  @already_run ||= []
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                
         | 
| 6 12 | 
             
                def prefork(&block)
         | 
| 7 | 
            -
                  return if  | 
| 8 | 
            -
                   | 
| 13 | 
            +
                  return if already_preforked.include?(expanded_caller(caller.first))
         | 
| 14 | 
            +
                  already_preforked << expanded_caller(caller.first)
         | 
| 9 15 | 
             
                  yield
         | 
| 10 16 | 
             
                end
         | 
| 11 17 |  | 
| 12 18 | 
             
                def each_run(&block)
         | 
| 13 | 
            -
                  return if @state == :preforking || (@state != :not_using_spork &&  | 
| 14 | 
            -
                   | 
| 19 | 
            +
                  return if @state == :preforking || (@state != :not_using_spork && already_run.include?(expanded_caller(caller.first)))
         | 
| 20 | 
            +
                  already_run << expanded_caller(caller.first)
         | 
| 15 21 | 
             
                  yield
         | 
| 16 22 | 
             
                end
         | 
| 17 23 |  | 
| @@ -36,5 +42,11 @@ module Spork | |
| 36 42 | 
             
                  running!
         | 
| 37 43 | 
             
                  load(helper_file)
         | 
| 38 44 | 
             
                end
         | 
| 45 | 
            +
                
         | 
| 46 | 
            +
                def expanded_caller(caller_line)
         | 
| 47 | 
            +
                  file, line = caller_line.split(":")
         | 
| 48 | 
            +
                  line.gsub(/:.+/, '')
         | 
| 49 | 
            +
                  File.expand_path(Dir.pwd, file) + ":" + line
         | 
| 50 | 
            +
                end
         | 
| 39 51 | 
             
              end
         | 
| 40 52 | 
             
            end
         | 
    
        data/lib/spork/forker.rb
    ADDED
    
    | @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            class Spork::Forker
         | 
| 2 | 
            +
              class ForkDiedException < Exception; end
         | 
| 3 | 
            +
              def initialize(&block)
         | 
| 4 | 
            +
                return unless block_given?
         | 
| 5 | 
            +
                @child_io, @server_io = UNIXSocket.socketpair
         | 
| 6 | 
            +
                @child_pid = Kernel.fork do
         | 
| 7 | 
            +
                  @server_io.close
         | 
| 8 | 
            +
                  Marshal.dump(yield, @child_io)
         | 
| 9 | 
            +
                  # wait for the parent to acknowledge receipt of the result.
         | 
| 10 | 
            +
                  master_response = 
         | 
| 11 | 
            +
                    begin
         | 
| 12 | 
            +
                      Marshal.load(@child_io)
         | 
| 13 | 
            +
                    rescue EOFError
         | 
| 14 | 
            +
                      nil
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                  
         | 
| 17 | 
            +
                  # terminate, skipping any at_exit blocks.
         | 
| 18 | 
            +
                  exit!(0)
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
                @child_io.close
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
              
         | 
| 23 | 
            +
              def result
         | 
| 24 | 
            +
                return unless running?
         | 
| 25 | 
            +
                result_thread = Thread.new do
         | 
| 26 | 
            +
                  begin
         | 
| 27 | 
            +
                    @result = Marshal.load(@server_io)
         | 
| 28 | 
            +
                    Marshal.dump('ACK', @server_io)
         | 
| 29 | 
            +
                  rescue ForkDiedException
         | 
| 30 | 
            +
                    @result = nil
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
                Process.wait(@child_pid)
         | 
| 34 | 
            +
                result_thread.raise(ForkDiedException) if @result.nil?
         | 
| 35 | 
            +
                @child_pid = nil
         | 
| 36 | 
            +
                @result
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
              
         | 
| 39 | 
            +
              def abort
         | 
| 40 | 
            +
                if running?
         | 
| 41 | 
            +
                  Process.kill(Signal.list['TERM'], @child_pid)
         | 
| 42 | 
            +
                  @child_pid = nil
         | 
| 43 | 
            +
                  true
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
              
         | 
| 47 | 
            +
              def running?
         | 
| 48 | 
            +
                return false unless @child_pid
         | 
| 49 | 
            +
                Process.getpgid(@child_pid)
         | 
| 50 | 
            +
                true
         | 
| 51 | 
            +
              rescue Errno::ESRCH
         | 
| 52 | 
            +
                false
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
    
        data/lib/spork/server.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'drb/drb'
         | 
| 2 2 | 
             
            require 'rbconfig'
         | 
| 3 | 
            +
            require 'spork/forker.rb'
         | 
| 3 4 |  | 
| 4 5 | 
             
            # This is based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate
         | 
| 5 6 | 
             
            class Spork::Server
         | 
| @@ -93,19 +94,16 @@ class Spork::Server | |
| 93 94 |  | 
| 94 95 | 
             
              def run(argv, stderr, stdout)
         | 
| 95 96 | 
             
                return false if running?
         | 
| 96 | 
            -
                 | 
| 97 | 
            -
             | 
| 98 | 
            -
                @child_pid = Kernel.fork do
         | 
| 97 | 
            +
                @child = ::Spork::Forker.new do
         | 
| 98 | 
            +
                  $stdout, $stderr = stdout, stderr
         | 
| 99 99 | 
             
                  Spork.exec_each_run(helper_file)
         | 
| 100 100 | 
             
                  run_tests(argv, stderr, stdout)
         | 
| 101 101 | 
             
                end
         | 
| 102 | 
            -
                 | 
| 103 | 
            -
                @child_pid = nil
         | 
| 104 | 
            -
                true
         | 
| 102 | 
            +
                @child.result
         | 
| 105 103 | 
             
              end
         | 
| 106 104 |  | 
| 107 105 | 
             
              def running?
         | 
| 108 | 
            -
                 | 
| 106 | 
            +
                @child && @child.running?
         | 
| 109 107 | 
             
              end
         | 
| 110 108 |  | 
| 111 109 | 
             
              private
         | 
| @@ -140,16 +138,13 @@ class Spork::Server | |
| 140 138 | 
             
                end
         | 
| 141 139 |  | 
| 142 140 | 
             
                def abort
         | 
| 143 | 
            -
                   | 
| 144 | 
            -
                    Process.kill(Signal.list['TERM'], @child_pid)
         | 
| 145 | 
            -
                    true
         | 
| 146 | 
            -
                  end
         | 
| 141 | 
            +
                  @child && @child.abort
         | 
| 147 142 | 
             
                end
         | 
| 148 143 |  | 
| 149 144 | 
             
                def sig_int_received
         | 
| 150 145 | 
             
                  if running?
         | 
| 151 146 | 
             
                    abort
         | 
| 152 | 
            -
                    puts "Running  | 
| 147 | 
            +
                    puts "Running tests stopped.  Press CTRL-C again to stop the server."
         | 
| 153 148 | 
             
                  else
         | 
| 154 149 | 
             
                    exit!(0)
         | 
| 155 150 | 
             
                  end
         | 
| @@ -2,23 +2,27 @@ class Spork::Server::Cucumber < Spork::Server | |
| 2 2 | 
             
              CUCUMBER_PORT = 8990
         | 
| 3 3 | 
             
              CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
         | 
| 4 4 |  | 
| 5 | 
            -
               | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                 | 
| 5 | 
            +
              class << self
         | 
| 6 | 
            +
                def port
         | 
| 7 | 
            +
                  CUCUMBER_PORT
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                def helper_file
         | 
| 11 | 
            +
                  CUCUMBER_HELPER_FILE
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                attr_accessor :step_mother
         | 
| 11 15 | 
             
              end
         | 
| 12 16 |  | 
| 13 | 
            -
              def  | 
| 14 | 
            -
                 | 
| 17 | 
            +
              def step_mother
         | 
| 18 | 
            +
                self.class.step_mother
         | 
| 15 19 | 
             
              end
         | 
| 16 20 |  | 
| 17 21 | 
             
              def run_tests(argv, stderr, stdout)
         | 
| 18 22 | 
             
                require 'cucumber/cli/main'
         | 
| 19 | 
            -
                ::Cucumber::Cli::Main.step_mother =  | 
| 20 | 
            -
                ::Cucumber::Cli::Main.new(argv,  | 
| 23 | 
            +
                ::Cucumber::Cli::Main.step_mother = step_mother
         | 
| 24 | 
            +
                ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(step_mother)
         | 
| 21 25 | 
             
              end
         | 
| 22 26 | 
             
            end
         | 
| 23 27 |  | 
| 24 | 
            -
            Spork::Server::Cucumber.step_mother = self
         | 
| 28 | 
            +
            Spork::Server::Cucumber.step_mother = self
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -1,32 +1,3 @@ | |
| 1 | 
            -
            require 'rubygems'
         | 
| 2 | 
            -
            require 'spork'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            Spork.prefork do
         | 
| 5 | 
            -
              # Loading more in this block will cause your specs to run faster. However, 
         | 
| 6 | 
            -
              # if you change any configuration or code from libraries loaded here, you'll
         | 
| 7 | 
            -
              # need to restart spork for it take effect.
         | 
| 8 | 
            -
              
         | 
| 9 | 
            -
            end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            Spork.each_run do
         | 
| 12 | 
            -
              # This code will be run each time you run your specs.
         | 
| 13 | 
            -
              
         | 
| 14 | 
            -
            end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            # --- Instructions ---
         | 
| 17 | 
            -
            # - Sort through your spec_helper file. Place as much environment loading 
         | 
| 18 | 
            -
            #   code that you don't normally modify during development in the 
         | 
| 19 | 
            -
            #   Spork.prefork block.
         | 
| 20 | 
            -
            # - Place the rest under Spork.each_run block
         | 
| 21 | 
            -
            # - Any code that is left outside of the blocks will be ran during preforking
         | 
| 22 | 
            -
            #   and during each_run!
         | 
| 23 | 
            -
            # - These instructions should self-destruct in 10 seconds.  If they don't,
         | 
| 24 | 
            -
            #   feel free to delete them.
         | 
| 25 | 
            -
            #
         | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 1 | 
             
            require 'rubygems'
         | 
| 31 2 | 
             
            require 'spec'
         | 
| 32 3 |  | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/../spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Spork::Forker do
         | 
| 4 | 
            +
              it "runs a block in a fork" do
         | 
| 5 | 
            +
                @var = "hello world"
         | 
| 6 | 
            +
                Spork::Forker.new { @var = "booyah" }.result
         | 
| 7 | 
            +
                @var.should == "hello world"
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
              
         | 
| 10 | 
            +
              it "returns the result" do
         | 
| 11 | 
            +
                Spork::Forker.new { "results" }.result.should == "results"
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
              
         | 
| 14 | 
            +
              it "reports when the fork is running" do
         | 
| 15 | 
            +
                forker = Spork::Forker.new { sleep 0.1 }
         | 
| 16 | 
            +
                forker.running?.should == true
         | 
| 17 | 
            +
                forker.result
         | 
| 18 | 
            +
                sleep 0.1
         | 
| 19 | 
            +
                forker.running?.should == false
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
              
         | 
| 22 | 
            +
              it "aborts a fork and returns nil for the result" do
         | 
| 23 | 
            +
                started_at = Time.now
         | 
| 24 | 
            +
                ended_at = nil
         | 
| 25 | 
            +
                forker = Spork::Forker.new { sleep 5 }
         | 
| 26 | 
            +
                Thread.new do
         | 
| 27 | 
            +
                  forker.result.should == nil
         | 
| 28 | 
            +
                  ended_at = Time.now
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                sleep 0.5
         | 
| 31 | 
            +
                forker.abort
         | 
| 32 | 
            +
                sleep 0.1
         | 
| 33 | 
            +
                (ended_at - started_at).should be_close(0.5, 0.1)
         | 
| 34 | 
            +
                forker.running?.should == false
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
| @@ -2,10 +2,14 @@ require File.dirname(__FILE__) + '/../../spec_helper' | |
| 2 2 |  | 
| 3 3 | 
             
            describe Spork::Server::RSpec do
         | 
| 4 4 | 
             
              before(:each) do
         | 
| 5 | 
            -
                @ | 
| 5 | 
            +
                @server = Spork::Server::RSpec.new
         | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 8 | 
             
              it "uses the RSPEC_PORT for it's port" do
         | 
| 9 | 
            -
                @ | 
| 9 | 
            +
                @server.port.should == Spork::Server::RSpec::RSPEC_PORT
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
              it "uses the RSPEC_HELPER_FILE for it's helper_file" do
         | 
| 13 | 
            +
                @server.helper_file.should == Spork::Server::RSpec::RSPEC_HELPER_FILE
         | 
| 10 14 | 
             
              end
         | 
| 11 15 | 
             
            end
         | 
    
        data/spec/spork/server_spec.rb
    CHANGED
    
    | @@ -20,6 +20,7 @@ class FakeServer < Spork::Server | |
| 20 20 |  | 
| 21 21 | 
             
              def run_tests(argv, input, output)
         | 
| 22 22 | 
             
                sleep(@wait_time || 0.5)
         | 
| 23 | 
            +
                true
         | 
| 23 24 | 
             
              end
         | 
| 24 25 | 
             
            end
         | 
| 25 26 |  | 
| @@ -119,8 +120,14 @@ describe Spork::Server do | |
| 119 120 | 
             
                  sleep(0.05)
         | 
| 120 121 | 
             
                  @fake.send(:abort)
         | 
| 121 122 | 
             
                  sleep(0.01) while @fake.running?
         | 
| 122 | 
            -
             | 
| 123 | 
            +
                  
         | 
| 123 124 | 
             
                  (Time.now - started_at).should < @fake.wait_time
         | 
| 124 125 | 
             
                end
         | 
| 126 | 
            +
                
         | 
| 127 | 
            +
                it "returns the result of the run_tests method from the forked child" do
         | 
| 128 | 
            +
                  create_helper_file
         | 
| 129 | 
            +
                  @fake.stub!(:run_tests).and_return("tests were ran")
         | 
| 130 | 
            +
                  @fake.run("test", STDOUT, STDIN).should == "tests were ran"
         | 
| 131 | 
            +
                end
         | 
| 125 132 | 
             
              end
         | 
| 126 133 | 
             
            end
         | 
    
        data/spec/spork_spec.rb
    CHANGED
    
    | @@ -41,4 +41,15 @@ describe Spork do | |
| 41 41 | 
             
              it "runs both blocks when Spork not activated" do
         | 
| 42 42 | 
             
                spec_helper_simulator.should == [:prefork, :each_run]
         | 
| 43 43 | 
             
              end
         | 
| 44 | 
            +
              
         | 
| 45 | 
            +
              it "prevents blocks from being ran twice" do
         | 
| 46 | 
            +
                spec_helper_simulator.should == [:prefork, :each_run]
         | 
| 47 | 
            +
                spec_helper_simulator.should == []
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
              
         | 
| 50 | 
            +
              it "runs multiple prefork and each_run blocks at different locations" do
         | 
| 51 | 
            +
                Spork.prefork { }
         | 
| 52 | 
            +
                Spork.each_run { }
         | 
| 53 | 
            +
                spec_helper_simulator.should == [:prefork, :each_run]
         | 
| 54 | 
            +
              end
         | 
| 44 55 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: spork
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.4. | 
| 4 | 
            +
              version: 0.4.4
         | 
| 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- | 
| 12 | 
            +
            date: 2009-06-01 00:00:00 -06:00
         | 
| 13 13 | 
             
            default_executable: spork
         | 
| 14 14 | 
             
            dependencies: []
         | 
| 15 15 |  | 
| @@ -28,11 +28,13 @@ files: | |
| 28 28 | 
             
            - README.rdoc
         | 
| 29 29 | 
             
            - assets/bootstrap.rb
         | 
| 30 30 | 
             
            - lib/spork.rb
         | 
| 31 | 
            +
            - lib/spork/forker.rb
         | 
| 31 32 | 
             
            - lib/spork/runner.rb
         | 
| 32 33 | 
             
            - lib/spork/server.rb
         | 
| 33 34 | 
             
            - lib/spork/server/cucumber.rb
         | 
| 34 35 | 
             
            - lib/spork/server/rspec.rb
         | 
| 35 36 | 
             
            - spec/spec_helper.rb
         | 
| 37 | 
            +
            - spec/spork/forker_spec.rb
         | 
| 36 38 | 
             
            - spec/spork/runner_spec.rb
         | 
| 37 39 | 
             
            - spec/spork/server/rspec_spec.rb
         | 
| 38 40 | 
             
            - spec/spork/server_spec.rb
         | 
| @@ -66,6 +68,7 @@ specification_version: 2 | |
| 66 68 | 
             
            summary: spork
         | 
| 67 69 | 
             
            test_files: 
         | 
| 68 70 | 
             
            - spec/spec_helper.rb
         | 
| 71 | 
            +
            - spec/spork/forker_spec.rb
         | 
| 69 72 | 
             
            - spec/spork/runner_spec.rb
         | 
| 70 73 | 
             
            - spec/spork/server/rspec_spec.rb
         | 
| 71 74 | 
             
            - spec/spork/server_spec.rb
         |