Class: RSpec::Core::Reporter
Relationships & Source Files | |
Inherits: | Object |
Defined in: | rspec-core/lib/rspec/core/reporter.rb |
Overview
A reporter will send notifications to listeners, usually formatters for the spec suite run.
Constant Summary
-
RSPEC_NOTIFICATIONS =
Internal use only
# File 'rspec-core/lib/rspec/core/reporter.rb', line 6Set.new( [ :close, :deprecation, :deprecation_summary, :dump_failures, :dump_pending, :dump_profile, :dump_summary, :example_failed, :example_group_finished, :example_group_started, :example_passed, :example_pending, :example_started, :, :seed, :start, :start_dump, :stop, :example_finished ])
Class Method Summary
- .new(configuration) ⇒ Reporter constructor
Instance Attribute Summary
- #examples readonly Internal use only Internal use only
- #fail_fast_limit_met? ⇒ Boolean readonly Internal use only Internal use only
- #failed_examples readonly Internal use only Internal use only
- #pending_examples readonly Internal use only Internal use only
- #mute_profile_output? ⇒ Boolean readonly private
- #seed_used? ⇒ Boolean readonly private
Instance Method Summary
- #abort_with(msg, exit_status) Internal use only Internal use only
- #close_after Internal use only Internal use only
- #deprecation(hash) Internal use only Internal use only
- #example_failed(example) Internal use only Internal use only
- #example_finished(example) Internal use only Internal use only
- #example_group_finished(group) Internal use only Internal use only
- #example_group_started(group) Internal use only Internal use only
- #example_passed(example) Internal use only Internal use only
- #example_pending(example) Internal use only Internal use only
- #example_started(example) Internal use only Internal use only
-
#exit_early(exit_code)
Reports a run that exited early without having run any examples.
- #finish Internal use only Internal use only
-
#message(message)
Send a custom message to supporting formatters.
- #notify(event, notification) Internal use only Internal use only
-
#notify_non_example_exception(exception, context_description)
Internal use only
Internal use only
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). - #prepare_default(loader, output_stream, deprecation_stream) Internal use only Internal use only
-
#publish(event, options = {})
Publish a custom event to supporting registered formatters.
-
#register_listener(listener, *notifications)
Registers a listener to a list of notifications.
- #registered_listeners(notification) Internal use only Internal use only
-
#report(count, &block)
Initializes the report run and yields itself for further reporting.
- #start(expected_example_count, time = RSpec::Core::Time.now) Internal use only Internal use only
- #stop Internal use only Internal use only
- #close private
- #ensure_listeners_ready private
Constructor Details
.new(configuration) ⇒ Reporter
# 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
Instance Attribute Details
#examples (readonly)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 28
attr_reader :examples, :failed_examples, :pending_examples
#fail_fast_limit_met? ⇒ Boolean
(readonly)
# File 'rspec-core/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
#failed_examples (readonly)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 28
attr_reader :examples, :failed_examples, :pending_examples
#mute_profile_output? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'rspec-core/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
#pending_examples (readonly)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 28
attr_reader :examples, :failed_examples, :pending_examples
#seed_used? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'rspec-core/lib/rspec/core/reporter.rb', line 252
def seed_used? @configuration.seed && @configuration.seed_used? end
Instance Method Details
#abort_with(msg, exit_status)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 214
def abort_with(msg, exit_status) (msg) close exit!(exit_status) end
#close (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/reporter.rb', line 242
def close notify :close, Notifications::NullNotification end
#close_after
# File 'rspec-core/lib/rspec/core/reporter.rb', line 193
def close_after yield ensure close end
#deprecation(hash)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 155
def deprecation(hash) notify :deprecation, Notifications::DeprecationNotification.from_hash(hash) end
#ensure_listeners_ready (private)
[ GitHub ]# File 'rspec-core/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
#example_failed(example)
# 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
#example_finished(example)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 133
def example_finished(example) notify :example_finished, Notifications::ExampleNotification.for(example) end
#example_group_finished(group)
# 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
#example_group_started(group)
# 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
#example_passed(example)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 138
def example_passed(example) notify :example_passed, Notifications::ExampleNotification.for(example) end
#example_pending(example)
# 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
#example_started(example)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 127
def example_started(example) @examples << example notify :example_started, Notifications::ExampleNotification.for(example) end
#exit_early(exit_code)
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
#finish
# File 'rspec-core/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
#message(message)
Send a custom message to supporting formatters.
# File 'rspec-core/lib/rspec/core/reporter.rb', line 99
def ( ) notify :, Notifications::MessageNotification.new( ) end
#notify(event, notification)
# File 'rspec-core/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
#notify_non_example_exception(exception, context_description)
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) presenter.fully_formatted(nil) end
#prepare_default(loader, output_stream, deprecation_stream)
# 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
#publish(event, options = {})
Publish a custom event to supporting registered formatters.
# File 'rspec-core/lib/rspec/core/reporter.rb', line 108
def publish(event, ={}) 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( ) end
#register_listener(listener, *notifications)
Registers a listener to a list of notifications. The reporter will send notification of events to all registered listeners.
# 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
#registered_listeners(notification)
# File 'rspec-core/lib/rspec/core/reporter.rb', line 52
def registered_listeners(notification) @listeners[notification].to_a end
#report(count, &block)
#report(count, &block)
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.
#start(expected_example_count, time = RSpec::Core::Time.now)
# 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
#stop
# File 'rspec-core/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