/usr/lib/ruby/vendor_ruby/rspec/core/configuration_options.rb is in ruby-rspec-core 3.7.0c1e0m0s1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | require 'erb'
require 'shellwords'
module RSpec
module Core
# Responsible for utilizing externally provided configuration options,
# whether via the command line, `.rspec`, `~/.rspec`, `.rspec-local`
# or a custom options file.
class ConfigurationOptions
# @param args [Array<String>] command line arguments
def initialize(args)
@args = args.dup
organize_options
end
# Updates the provided {Configuration} instance based on the provided
# external configuration options.
#
# @param config [Configuration] the configuration instance to update
def configure(config)
process_options_into config
configure_filter_manager config.filter_manager
load_formatters_into config
end
# @api private
# Updates the provided {FilterManager} based on the filter options.
# @param filter_manager [FilterManager] instance to update
def configure_filter_manager(filter_manager)
@filter_manager_options.each do |command, value|
filter_manager.__send__ command, value
end
end
# @return [Hash] the final merged options, drawn from all external sources
attr_reader :options
# @return [Array<String>] the original command-line arguments
attr_reader :args
private
def organize_options
@filter_manager_options = []
@options = (file_options << command_line_options << env_options).each do |opts|
@filter_manager_options << [:include, opts.delete(:inclusion_filter)] if opts.key?(:inclusion_filter)
@filter_manager_options << [:exclude, opts.delete(:exclusion_filter)] if opts.key?(:exclusion_filter)
end
@options = @options.inject(:libs => [], :requires => []) do |hash, opts|
hash.merge(opts) do |key, oldval, newval|
[:libs, :requires].include?(key) ? oldval + newval : newval
end
end
end
UNFORCED_OPTIONS = Set.new([
:requires, :profile, :drb, :libs, :files_or_directories_to_run,
:full_description, :full_backtrace, :tty
])
UNPROCESSABLE_OPTIONS = Set.new([:formatters])
def force?(key)
!UNFORCED_OPTIONS.include?(key)
end
def order(keys)
OPTIONS_ORDER.reverse_each do |key|
keys.unshift(key) if keys.delete(key)
end
keys
end
OPTIONS_ORDER = [
# It's important to set this before anything that might issue a
# deprecation (or otherwise access the reporter).
:deprecation_stream,
# load paths depend on nothing, but must be set before `requires`
# to support load-path-relative requires.
:libs,
# `files_or_directories_to_run` uses `default_path` so it must be
# set before it.
:default_path, :only_failures,
# These must be set before `requires` to support checking
# `config.files_to_run` from within `spec_helper.rb` when a
# `-rspec_helper` option is used.
:files_or_directories_to_run, :pattern, :exclude_pattern,
# Necessary so that the `--seed` option is applied before requires,
# in case required files do something with the provided seed.
# (such as seed global randomization with it).
:order,
# In general, we want to require the specified files as early as
# possible. The `--require` option is specifically intended to allow
# early requires. For later requires, they can just put the require in
# their spec files, but `--require` provides a unique opportunity for
# users to instruct RSpec to load an extension file early for maximum
# flexibility.
:requires
]
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
def load_formatters_into(config)
options[:formatters].each { |pair| config.add_formatter(*pair) } if options[:formatters]
end
def file_options
custom_options_file ? [custom_options] : [global_options, project_options, local_options]
end
def env_options
return {} unless ENV['SPEC_OPTS']
parse_args_ignoring_files_or_dirs_to_run(
Shellwords.split(ENV["SPEC_OPTS"]),
"ENV['SPEC_OPTS']"
)
end
def command_line_options
@command_line_options ||= Parser.parse(@args)
end
def custom_options
options_from(custom_options_file)
end
def local_options
@local_options ||= options_from(local_options_file)
end
def project_options
@project_options ||= options_from(project_options_file)
end
def global_options
@global_options ||= options_from(global_options_file)
end
def options_from(path)
args = args_from_options_file(path)
parse_args_ignoring_files_or_dirs_to_run(args, path)
end
def parse_args_ignoring_files_or_dirs_to_run(args, source)
options = Parser.parse(args, source)
options.delete(:files_or_directories_to_run)
options
end
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
def options_file_as_erb_string(path)
ERB.new(File.read(path), nil, '-').result(binding)
end
def custom_options_file
command_line_options[:custom_options_file]
end
def project_options_file
"./.rspec"
end
def local_options_file
"./.rspec-local"
end
def global_options_file
File.join(File.expand_path("~"), ".rspec")
rescue ArgumentError
# :nocov:
RSpec.warning "Unable to find ~/.rspec because the HOME environment variable is not set"
nil
# :nocov:
end
end
end
end
|