moduleRSpec::Core# A reporter will send notifications to listeners, usually formatters for the# spec suite run.classReporterdefinitialize(configuration)@configuration=configuration@listeners=Hash.new{|h,k|h[k]=Set.new}@examples=[]@failed_examples=[]@pending_examples=[]@duration=@start=@load_time=nilend# @privateattr_reader:examples,:failed_examples,:pending_examples# @privatedefreset@examples=[]@failed_examples=[]@pending_examples=[]end# Registers a listener to a list of notifications. The reporter will send# notification of events to all registered listeners.## @param listener [Object] An obect that wishes to be notified of reporter# events# @param notifications [Array] Array of symbols represents the events a# listener wishes to subscribe toodefregister_listener(listener,*notifications)notifications.eachdo|notification|@listeners[notification.to_sym]<<listenerendtrueend# @privatedefregistered_listeners(notification)@listeners[notification].to_aend# @api# @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#defreport(expected_example_count)start(expected_example_count)beginyieldselfensurefinishendend# @privatedefstart(expected_example_count,time=RSpec::Core::Time.now)@start=time@load_time=(@start-@configuration.start_time).to_fnotify:seed,Notifications::SeedNotification.new(@configuration.seed,seed_used?)notify:start,Notifications::StartNotification.new(expected_example_count,@load_time)end# @privatedefmessage(message)notify:message,Notifications::MessageNotification.new(message)end# @privatedefexample_group_started(group)notify:example_group_started,Notifications::GroupNotification.new(group)unlessgroup.descendant_filtered_examples.empty?end# @privatedefexample_group_finished(group)notify:example_group_finished,Notifications::GroupNotification.new(group)unlessgroup.descendant_filtered_examples.empty?end# @privatedefexample_started(example)@examples<<examplenotify:example_started,Notifications::ExampleNotification.for(example)end# @privatedefexample_passed(example)notify:example_passed,Notifications::ExampleNotification.for(example)end# @privatedefexample_failed(example)@failed_examples<<examplenotify:example_failed,Notifications::ExampleNotification.for(example)end# @privatedefexample_pending(example)@pending_examples<<examplenotify:example_pending,Notifications::ExampleNotification.for(example)end# @privatedefdeprecation(hash)notify:deprecation,Notifications::DeprecationNotification.from_hash(hash)end# @privatedeffinishstopnotify:start_dump,Notifications::NullNotificationnotify:dump_pending,Notifications::ExamplesNotification.new(self)notify:dump_failures,Notifications::ExamplesNotification.new(self)notify:deprecation_summary,Notifications::NullNotificationunlessmute_profile_output?notify:dump_profile,Notifications::ProfileNotification.new(@duration,@examples,@configuration.profile_examples)endnotify:dump_summary,Notifications::SummaryNotification.new(@duration,@examples,@failed_examples,@pending_examples,@load_time)notify:seed,Notifications::SeedNotification.new(@configuration.seed,seed_used?)ensurenotify:close,Notifications::NullNotificationend# @privatedefstop@duration=(RSpec::Core::Time.now-@start).to_fif@startnotify:stop,Notifications::ExamplesNotification.new(self)end# @privatedefnotify(event,notification)registered_listeners(event).eachdo|formatter|formatter.__send__(event,notification)endendprivatedefmute_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?||(@configuration.fail_fast?&&@failed_examples.size>0)enddefseed_used?@configuration.seed&&@configuration.seed_used?endend# @private# # Used in place of a {Reporter} for situations where we don't want reporting output.classNullReporterprivatedefmethod_missing(*)# ignoreendendend