Skip to content

Instantly share code, notes, and snippets.

@ArturT
Forked from manuelpuyol/knapsack_data.rb
Created February 8, 2019 19:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ArturT/5739f53787700cf1baec7ae3166579d7 to your computer and use it in GitHub Desktop.
Save ArturT/5739f53787700cf1baec7ae3166579d7 to your computer and use it in GitHub Desktop.
This is a simple script used calculate average spec files running time across multiple builds using Knapsack API. It requires that the KNAPSACK_API_TOKEN variable is set. It runs by default for the last 10 builds, but you can customize it passing the number of builds you want as an argument. Lastly, it returns a specs.txt file with the average t…
# frozen_string_literal: true
require 'httparty'
REQUESTED_BUILDS = ARGV[0].to_i || 10
SPEC_FILES = {}
def get(url, options = {})
headers = {
'cache-control': 'no-cache',
'KNAPSACK-PRO-TEST-SUITE-TOKEN': ENV['KNAPSACK_API_TOKEN']
}
response = HTTParty.get(url, headers: headers, query: options, format: :plain)
JSON.parse(response, symbolize_names: true)
end
def ci_build_list
@ci_build_list ||= get('https://api.knapsackpro.com/v1/builds').take(REQUESTED_BUILDS)
end
def ci_build(ci_build_token)
get("https://api.knapsackpro.com/v1/builds/#{ci_build_token}")
end
def build_data(ci_build_token)
ci_build(ci_build_token).dig(:build_subsets)&.each do |build_subset|
build_subset.dig(:test_files)&.each do |test_file|
spec_file_data(test_file)
end
end
end
def spec_file_data(test_file)
file_name = test_file.dig(:path)&.to_sym
file_execution_time = test_file.dig(:time_execution)&.to_f
return if file_name.nil? || file_execution_time.nil?
spec_file_data = SPEC_FILES.dig(file_name)
if spec_file_data.nil?
SPEC_FILES[file_name] = {
total_executions: 1,
total_execution_time: file_execution_time
}
else
spec_file_data[:total_execution_time] += file_execution_time
spec_file_data[:total_executions] += 1
end
end
def calculate_average_times
ci_build_list.each do |ci_build|
build_data(ci_build.dig(:id))
end
SPEC_FILES.each do |_key, file|
file_total_execution_time = file[:total_execution_time]
file_total_executions = file[:total_executions]
file[:average_execution_time] = file_total_execution_time / file_total_executions
end
end
def sorted_specs_by_time
SPEC_FILES.sort_by{ |_file_name, file_data| -file_data[:average_execution_time] }
end
def print_specs_info
calculate_average_times
File.open('specs.txt', 'w') do |file|
sorted_specs_by_time.each do |spec_data|
file.write("#{spec_data.first} - Average time: #{spec_data.last[:average_execution_time]}\n")
end
end
end
print_specs_info
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment