class RSpec::Core::Bisect::Runner

Provides an API to run the suite for a set of locations, using the given bisect server to capture the results. @private

Constants

RUBY

Path to the currently running Ruby executable, borrowed from Rake: github.com/ruby/rake/blob/v10.4.2/lib/rake/file_utils.rb#L8-L12 Note that we skip `ENV` because we don't have to deal with running RSpec from within a MRI source repository: github.com/ruby/rake/commit/968682759b3b65e42748cd2befb2ff3e982272d9

Attributes

original_cli_args[R]

Public Class Methods

new(server, original_cli_args) click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 13
def initialize(server, original_cli_args)
  @server            = server
  @original_cli_args = original_cli_args.reject { |arg| arg.start_with?("--bisect") }
end

Public Instance Methods

command_for(locations) click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 22
def command_for(locations)
  parts = []

  parts << RUBY << load_path
  parts << open3_safe_escape(RSpec::Core.path_to_executable)

  parts << "--format"   << "bisect"
  parts << "--drb-port" << @server.drb_port
  parts.concat reusable_cli_options
  parts.concat locations.map { |l| open3_safe_escape(l) }

  parts.join(" ")
end
original_results() click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 46
def original_results
  @original_results ||= run_locations(original_locations)
end
repro_command_from(locations) click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 36
def repro_command_from(locations)
  parts = []

  parts << "rspec"
  parts.concat Formatters::Helpers.organize_ids(locations)
  parts.concat original_cli_args_without_locations

  parts.join(" ")
end
run(locations) click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 18
def run(locations)
  run_locations(locations, original_results.failed_example_ids)
end

Private Instance Methods

load_path() click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 123
def load_path
  @load_path ||= "-I#{$LOAD_PATH.map { |p| open3_safe_escape(p) }.join(':')}"
end
original_cli_args_without_locations() click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 108
def original_cli_args_without_locations
  @original_cli_args_without_locations ||= begin
    files_or_dirs = parsed_original_cli_options.fetch(:files_or_directories_to_run)
    @original_cli_args - files_or_dirs
  end
end
original_locations() click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 119
def original_locations
  parsed_original_cli_options.fetch(:files_or_directories_to_run)
end
parsed_original_cli_options() click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 115
def parsed_original_cli_options
  @parsed_original_cli_options ||= Parser.parse(@original_cli_args)
end
reusable_cli_options() click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 91
def reusable_cli_options
  @reusable_cli_options ||= begin
    opts = original_cli_args_without_locations

    if (port = parsed_original_cli_options[:drb_port])
      opts -= %W[ --drb-port #{port} ]
    end

    parsed_original_cli_options.fetch(:formatters) { [] }.each do |(name, out)|
      opts -= %W[ --format #{name} -f -f#{name} ]
      opts -= %W[ --out #{out} -o -o#{out} ]
    end

    opts
  end
end
run_command(cmd) click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 72
def run_command(cmd)
  Open3.capture2e(cmd).first
end
run_locations(locations, *capture_args) click to toggle source
# File lib/rspec/core/bisect/runner.rb, line 63
def run_locations(locations, *capture_args)
  @server.capture_run_results(*capture_args) do
    run_command command_for(locations)
  end
end