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 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