class Flores::RSpec::Analyze::Analysis
A formatter to show analysis of an `analyze_it` example.
Public Class Methods
new(results)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 79 def initialize(results) @results = results end
Public Instance Methods
error_report(error, instances)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 136 def error_report(error, instances) report = error_summary(error, instances) report += error_sample_states(error, instances) if instances.size > 1 report end
error_sample_states(error, instances)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 168 def error_sample_states(error, instances) [ " Samples causing #{error}:", *instances.sample(5).collect { |state, _exception| " #{state}" } ] end
error_summary(error, instances)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 142 def error_summary(error, instances) sample = instances.sample(1) [ " #{percent_s(instances.length)} -> [#{instances.length}] #{error}", " Sample failure", " Inputs:", *render_values(sample.first[0]).map { |x| " #{x}" }, " Exception:", sample.first[1].to_s.gsub(/^/, " ") ] end
failure_summary()
click to toggle source
TODO(sissel): All these report/summary/to_s things are an indication that the report formatting belongs in a separate class.
# File lib/flores/rspec/analyze.rb, line 126 def failure_summary report = ["Failure analysis:"] report += @results.sort_by { |_, v| -v.length }.collect do |group, instances| next if group == :passed next if group == :pending error_report(group, instances) end.reject(&:nil?).flatten report end
percent(count)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 103 def percent(count) return (count + 0.0) / total end
percent_s(count)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 107 def percent_s(count) return format("%.2f%%", percent(count) * 100) end
render_values(values)
click to toggle source
# File lib/flores/rspec/analyze.rb, line 154 def render_values(values) # values should be an RSpec::Core::MemoizedHelpers::ThreadsafeMemoized lets = values.instance_eval { @memoized } return ["<nothing>"] if lets.nil? lets.sort_by { |k,v| v.to_s.size }.map do |k,v| if v.to_s.size > 50 v = v.to_s[0, 50] + "..." end "#{k}=#{v}" end end
success_and_pending_count()
click to toggle source
# File lib/flores/rspec/analyze.rb, line 95 def success_and_pending_count count = 0 [:passed, :pending].each do |group| count += @results[group].length end count end
success_count()
click to toggle source
# File lib/flores/rspec/analyze.rb, line 87 def success_count if @results.include?(:passed) @results[:passed].length else 0 end end
to_s()
click to toggle source
# File lib/flores/rspec/analyze.rb, line 111 def to_s # rubocop:disable Metrics/AbcSize # This method is crazy complex for a formatter. Should refactor this significantly. report = [] if @results[:pending].any? # We have pending examples, put a clear message. report << "#{percent_s(success_and_pending_count)} (of #{total} total) tests are successful or pending" else report << "#{percent_s(success_count)} (of #{total} total) tests are successful" end report += failure_summary if success_and_pending_count < total report.join("\n") end
total()
click to toggle source
# File lib/flores/rspec/analyze.rb, line 83 def total @results.reduce(0) { |m, (_, v)| m + v.length } end