RSpec::Support.require_rspec_core "formatters/console_codes" module RSpec module Core module Formatters # @api private # Formatter for providing profile output class ProfileFormatter Formatters.register self, :dump_profile def initialize(output) @output = output end # @private attr_reader :output # @method dump_profile # @api public # # This method is invoked after the dumping the summary if profiling is # enabled. # # @param profile [ProfileNotification] containing duration, slowest_examples # and slowest_example_groups def dump_profile(profile) dump_profile_slowest_examples(profile) dump_profile_slowest_example_groups(profile) end private def dump_profile_slowest_examples(profile) @output.puts "\nTop #{profile.slowest_examples.size} slowest examples (#{Helpers.format_seconds(profile.slow_duration)} seconds, #{profile.percentage}% of total time):\n" profile.slowest_examples.each do |example| @output.puts " #{example.full_description}" @output.puts " #{bold(Helpers.format_seconds(example.execution_result.run_time))} #{bold("seconds")} #{format_caller(example.location)}" end end def dump_profile_slowest_example_groups(profile) return if profile.slowest_groups.empty? @output.puts "\nTop #{profile.slowest_groups.size} slowest example groups:" profile.slowest_groups.each do |loc, hash| average = "#{bold(Helpers.format_seconds(hash[:average]))} #{bold("seconds")} average" total = "#{Helpers.format_seconds(hash[:total_time])} seconds" count = Helpers.pluralize(hash[:count], "example") @output.puts " #{hash[:description]}" @output.puts " #{average} (#{total} / #{count}) #{loc}" end end def format_caller(caller_info) RSpec.configuration.backtrace_formatter.backtrace_line(caller_info.to_s.split(':in `block').first) end def bold(text) ConsoleCodes.wrap(text, :bold) end end end end end