class RSpec::Core::Reporter
A reporter will send notifications to listeners, usually formatters for the spec suite run.
Constants
- RSPEC_NOTIFICATIONS
@private
Attributes
@private
@private
@private
Public Class Methods
# File 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 lib/rspec/core/reporter.rb, line 214 def abort_with(msg, exit_status) message(msg) close exit!(exit_status) end
@private
# File lib/rspec/core/reporter.rb, line 193 def close_after yield ensure close end
@private
# File lib/rspec/core/reporter.rb, line 155 def deprecation(hash) notify :deprecation, Notifications::DeprecationNotification.from_hash(hash) end
@private
# File lib/rspec/core/reporter.rb, line 143 def example_failed(example) @failed_examples << example notify :example_failed, Notifications::ExampleNotification.for(example) end
@private
# File lib/rspec/core/reporter.rb, line 133 def example_finished(example) notify :example_finished, Notifications::ExampleNotification.for(example) end
@private
# File 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 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 lib/rspec/core/reporter.rb, line 138 def example_passed(example) notify :example_passed, Notifications::ExampleNotification.for(example) end
@private
# File lib/rspec/core/reporter.rb, line 149 def example_pending(example) @pending_examples << example notify :example_pending, Notifications::ExampleNotification.for(example) end
@private
# File 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 lib/rspec/core/reporter.rb, line 84 def exit_early(exit_code) report(0) { exit_code } end
@private
# File lib/rspec/core/reporter.rb, line 221 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 lib/rspec/core/reporter.rb, line 173 def finish close_after do stop notify :start_dump, Notifications::NullNotification notify :dump_pending, Notifications::ExamplesNotification.new(self) notify :dump_failures, Notifications::ExamplesNotification.new(self) 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 lib/rspec/core/reporter.rb, line 99 def message(message) notify :message, Notifications::MessageNotification.new(message) end
@private
# File lib/rspec/core/reporter.rb, line 206 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 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 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 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 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 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 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 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 lib/rspec/core/reporter.rb, line 200 def stop @duration = (RSpec::Core::Time.now - @start).to_f if @start notify :stop, Notifications::ExamplesNotification.new(self) end
Private Instance Methods
# File lib/rspec/core/reporter.rb, line 242 def close notify :close, Notifications::NullNotification end
# File lib/rspec/core/reporter.rb, line 233 def ensure_listeners_ready return if @setup @setup_default.call @profiler = Profiler.new register_listener @profiler, *Profiler::NOTIFICATIONS @setup = true end
# File lib/rspec/core/reporter.rb, line 246 def mute_profile_output? # Don't print out profiled info if there are failures and `--fail-fast` is # used, it just clutters the output. !@configuration.profile_examples? || fail_fast_limit_met? end
# File lib/rspec/core/reporter.rb, line 252 def seed_used? @configuration.seed && @configuration.seed_used? end