class RSpec::Core::ConfigurationOptions

Responsible for utilizing externally provided configuration options, whether via the command line, `.rspec`, `~/.rspec`, `.rspec-local` or a custom options file.

Constants

OPTIONS_ORDER
UNFORCED_OPTIONS
UNPROCESSABLE_OPTIONS

Attributes

options[R]

@return [Hash] the final merged options, drawn from all external sources

Public Class Methods

new(args) click to toggle source

@param args [Array<String>] command line arguments

# File lib/rspec/core/configuration_options.rb, line 12
def initialize(args)
  @args = args.dup
  organize_options
end

Public Instance Methods

configure(config) click to toggle source

Updates the provided {Configuration} instance based on the provided external configuration options.

@param config [Configuration] the configuration instance to update

# File lib/rspec/core/configuration_options.rb, line 21
def configure(config)
  process_options_into config
  configure_filter_manager config.filter_manager
  load_formatters_into config
end
configure_filter_manager(filter_manager) click to toggle source

@api private Updates the provided {FilterManager} based on the filter options. @param filter_manager [FilterManager] instance to update

# File lib/rspec/core/configuration_options.rb, line 30
def configure_filter_manager(filter_manager)
  @filter_manager_inclusions.each { |val| filter_manager.include(val) }
  @filter_manager_exclusions.each { |val| filter_manager.exclude(val) }
end

Private Instance Methods

args_from_options_file(path) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 141
def args_from_options_file(path)
  return [] unless path && File.exist?(path)
  config_string = options_file_as_erb_string(path)
  FlatMap.flat_map(config_string.split(/\n+/), &:shellsplit)
end
command_line_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 117
def command_line_options
  @command_line_options ||= Parser.parse(@args).merge :files_or_directories_to_run => @args
end
custom_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 121
def custom_options
  options_from(custom_options_file)
end
custom_options_file() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 151
def custom_options_file
  command_line_options[:custom_options_file]
end
env_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 113
def env_options
  ENV["SPEC_OPTS"] ? Parser.parse(Shellwords.split(ENV["SPEC_OPTS"])) : {}
end
file_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 109
def file_options
  custom_options_file ? [custom_options] : [global_options, project_options, local_options]
end
force?(key) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 61
def force?(key)
  !UNFORCED_OPTIONS.include?(key)
end
global_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 133
def global_options
  @global_options ||= options_from(global_options_file)
end
global_options_file() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 163
def global_options_file
  begin
    File.join(File.expand_path("~"), ".rspec")
  rescue ArgumentError
    RSpec.warning "Unable to find ~/.rspec because the HOME environment variable is not set"
    nil
  end
end
load_formatters_into(config) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 105
def load_formatters_into(config)
  options[:formatters].each { |pair| config.add_formatter(*pair) } if options[:formatters]
end
local_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 125
def local_options
  @local_options ||= options_from(local_options_file)
end
local_options_file() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 159
def local_options_file
  ".rspec-local"
end
options_file_as_erb_string(path) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 147
def options_file_as_erb_string(path)
  ERB.new(File.read(path), nil, '-').result(binding)
end
options_from(path) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 137
def options_from(path)
  Parser.parse(args_from_options_file(path))
end
order(keys) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 65
def order(keys)
  OPTIONS_ORDER.reverse.each do |key|
    keys.unshift(key) if keys.delete(key)
  end
  keys
end
organize_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 40
def organize_options
  @filter_manager_inclusions = []
  @filter_manager_exclusions = []

  @options = (file_options << command_line_options << env_options).each { |opts|
    @filter_manager_inclusions << opts.delete(:inclusion_filter) if opts.key?(:inclusion_filter)
    @filter_manager_exclusions << opts.delete(:exclusion_filter) if opts.key?(:exclusion_filter)
  }.inject(:libs => [], :requires => []) { |hash, opts|
    hash.merge(opts) { |key, oldval, newval|
      [:libs, :requires].include?(key) ? oldval + newval : newval
    }
  }
end
process_options_into(config) click to toggle source
# File lib/rspec/core/configuration_options.rb, line 97
def process_options_into(config)
  opts = options.reject { |k, _| UNPROCESSABLE_OPTIONS.include? k }

  order(opts.keys).each do |key|
    force?(key) ? config.force(key => opts[key]) : config.__send__("#{key}=", opts[key])
  end
end
project_options() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 129
def project_options
  @project_options ||= options_from(project_options_file)
end
project_options_file() click to toggle source
# File lib/rspec/core/configuration_options.rb, line 155
def project_options_file
  ".rspec"
end