module RSpec

Namespace for all core RSpec code.

This is borrowed (slightly modified) from Scott Taylor’s project_path project:

http://github.com/smtlaissezfaire/project_path

RSpec’s top level namespace. All of rspec-expectations is contained in the ‘RSpec::Expectations` and `RSpec::Matchers` namespaces.

Share the top-level RSpec namespace, because we are a core supported extension.

Constants

MODULES_TO_AUTOLOAD

@private

SharedContext

@private

Attributes

Setters for shared global objects @api private

Setters for shared global objects @api private

Public Class Methods

Used to ensure examples get reloaded between multiple runs in the same process and ensures user configuration is persisted.

Users must invoke this if they want to clear all examples but preserve current configuration when they use the runner multiple times within the same process.

# File rspec-core/lib/rspec/core.rb, line 70
def self.clear_examples
  world.reset
  configuration.reset_reporter
  configuration.start_time = ::RSpec::Core::Time.now
  configuration.reset_filters
end

Returns the global [Configuration](RSpec/Core/Configuration) object. While you can use this method to access the configuration, the more common convention is to use [RSpec.configure](RSpec#configure-class_method).

@example

RSpec.configuration.drb_port = 1234

@see RSpec.configure @see Core::Configuration

# File rspec-core/lib/rspec/core.rb, line 85
def self.configuration
  @configuration ||= RSpec::Core::Configuration.new
end

Yields the global configuration to a block. @yield [Configuration] global configuration

@example

RSpec.configure do |config|
  config.add_formatter 'documentation'
end

@see Core::Configuration

# File rspec-core/lib/rspec/core.rb, line 97
def self.configure
  yield configuration if block_given?
end

@private

Calls superclass method
# File rspec-core/lib/rspec/core.rb, line 194
def self.const_missing(name)
  # Load rspec-expectations when RSpec::Matchers is referenced. This allows
  # people to define custom matchers (using `RSpec::Matchers.define`) before
  # rspec-core has loaded rspec-expectations (since it delays the loading of
  # it to allow users to configure a different assertion/expectation
  # framework). `autoload` can't be used since it works with ruby's built-in
  # require (e.g. for files that are available relative to a load path dir),
  # but not with rubygems' extended require.
  #
  # As of rspec 2.14.1, we no longer require `rspec/mocks` and
  # `rspec/expectations` when `rspec` is required, so we want
  # to make them available as an autoload.
  require MODULES_TO_AUTOLOAD.fetch(name) { return super }
  ::RSpec.const_get(name)
end

The example being executed.

The primary audience for this method is library authors who need access to the example currently being executed and also want to support all versions of RSpec 2 and 3.

@example

RSpec.configure do |c|
  # context.example is deprecated, but RSpec.current_example is not
  # available until RSpec 3.0.
  fetch_current_example = RSpec.respond_to?(:current_example) ?
    proc { RSpec.current_example } : proc { |context| context.example }

  c.before(:example) do
    example = fetch_current_example.call(self)

    # ...
  end
end
# File rspec-core/lib/rspec/core.rb, line 122
def self.current_example
  RSpec::Support.thread_local_data[:current_example]
end

Set the current example being executed. @api private

# File rspec-core/lib/rspec/core.rb, line 128
def self.current_example=(example)
  RSpec::Support.thread_local_data[:current_example] = example
end

Get the current RSpec execution scope

Returns (in order of lifecycle):

* `:suite` as an initial value, this is outside of the test lifecycle.
* `:before_suite_hook` during `before(:suite)` hooks.
* `:before_context_hook` during `before(:context)` hooks.
* `:before_example_hook` during `before(:example)` hooks and `around(:example)` before `example.run`.
* `:example` within the example run.
* `:after_example_hook` during `after(:example)` hooks and `around(:example)` after `example.run`.
* `:after_context_hook` during `after(:context)` hooks.
* `:after_suite_hook` during `after(:suite)` hooks.
* `:suite` as a final value, again this is outside of the test lifecycle.

Reminder, ‘:context` hooks have `:all` alias and `:example` hooks have `:each` alias. @return [Symbol]

# File rspec-core/lib/rspec/core.rb, line 154
def self.current_scope
  RSpec::Support.thread_local_data[:current_scope]
end

Set the current scope rspec is executing in @api private

# File rspec-core/lib/rspec/core.rb, line 134
def self.current_scope=(scope)
  RSpec::Support.thread_local_data[:current_scope] = scope
end

Used to ensure examples get reloaded and user configuration gets reset to defaults between multiple runs in the same process.

Users must invoke this if they want to have the configuration reset when they use the runner multiple times within the same process. Users must deal themselves with re-configuration of RSpec before run.

# File rspec-core/lib/rspec/core.rb, line 58
def self.reset
  RSpec::ExampleGroups.remove_all_constants
  @world = nil
  @configuration = nil
end

@private Internal container for global non-configuration data.

# File rspec-core/lib/rspec/core.rb, line 160
def self.world
  @world ||= RSpec::Core::World.new
end