Class: RSpec::Core::Reporter

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/core/reporter.rb

Overview

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

Constant Summary collapse

RSPEC_NOTIFICATIONS =
Set.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,
  :message, :seed, :start, :start_dump, :stop, :example_finished
])

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Reporter

Returns a new instance of Reporter



14
15
16
17
18
19
20
21
22
23
24
25
# 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

Instance Attribute Details

#examplesObject (readonly)



28
29
30
# File 'lib/rspec/core/reporter.rb', line 28

def examples
  @examples
end

#failed_examplesObject (readonly)



28
29
30
# File 'lib/rspec/core/reporter.rb', line 28

def failed_examples
  @failed_examples
end

#pending_examplesObject (readonly)



28
29
30
# File 'lib/rspec/core/reporter.rb', line 28

def pending_examples
  @pending_examples
end

Instance Method Details

#abort_with(msg, exit_status) ⇒ Object



206
207
208
209
210
# File 'lib/rspec/core/reporter.rb', line 206

def abort_with(msg, exit_status)
  message(msg)
  close
  exit!(exit_status)
end

#close_afterObject



185
186
187
188
189
# File 'lib/rspec/core/reporter.rb', line 185

def close_after
  yield
ensure
  close
end

#deprecation(hash) ⇒ Object



147
148
149
# File 'lib/rspec/core/reporter.rb', line 147

def deprecation(hash)
  notify :deprecation, Notifications::DeprecationNotification.from_hash(hash)
end

#example_failed(example) ⇒ Object



135
136
137
138
# File 'lib/rspec/core/reporter.rb', line 135

def example_failed(example)
  @failed_examples << example
  notify :example_failed, Notifications::ExampleNotification.for(example)
end

#example_finished(example) ⇒ Object



125
126
127
# File 'lib/rspec/core/reporter.rb', line 125

def example_finished(example)
  notify :example_finished, Notifications::ExampleNotification.for(example)
end

#example_group_finished(group) ⇒ Object



114
115
116
# File 'lib/rspec/core/reporter.rb', line 114

def example_group_finished(group)
  notify :example_group_finished, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty?
end

#example_group_started(group) ⇒ Object



109
110
111
# File 'lib/rspec/core/reporter.rb', line 109

def example_group_started(group)
  notify :example_group_started, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty?
end

#example_passed(example) ⇒ Object



130
131
132
# File 'lib/rspec/core/reporter.rb', line 130

def example_passed(example)
  notify :example_passed, Notifications::ExampleNotification.for(example)
end

#example_pending(example) ⇒ Object



141
142
143
144
# File 'lib/rspec/core/reporter.rb', line 141

def example_pending(example)
  @pending_examples << example
  notify :example_pending, Notifications::ExampleNotification.for(example)
end

#example_started(example) ⇒ Object



119
120
121
122
# File 'lib/rspec/core/reporter.rb', line 119

def example_started(example)
  @examples << example
  notify :example_started, Notifications::ExampleNotification.for(example)
end

#fail_fast_limit_met?Boolean

Returns:

  • (Boolean)


213
214
215
216
217
218
219
220
221
# File 'lib/rspec/core/reporter.rb', line 213

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

#finishObject



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/rspec/core/reporter.rb', line 165

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) ⇒ Object

Send a custom message to supporting formatters.

Parameters:

  • message (#to_s)

    A message object to send to formatters



91
92
93
# File 'lib/rspec/core/reporter.rb', line 91

def message(message)
  notify :message, Notifications::MessageNotification.new(message)
end

#notify(event, notification) ⇒ Object



198
199
200
201
202
203
# File 'lib/rspec/core/reporter.rb', line 198

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) ⇒ Object

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.



155
156
157
158
159
160
161
162
# File 'lib/rspec/core/reporter.rb', line 155

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

#prepare_default(loader, output_stream, deprecation_stream) ⇒ Object



45
46
47
48
49
# 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

#publish(event, options = {}) ⇒ Object

Publish a custom event to supporting registered formatters.

Parameters:

  • event (Symbol)

    Name of the custom event to trigger on formatters

  • options (Hash) (defaults to: {})

    Hash of arguments to provide via `CustomNotification`

See Also:



100
101
102
103
104
105
106
# File 'lib/rspec/core/reporter.rb', line 100

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

#register_listener(listener, *notifications) ⇒ Object

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

Parameters:

  • listener (Object)

    An obect that wishes to be notified of reporter events

  • notifications (Array)

    Array of symbols represents the events a listener wishes to subscribe too



37
38
39
40
41
42
# 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

#registered_listeners(notification) ⇒ Object



52
53
54
# File 'lib/rspec/core/reporter.rb', line 52

def registered_listeners(notification)
  @listeners[notification].to_a
end

#report(count, &block) ⇒ Object #report(count, &block) ⇒ Object

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.

Examples:


reporter.report(group.examples.size) do |r|
  example_groups.map {|g| g.run(r) }
end

Parameters:

  • expected_example_count (Integer)

    the number of examples being run

Yields:

  • (Block)

    block yields itself for further reporting.



71
72
73
74
75
76
77
78
# File 'lib/rspec/core/reporter.rb', line 71

def report(expected_example_count)
  start(expected_example_count)
  begin
    yield self
  ensure
    finish
  end
end

#start(expected_example_count, time = RSpec::Core::Time.now) ⇒ Object



81
82
83
84
85
86
# File 'lib/rspec/core/reporter.rb', line 81

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

#stopObject



192
193
194
195
# File 'lib/rspec/core/reporter.rb', line 192

def stop
  @duration = (RSpec::Core::Time.now - @start).to_f if @start
  notify :stop, Notifications::ExamplesNotification.new(self)
end