class TestProf::FactoryDoctor::RSpecListener
:nodoc:
def example_finished(notification)
def example_finished(notification) FactoryDoctor.stop return if notification.example.pending? result = FactoryDoctor.result return unless result.bad? group = notification.example.example_group.parent_groups.last notification.example.metadata.merge!( factories: result.count, time: result.time ) @example_groups[group] << notification.example @count += 1 @time += result.time end
def example_started(_notification)
def example_started(_notification) FactoryDoctor.start end
def initialize
def initialize @count = 0 @time = 0.0 @example_groups = Hash.new { |h, k| h[k] = [] } end
def pluralize_records(count)
def pluralize_records(count) return "1 record" if count == 1 "#{count} records" end
def print
def print return log(:info, SUCCESS_MESSAGE) if @example_groups.empty? msgs = [] msgs << <<~MSG FactoryDoctor report Total (potentially) bad examples: #{@count} Total wasted time: #{@time.duration} MSG @example_groups.each do |group, examples| group_time = examples.sum { |ex| ex.metadata[:time] } group_count = examples.sum { |ex| ex.metadata[:factories] } msgs << "#{group.description} (#{group.metadata[:location]}) " \ "(#{pluralize_records(group_count)} created, " \ "#{group_time.duration})\n" examples.each do |ex| msgs << " #{ex.description} (#{ex.metadata[:location]}) " \ "– #{pluralize_records(ex.metadata[:factories])} created, " \ "#{ex.metadata[:time].duration}\n" end msgs << "\n" end log :info, msgs.join stamp! if FactoryDoctor.stamp? end
def stamp!
def stamp! stamper = RSpecStamp::Stamper.new examples = Hash.new { |h, k| h[k] = [] } @example_groups.each_value do |bad_examples| bad_examples.each do |example| file, line = example.metadata[:location].split(":") examples[file] << line.to_i end end examples.each do |file, lines| stamper.stamp_file(file, lines.uniq) end msgs = [] msgs << <<~MSG RSpec Stamp results Total patches: #{stamper.total} Total files: #{examples.keys.size} Failed patches: #{stamper.failed} Ignored files: #{stamper.ignored} MSG log :info, msgs.join end