Class: RSpec::Core::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/core/runner.rb

Constant Summary

AT_EXIT_HOOK_BACKTRACE_LINE =
"#{__FILE__}:#{__LINE__ - 2}:in `autorun'"

Class Method Summary (collapse)

Class Method Details

+ (Object) autorun

Register an at_exit hook that runs the suite.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/rspec/core/runner.rb', line 6

def self.autorun
  return if autorun_disabled? || installed_at_exit? || running_in_drb?
  at_exit do
    # Don't bother running any specs and just let the program terminate
    # if we got here due to an unrescued exception (anything other than
    # SystemExit, which is raised when somebody calls Kernel#exit).
    next unless $!.nil? || $!.kind_of?(SystemExit)

    # We got here because either the end of the program was reached or
    # somebody called Kernel#exit.  Run the specs and then override any
    # existing exit status with RSpec's exit status if any specs failed.
    status = run(ARGV, $stderr, $stdout).to_i
    exit status if status != 0
  end
  @installed_at_exit = true
end

+ (Boolean) autorun_disabled?

Returns:

  • (Boolean)


28
29
30
# File 'lib/rspec/core/runner.rb', line 28

def self.autorun_disabled?
  @autorun_disabled ||= false
end

+ (Object) disable_autorun!



24
25
26
# File 'lib/rspec/core/runner.rb', line 24

def self.disable_autorun!
  @autorun_disabled = true
end

+ (Boolean) installed_at_exit?

Returns:

  • (Boolean)


32
33
34
# File 'lib/rspec/core/runner.rb', line 32

def self.installed_at_exit?
  @installed_at_exit ||= false
end

+ (Object) run(args, err = $stderr, out = $stdout)

Run a suite of RSpec examples.

This is used internally by RSpec to run a suite, but is available for use by any other automation tool.

If you want to run this multiple times in the same process, and you want files like spec_helper.rb to be reloaded, be sure to load load instead of require.

Parameters

  • +args+ - an array of command-line-supported arguments
  • +err+ - error stream (Default: $stderr)
  • +out+ - output stream (Default: $stdout)

Returns

  • +Fixnum+ - exit status code (0/1)


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/rspec/core/runner.rb', line 66

def self.run(args, err=$stderr, out=$stdout)
  trap_interrupt
  options = ConfigurationOptions.new(args)
  options.parse_options

  if options.options[:drb]
    require 'rspec/core/drb_command_line'
    begin
      DRbCommandLine.new(options).run(err, out)
    rescue DRb::DRbConnError
      err.puts "No DRb server is running. Running in local process instead ..."
      CommandLine.new(options).run(err, out)
    end
  else
    CommandLine.new(options).run(err, out)
  end
ensure
  RSpec.reset
end

+ (Boolean) running_in_drb?

Returns:

  • (Boolean)


36
37
38
39
40
# File 'lib/rspec/core/runner.rb', line 36

def self.running_in_drb?
  defined?(DRb) &&
  (DRb.current_server rescue false) &&
   DRb.current_server.uri =~ /druby\:\/\/127.0.0.1\:/
end

+ (Object) trap_interrupt



42
43
44
45
46
47
48
# File 'lib/rspec/core/runner.rb', line 42

def self.trap_interrupt
  trap('INT') do
    exit!(1) if RSpec.wants_to_quit
    RSpec.wants_to_quit = true
    STDERR.puts "\nExiting... Interrupt again to exit immediately."
  end
end