rspec_stats/rspec_stats.rb (77 lines of code) (raw):
# frozen_string_literal: true
require 'erb'
require 'json'
require 'date'
require_relative 'rspec_queries'
require_relative 'rspec_query'
require_relative 'merge_request'
class RspecHtml
attr_reader :last_updated_at
def initialize
@last_updated_at = Time.now.utc
end
def write_html
run_queries
puts "creating #{html_filename}"
File.write(html_filename, html)
end
def html
template = File.join(File.dirname(__FILE__), 'templates/page.erb')
ERB.new(File.read(template)).result(binding)
end
def html_filename
'tmp/rspec/index.html'
end
def time_per_test
overall_per_day do |_date, rows|
time_per_test = rows.sum { |r| r['time_per_single_test'].to_f }
total_rows = rows.size
time_per_test / total_rows
end
end
def queries_per_test
overall_per_day do |_date, rows|
total_queries = rows.sum { |r| r['total_queries'].to_f }
number_of_tests = rows.sum { |r| r['number_of_tests'].to_f }
total_queries / number_of_tests
end
end
def visible_queries
queries.reject(&:hidden?)
end
def queries
@queries ||= SQL_QUERIES.map do |query|
RspecQuery.new(query)
end
end
def merge_requests_data
# FIXME - a hacky way to get the first date we display
# in per-day graphs, we need this to combine with list of MRs
min_day = overall_data_by_day.keys.min
all_mrs = MergeRequest.fetch(since: min_day)
by_day = all_mrs.group_by(&:day)
bars = by_day.map do |date, mrs|
{ x: date, y: mrs.size }
end
JSON.generate(bars)
end
private
def run_queries
queries.each do |query|
query.write_csv
query.write_json
end
end
def overall_per_day
chart_points = overall_data_by_day.map do |date, rows|
y = yield date, rows
y = 0 if y.nan?
{ x: date, y: y }
end
JSON.generate(chart_points)
end
def overall_data_by_day
return @overall_data_by_day if @overall_data_by_day
query = queries.find { |q| q.name == 'overall_time' }
return '{}' unless query
@overall_data_by_day = query.csv.group_by { |row| row['commit_date'] }
end
end
RspecHtml.new.write_html