class RSpec::Core::Reporter

A reporter will send notifications to listeners, usually formatters for the spec suite run.

Constants

RSPEC_NOTIFICATIONS

@private

Attributes

Public Class Methods

# File rspec-core/lib/rspec/core/reporter.rb, line 14
def initialize(configuration)
  @configuration = configuration
  @listeners = Hash.new { |h, k| h[k] = Set.new }
  @examples = []
  @failed_examples = []
  @pending_examples = []
  @duration = @start = @load_time = nil
  @non_example_exception_count = 0
  @setup_default = lambda {}
  @setup = false
  @profiler = nil
end

Public Instance Methods

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 215
def abort_with(msg, exit_status)
  message(msg)
  close
  exit!(exit_status)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 194
def close_after
  yield
ensure
  close
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 155
def deprecation(hash)
  notify :deprecation, Notifications::DeprecationNotification.from_hash(hash)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 143
def example_failed(example)
  @failed_examples << example
  notify :example_failed, Notifications::ExampleNotification.for(example)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 133
def example_finished(example)
  notify :example_finished, Notifications::ExampleNotification.for(example)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 122
def example_group_finished(group)
  notify :example_group_finished, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty?
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 117
def example_group_started(group)
  notify :example_group_started, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty?
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 138
def example_passed(example)
  notify :example_passed, Notifications::ExampleNotification.for(example)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 149
def example_pending(example)
  @pending_examples << example
  notify :example_pending, Notifications::ExampleNotification.for(example)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 127
def example_started(example)
  @examples << example
  notify :example_started, Notifications::ExampleNotification.for(example)
end

@param exit_code [Integer] the exit_code to be return by the reporter

Reports a run that exited early without having run any examples.

# File rspec-core/lib/rspec/core/reporter.rb, line 84
def exit_early(exit_code)
  report(0) { exit_code }
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 222
def fail_fast_limit_met?
  return false unless (fail_fast = @configuration.fail_fast)

  if fail_fast == true
    @failed_examples.any?
  else
    fail_fast <= @failed_examples.size
  end
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 173
def finish
  close_after do
    examples_notification = Notifications::ExamplesNotification.new(self)
    stop(examples_notification)
    notify :start_dump,    Notifications::NullNotification
    notify :dump_pending,  examples_notification
    notify :dump_failures, examples_notification
    notify :deprecation_summary, Notifications::NullNotification
    unless mute_profile_output?
      notify :dump_profile, Notifications::ProfileNotification.new(@duration, @examples,
                                                                   @configuration.profile_examples,
                                                                   @profiler.example_groups)
    end
    notify :dump_summary, Notifications::SummaryNotification.new(@duration, @examples, @failed_examples,
                                                                 @pending_examples, @load_time,
                                                                 @non_example_exception_count)
    notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?)
  end
end

@param message [#to_s] A message object to send to formatters

Send a custom message to supporting formatters.

# File rspec-core/lib/rspec/core/reporter.rb, line 99
def message(message)
  notify :message, Notifications::MessageNotification.new(message)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 207
def notify(event, notification)
  ensure_listeners_ready
  registered_listeners(event).each do |formatter|
    formatter.__send__(event, notification)
  end
end

@private Provides a way to notify of an exception that is not tied to any particular example (such as an exception encountered in a :suite hook). Exceptions will be formatted the same way they normally are.

# File rspec-core/lib/rspec/core/reporter.rb, line 163
def notify_non_example_exception(exception, context_description)
  @configuration.world.non_example_failure = true
  @non_example_exception_count += 1

  example = Example.new(AnonymousExampleGroup, context_description, {})
  presenter = Formatters::ExceptionPresenter.new(exception, example, :indentation => 0)
  message presenter.fully_formatted(nil)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 45
def prepare_default(loader, output_stream, deprecation_stream)
  @setup_default = lambda do
    loader.setup_default output_stream, deprecation_stream
  end
end

@param event [Symbol] Name of the custom event to trigger on formatters @param options [Hash] Hash of arguments to provide via ‘CustomNotification`

Publish a custom event to supporting registered formatters. @see RSpec::Core::Notifications::CustomNotification

# File rspec-core/lib/rspec/core/reporter.rb, line 108
def publish(event, options={})
  if RSPEC_NOTIFICATIONS.include? event
    raise "RSpec::Core::Reporter#publish is intended for sending custom " \
          "events not internal RSpec ones, please rename your custom event."
  end
  notify event, Notifications::CustomNotification.for(options)
end

Registers a listener to a list of notifications. The reporter will send notification of events to all registered listeners.

@param listener [Object] An object that wishes to be notified of reporter

events

@param notifications [Array] Array of symbols represents the events a

listener wishes to subscribe too
# File rspec-core/lib/rspec/core/reporter.rb, line 37
def register_listener(listener, *notifications)
  notifications.each do |notification|
    @listeners[notification.to_sym] << listener
  end
  true
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 52
def registered_listeners(notification)
  @listeners[notification].to_a
end

@overload report(count, &block) @overload report(count, &block) @param expected_example_count [Integer] the number of examples being run @yield [Block] block yields itself for further reporting.

Initializes the report run and yields itself for further reporting. The block is required, so that the reporter can manage cleaning up after the run.

@example

reporter.report(group.examples.size) do |r|
  example_groups.map {|g| g.run(r) }
end
# File rspec-core/lib/rspec/core/reporter.rb, line 71
def report(expected_example_count)
  start(expected_example_count)
  begin
    yield self
  ensure
    finish
  end
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 89
def start(expected_example_count, time=RSpec::Core::Time.now)
  @start = time
  @load_time = (@start - @configuration.start_time).to_f
  notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?)
  notify :start, Notifications::StartNotification.new(expected_example_count, @load_time)
end

@private

# File rspec-core/lib/rspec/core/reporter.rb, line 201
def stop(notification)
  @duration = (RSpec::Core::Time.now - @start).to_f if @start
  notify :stop, notification
end