Module: Spork

Defined in:
lib/spork.rb,
lib/spork/runner.rb

Defined Under Namespace

Modules: CustomIOStreams Classes: AppFramework, Diagnoser, Forker, RunStrategy, Runner, Server, TestFramework

Constant Summary collapse

BINARY =
File.expand_path(File.dirname(__FILE__) + '/../bin/spork')
LIBDIR =
File.expand_path("..", File.dirname(__FILE__))

Class Method Summary collapse

Class Method Details

.detect_and_require(subfolder) ⇒ Object



77
78
79
80
81
# File 'lib/spork.rb', line 77

def detect_and_require(subfolder)
  ([LIBDIR] + Gem.latest_load_paths.grep(/spork/)).uniq.each do |gem_path|
    Dir.glob(File.join(gem_path, subfolder)).each { |file| require file }
  end
end

.each_run(prevent_double_run = true, &block) ⇒ Object

Run a block AFTER the fork occurs. By default, if prefork is called twice in the same file and line number, the supplied block will only be ran once.

Parameters

  • prevent_double_run - Pass false to disable double run prevention



22
23
24
25
26
27
28
29
# File 'lib/spork.rb', line 22

def each_run(prevent_double_run = true, &block)
  return if prevent_double_run && already_ran?(caller.first)
  if @state == :using_spork
    each_run_procs << block
  else
    yield
  end
end

.exec_each_run(&block) ⇒ Object

Used by the server. Called to run all of the prefork blocks.



52
53
54
55
56
# File 'lib/spork.rb', line 52

def exec_each_run(&block)
  each_run_procs.each { |p| p.call }
  each_run_procs.clear
  yield if block_given?
end

.exec_prefork(&block) ⇒ Object

Used by the server. Called when loading the prefork blocks of the code.



46
47
48
49
# File 'lib/spork.rb', line 46

def exec_prefork(&block)
  using_spork!
  yield
end

.prefork(prevent_double_run = true, &block) ⇒ Object

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.

Parameters

  • prevent_double_run - Pass false to disable double run prevention



12
13
14
15
# File 'lib/spork.rb', line 12

def prefork(prevent_double_run = true, &block)
  return if prevent_double_run && already_ran?(caller.first)
  yield
end

.stateObject

Used by the server. Returns the current state of Spork.



41
42
43
# File 'lib/spork.rb', line 41

def state
  @state ||= :not_using_spork
end

.trap_class_method(klass, method_name) ⇒ Object

Same as trap_method, but for class methods instead



73
74
75
# File 'lib/spork.rb', line 73

def trap_class_method(klass, method_name)
  trap_method((class << klass; self; end), method_name)
end

.trap_method(klass, method_name) ⇒ Object

Traps an instance method of a class (or module) so any calls to it don’t actually run until Spork.exec_each_run



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/spork.rb', line 59

def trap_method(klass, method_name)
  method_name_without_spork, method_name_with_spork = alias_method_names(method_name, :spork)
  
  klass.class_eval <<-EOF, __FILE__, __LINE__ + 1
    alias :#{method_name_without_spork} :#{method_name} unless method_defined?(:#{method_name_without_spork}) 
    def #{method_name}(*args)
      Spork.each_run(false) do
        #{method_name_without_spork}(*args)
      end
    end
  EOF
end

.using_spork!Object

Used by the server. Sets the state to activate spork. Otherwise, prefork and each_run are run in passive mode, allowing specs without a Spork server.



32
33
34
# File 'lib/spork.rb', line 32

def using_spork!
  @state = :using_spork
end

.using_spork?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/spork.rb', line 36

def using_spork?
  @state == :using_spork
end