Class: RSpec::Core::Configuration

Inherits:
Object
  • Object
show all
Includes:
Hooks
Defined in:
lib/rspec/core/configuration.rb

Constant Summary collapse

CONDITIONAL_FILTERS =
{
  :if     => lambda { |value, | .has_key?(:if) && !value },
  :unless => lambda { |value| value }
}
DEFAULT_BACKTRACE_PATTERNS =
[
  /\/lib\d*\/ruby\//,
  /bin\//,
  /gems/,
  /spec\/spec_helper\.rb/,
  /lib\/rspec\/(core|expectations|matchers|mocks)/
]

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Hooks

#after, #around, #before, #find_hook, #hooks, #run_hook, #run_hook!, #run_hook_filtered

Methods included from MetadataHashBuilder::Common

#build_metadata_hash_from

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



55
56
57
58
59
60
61
# File 'lib/rspec/core/configuration.rb', line 55

def initialize
  @color_enabled = false
  self.include_or_extend_modules = []
  self.files_to_run = []
  self.backtrace_clean_patterns = DEFAULT_BACKTRACE_PATTERNS.dup
  self.exclusion_filter = CONDITIONAL_FILTERS.dup
end

Class Method Details

.add_setting(name, opts = {}) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
# File 'lib/rspec/core/configuration.rb', line 9

def self.add_setting(name, opts={})
  if opts[:alias]
    alias_method name, opts[:alias]
    alias_method "#{name}=", "#{opts[:alias]}="
    alias_method "#{name}?", "#{opts[:alias]}?"
  else
    define_method("#{name}=") {|val| settings[name] = val}
    define_method(name)       { settings.has_key?(name) ? settings[name] : opts[:default] }
    define_method("#{name}?") { send name }
  end
end

Instance Method Details

#add_formatter(formatter_to_use, path = nil) ⇒ Object Also known as: formatter=



277
278
279
280
281
282
283
284
# File 'lib/rspec/core/configuration.rb', line 277

def add_formatter(formatter_to_use, path=nil)
  formatter_class =
    built_in_formatter(formatter_to_use) ||
    custom_formatter(formatter_to_use) ||
    (raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?.")

  formatters << formatter_class.new(path ? file_at(path) : output)
end

#add_setting(name, opts = {}) ⇒ Object

:call-seq:

add_setting(:name)
add_setting(:name, :default => "default_value")
add_setting(:name, :alias => :other_setting)

Use this to add custom settings to the RSpec.configuration object.

RSpec.configuration.add_setting :foo

Creates three methods on the configuration object, a setter, a getter, and a predicate:

RSpec.configuration.foo=(value)
RSpec.configuration.foo()
RSpec.configuration.foo?() # returns true if foo returns anything but nil or false

Intended for extension frameworks like rspec-rails, so they can add config settings that are domain specific. For example:

RSpec.configure do |c|
  c.add_setting :use_transactional_fixtures, :default => true
  c.add_setting :use_transactional_examples, :alias => :use_transactional_fixtures
end

Options

add_setting takes an optional hash that supports the following keys:

:default => "default value"

This sets the default value for the getter and the predicate (which will return true as long as the value is not false or nil).

:alias => :other_setting

Aliases its setter, getter, and predicate, to those for the other_setting.



105
106
107
# File 'lib/rspec/core/configuration.rb', line 105

def add_setting(name, opts={})
  self.class.add_setting(name, opts)
end

#alias_example_to(new_name, *args) ⇒ Object

E.g. alias_example_to :crazy_slow, :speed => ‘crazy_slow’ defines crazy_slow as an example variant that has the crazy_slow speed option



318
319
320
321
# File 'lib/rspec/core/configuration.rb', line 318

def alias_example_to(new_name, *args)
  extra_options = (args)
  RSpec::Core::ExampleGroup.alias_example_to(new_name, extra_options)
end

#alias_it_should_behave_like_to(new_name, report_label = '') ⇒ Object

Define an alias for it_should_behave_like that allows different language (like “it_has_behavior” or “it_behaves_like”) to be employed when including shared examples.

Example:

alias_it_should_behave_like_to(:it_has_behavior, 'has behavior:')

allows the user to include a shared example group like:

describe Entity do
  it_has_behavior 'sortability' do
    let(:sortable) { Entity.new }
  end
end

which is reported in the output as:

Entity
  has behavior: sortability
    # sortability examples here


344
345
346
# File 'lib/rspec/core/configuration.rb', line 344

def alias_it_should_behave_like_to(new_name, report_label = '')
  RSpec::Core::ExampleGroup.alias_it_should_behave_like_to(new_name, report_label)
end

#cleaned_from_backtrace?(line) ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/rspec/core/configuration.rb', line 121

def cleaned_from_backtrace?(line)
  backtrace_clean_patterns.any? { |regex| line =~ regex }
end

#clear_inclusion_filterObject

:nodoc:



117
118
119
# File 'lib/rspec/core/configuration.rb', line 117

def clear_inclusion_filter # :nodoc:
  self.inclusion_filter = nil
end

#color_enabledObject



223
224
225
# File 'lib/rspec/core/configuration.rb', line 223

def color_enabled
  @color_enabled && output_to_tty?
end

#color_enabled=(bool) ⇒ Object



231
232
233
234
235
236
237
238
239
240
# File 'lib/rspec/core/configuration.rb', line 231

def color_enabled=(bool)
  return unless bool
  @color_enabled = true
  if bool && ::RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
    unless ENV['ANSICON']
      warn "You must use ANSICON 1.31 or later (http://adoxa.110mb.com/ansicon/) to use colour on Windows"
      @color_enabled = false
    end
  end
end

#color_enabled?Boolean

Returns:

  • (Boolean)


227
228
229
# File 'lib/rspec/core/configuration.rb', line 227

def color_enabled?
  color_enabled
end

#configure_expectation_frameworkObject



412
413
414
415
416
# File 'lib/rspec/core/configuration.rb', line 412

def configure_expectation_framework
  expectation_frameworks.each do |framework|
    RSpec::Core::ExampleGroup.send(:include, framework)
  end
end

#configure_group(group) ⇒ Object



401
402
403
404
405
406
# File 'lib/rspec/core/configuration.rb', line 401

def configure_group(group)
  include_or_extend_modules.each do |include_or_extend, mod, filters|
    next unless filters.empty? || group.apply?(:any?, filters)
    group.send(include_or_extend, mod)
  end
end

#configure_mock_frameworkObject



408
409
410
# File 'lib/rspec/core/configuration.rb', line 408

def configure_mock_framework
  RSpec::Core::ExampleGroup.send(:include, mock_framework)
end

#debug=(bool) ⇒ Object



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/rspec/core/configuration.rb', line 250

def debug=(bool)
  return unless bool
  begin
    require 'ruby-debug'
    Debugger.start
  rescue LoadError
    raise <<-EOM

#{'*'*50}
You must install ruby-debug to run rspec with the --debug option.

If you have ruby-debug installed as a ruby gem, then you need to either
require 'rubygems' or configure the RUBYOPT environment variable with
the value 'rubygems'.
#{'*'*50}
EOM
  end
end

#exclusion_filterObject



352
353
354
# File 'lib/rspec/core/configuration.rb', line 352

def exclusion_filter
  settings[:exclusion_filter] || {}
end

#exclusion_filter=(filter) ⇒ Object



348
349
350
# File 'lib/rspec/core/configuration.rb', line 348

def exclusion_filter=(filter)
  settings[:exclusion_filter] = filter
end

#expect_with(*frameworks) ⇒ Object

Sets the expectation framework module(s).

frameworks can be :rspec, :stdlib, or both

Given :rspec, configures rspec/expectations. Given :stdlib, configures test/unit/assertions Given both, configures both



200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/rspec/core/configuration.rb', line 200

def expect_with(*frameworks)
  settings[:expectation_frameworks] = []
  frameworks.each do |framework|
    case framework
    when Symbol
      case framework
      when :rspec
        require 'rspec/core/expecting/with_rspec'
        self.expecting_with_rspec = true
      when :stdlib
        require 'rspec/core/expecting/with_stdlib'
      else
        raise ArgumentError, "#{framework.inspect} is not supported"
      end
      settings[:expectation_frameworks] << RSpec::Core::ExpectationFrameworkAdapter
    end
  end
end

#expectation_framework=(framework) ⇒ Object

Delegates to expect_with()



189
190
191
# File 'lib/rspec/core/configuration.rb', line 189

def expectation_framework=(framework)
  expect_with([framework])
end

#expectation_frameworksObject

Returns the configured expectation framework adapter module(s)



183
184
185
186
# File 'lib/rspec/core/configuration.rb', line 183

def expectation_frameworks
  expect_with :rspec unless settings[:expectation_frameworks]
  settings[:expectation_frameworks]
end

#extend(mod, *args) ⇒ Object



396
397
398
399
# File 'lib/rspec/core/configuration.rb', line 396

def extend(mod, *args)
  filters = (args)
  include_or_extend_modules << [:extend, mod, filters]
end

#files_or_directories_to_run=(*files) ⇒ Object



299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'lib/rspec/core/configuration.rb', line 299

def files_or_directories_to_run=(*files)
  self.files_to_run = files.flatten.collect do |file|
    if File.directory?(file)
      pattern.split(",").collect do |pattern|
        Dir["#{file}/#{pattern.strip}"]
      end
    else
      if file =~ /(\:(\d+))$/
        self.line_number = $2
        file.sub($1,'')
      else
        file
      end
    end
  end.flatten
end

#filter_run_excluding(*args) ⇒ Object



386
387
388
389
# File 'lib/rspec/core/configuration.rb', line 386

def filter_run_excluding(*args)
  options = (args)
  self.exclusion_filter = (exclusion_filter || {}).merge(options)
end

#filter_run_including(*args) ⇒ Object Also known as: filter_run



363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'lib/rspec/core/configuration.rb', line 363

def filter_run_including(*args)
  force_overwrite = if args.last.is_a?(Hash) || args.last.is_a?(Symbol)
    false
  else
    args.pop
  end

  options = (args)

  if inclusion_filter[:line_number] || inclusion_filter[:full_description]
    warn "Filtering by #{options.inspect} is not possible since " \
         "you are already filtering by #{inclusion_filter.inspect}"
  else
    if force_overwrite
      self.inclusion_filter = options
    else
      self.inclusion_filter = (inclusion_filter || {}).merge(options)
    end
  end
end

#formattersObject



288
289
290
# File 'lib/rspec/core/configuration.rb', line 288

def formatters
  @formatters ||= []
end

#full_backtrace=(true_or_false) ⇒ Object



219
220
221
# File 'lib/rspec/core/configuration.rb', line 219

def full_backtrace=(true_or_false)
  settings[:backtrace_clean_patterns] = true_or_false ? [] : DEFAULT_BACKTRACE_PATTERNS
end

#full_description=(description) ⇒ Object



273
274
275
# File 'lib/rspec/core/configuration.rb', line 273

def full_description=(description)
  filter_run({ :full_description => /#{description}/ }, true)
end

#include(mod, *args) ⇒ Object



391
392
393
394
# File 'lib/rspec/core/configuration.rb', line 391

def include(mod, *args)
  filters = (args)
  include_or_extend_modules << [:include, mod, filters]
end

#inclusion_filterObject



360
361
362
# File 'lib/rspec/core/configuration.rb', line 360

def inclusion_filter
  settings[:inclusion_filter] || {}
end

#inclusion_filter=(filter) ⇒ Object



356
357
358
# File 'lib/rspec/core/configuration.rb', line 356

def inclusion_filter=(filter)
  settings[:inclusion_filter] = filter
end

#libs=(libs) ⇒ Object



242
243
244
# File 'lib/rspec/core/configuration.rb', line 242

def libs=(libs)
  libs.map {|lib| $LOAD_PATH.unshift lib}
end

#line_number=(line_number) ⇒ Object



269
270
271
# File 'lib/rspec/core/configuration.rb', line 269

def line_number=(line_number)
  filter_run({ :line_number => line_number.to_i }, true)
end

#load_spec_filesObject



418
419
420
421
# File 'lib/rspec/core/configuration.rb', line 418

def load_spec_files
  files_to_run.map {|f| load File.expand_path(f) }
  raise_if_rspec_1_is_loaded
end

#mock_frameworkObject

Returns the configured mock framework adapter module



126
127
128
129
130
131
# File 'lib/rspec/core/configuration.rb', line 126

def mock_framework
  settings[:mock_framework] ||= begin
                                  require 'rspec/core/mocking/with_rspec'
                                  RSpec::Core::MockFrameworkAdapter
                                end
end

#mock_framework=(framework) ⇒ Object

Sets the mock framework adapter module.

framework can be a Symbol or a Module.

Given any of :rspec, :mocha, :flexmock, or :rr, configures the named framework.

Given :nothing, configures no framework. Use this if you don’t use any mocking framework to save a little bit of overhead.

Given a Module, includes that module in every example group. The module should adhere to RSpec’s mock framework adapter API:

setup_mocks_for_rspec
  - called before each example

verify_mocks_for_rspec
  - called after each example. Framework should raise an exception
    when expectations fail

teardown_mocks_for_rspec
  - called after verify_mocks_for_rspec (even if there are errors)


160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/rspec/core/configuration.rb', line 160

def mock_framework=(framework)
  case framework
  when Module
    settings[:mock_framework] = framework
  when String, Symbol
    require case framework.to_s
            when /rspec/i
              'rspec/core/mocking/with_rspec'
            when /mocha/i
              'rspec/core/mocking/with_mocha'
            when /rr/i
              'rspec/core/mocking/with_rr'
            when /flexmock/i
              'rspec/core/mocking/with_flexmock'
            else
              'rspec/core/mocking/with_absolutely_nothing'
            end
    settings[:mock_framework] = RSpec::Core::MockFrameworkAdapter
  else
  end
end

#mock_with(framework) ⇒ Object

Delegates to mock_framework=(framework)



134
135
136
# File 'lib/rspec/core/configuration.rb', line 134

def mock_with(framework)
  self.mock_framework = framework
end

#puts(message) ⇒ Object



109
110
111
# File 'lib/rspec/core/configuration.rb', line 109

def puts(message)
  output_stream.puts(message)
end

#reporterObject



292
293
294
295
296
297
# File 'lib/rspec/core/configuration.rb', line 292

def reporter
  @reporter ||= begin
                  add_formatter('progress') if formatters.empty?
                  Reporter.new(*formatters)
                end
end

#requires=(paths) ⇒ Object



246
247
248
# File 'lib/rspec/core/configuration.rb', line 246

def requires=(paths)
  paths.map {|path| require path}
end

#resetObject



63
64
65
# File 'lib/rspec/core/configuration.rb', line 63

def reset
  @reporter = nil
end

#settingsObject



113
114
115
# File 'lib/rspec/core/configuration.rb', line 113

def settings
  @settings ||= {}
end