Class: FactoryGirlProfiling::Profiler

Inherits:
Object
  • Object
show all
Defined in:
lib/factory_girl_profiling/profiler.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeProfiler

Returns a new instance of Profiler.



16
17
18
# File 'lib/factory_girl_profiling/profiler.rb', line 16

def initialize
  reset
end

Instance Attribute Details

#output_bufferObject



84
85
86
# File 'lib/factory_girl_profiling/profiler.rb', line 84

def output_buffer
  @output_buffer ||= $stdout
end

Class Method Details

.instanceObject



4
5
6
# File 'lib/factory_girl_profiling/profiler.rb', line 4

def self.instance
  @instance ||= new
end

Instance Method Details

#add(name, start, finish, id, payload) ⇒ Object



25
26
27
28
# File 'lib/factory_girl_profiling/profiler.rb', line 25

def add(name, start, finish, id, payload)
  add_counting(payload[:name], payload[:strategy])
  add_timing(payload[:name], payload[:strategy], finish - start)
end

#add_counting(name, strategy) ⇒ Object



41
42
43
44
45
# File 'lib/factory_girl_profiling/profiler.rb', line 41

def add_counting(name, strategy)
  @factory_girl_results[name] ||= {}
  @factory_girl_results[name][strategy] ||= 0
  @factory_girl_results[name][strategy] += 1
end

#add_timing(name, strategy, timing) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/factory_girl_profiling/profiler.rb', line 30

def add_timing(name, strategy, timing)
  @factory_girl_timing_results[name] ||= {}
  @factory_girl_timing_results[name][strategy] ||= []
  @factory_girl_timing_results[name][strategy] << timing


  #if timing >= 0.5
  #output_string "Slow factory: #{name} using strategy #{strategy}"
  #end
end

#output_string(str) ⇒ Object



79
80
81
# File 'lib/factory_girl_profiling/profiler.rb', line 79

def output_string(str)
  output_buffer.puts str
end


52
53
54
55
56
57
58
59
# File 'lib/factory_girl_profiling/profiler.rb', line 52

def print_counting_results
  output_string 'FactoryGirl counting:'
  sort_data_hash(@factory_girl_results).each do |factory, values|
    counts_for_strategies = values.inject([]){|s, (strategy, count)| s << "#{strategy} = #{count}"}
    output_string "#{"#{factory}:".ljust(30)} #{"%15s \t" * counts_for_strategies.size}" % counts_for_strategies
  end
  output_string "\n"
end


47
48
49
50
# File 'lib/factory_girl_profiling/profiler.rb', line 47

def print_results
  print_counting_results
  print_timing_results
end


61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/factory_girl_profiling/profiler.rb', line 61

def print_timing_results
  output_string 'FactoryGirl timing:'
  sort_value_proc = ->(val) { val.values.map{|e| e.reduce(0, &:+)}.reduce(0, &:+) / val.values.map(&:size).reduce(0, &:+) }
  sort_data_hash(@factory_girl_timing_results, sort_value_proc).each do |factory, data|
    output_string factory
    data.each do |strategy, times|
      output_string "#{"#{strategy}:".ljust(10)} avg=#{(times.reduce(0, &:+) / times.size).round(2)} \t(min=#{times.min.round(2)},\tmax=#{times.max.round(2)})"
    end
    output_string ""
  end
  output_string "\n"
end

#resetObject



20
21
22
23
# File 'lib/factory_girl_profiling/profiler.rb', line 20

def reset
  @factory_girl_results = {}
  @factory_girl_timing_results = {}
end

#sort_data_hash(hash, sort_value_proc = nil) ⇒ Object



74
75
76
77
# File 'lib/factory_girl_profiling/profiler.rb', line 74

def sort_data_hash(hash, sort_value_proc = nil)
  sort_value_proc ||= Proc.new {|val| val.values.reduce(0, &:+) }
  hash.to_a.sort {|(_, v1), (_, v2)| sort_value_proc.call(v2) <=> sort_value_proc.call(v1)}
end