Skip to content

Instantly share code, notes, and snippets.

@dtsato
Created July 21, 2009 21:19
Show Gist options
  • Save dtsato/151586 to your computer and use it in GitHub Desktop.
Save dtsato/151586 to your computer and use it in GitHub Desktop.
require 'rake'
namespace :metrics do
desc "Generate all metrics reports"
task :all do
MetricFu::Configuration.run {}
MetricFu.metrics.each {|metric| MetricFu.report.add(metric) }
MetricFu.report.save_output(MetricFu.report.to_yaml,
MetricFu.base_directory,
'report.yml')
MetricFu.report.save_templatized_report
if MetricFu.report.open_in_browser?
MetricFu.report.show_in_browser(MetricFu.output_directory)
end
end
desc "Generates aggregated metrics by file on CSV format"
task :csv => [:all] do
require 'yaml'
require 'csv'
generate_csv(File.join(MetricFu.base_directory, 'metrics.csv'))
end
end
def generate_csv(out)
metrics = YAML.load_file(File.join(MetricFu.base_directory, 'report.yml'))
aggregated_results = {}
metrics[:rcov].each_pair do |filename, v|
next if filename == :global_percent_run
aggregated_results[filename] ||= {}
aggregated_results[filename][:coverage] = v[:percent_run]
end if metrics[:rcov]
metrics[:flog][:pages].each do |k, v|
filename = k[:path].sub(/^\//, '')
aggregated_results[filename] ||= {}
aggregated_results[filename][:flog_total] = k[:score]
aggregated_results[filename][:flog_methods] = k[:scanned_methods].length
aggregated_results[filename][:flog_average] = k[:average_score]
aggregated_results[filename][:flog_highest] = k[:highest_score]
end if metrics[:flog]
metrics[:saikuro][:files].each do |k, v|
filename = k[:path].sub(/.*\/scratch\/saikuro\//, '')
filename = filename.sub(/_cyclo\.html$/, '')
complexity = 0.0
size = 0
k[:classes].each do |klass|
complexity += klass[:complexity]
size += klass[:lines]
end
aggregated_results[filename] ||= {}
aggregated_results[filename][:complexity] = complexity
aggregated_results[filename][:size] = size
end if metrics[:saikuro]
metrics[:flay][:matches].each do |dup_match|
score = dup_match[:reason].match(/mass.*= (\d+)/)[1].to_i rescue 0
dup_match[:matches].each do |file|
filename = file[:name]
aggregated_results[filename][:flay] ||= 0
aggregated_results[filename][:flay] += score
end
end if metrics[:flay]
outfile = File.open(out, 'wb')
now = DateTime.now
CSV::Writer.generate(outfile) do |csv|
csv << ['Filename', 'Date', 'Size', 'Complexity', 'Coverage', 'Flog total', 'Flog methods', 'Flog average', 'Flog highest', 'Flay']
aggregated_results.each do |filename, metrics|
csv << [filename, now.strftime('%d/%m/%Y'), metrics[:size], metrics[:complexity], (metrics[:coverage] || 0), (metrics[:flog_total] || 0), (metrics[:flog_methods] || 0), (metrics[:flog_average] || 0), (metrics[:flog_highest] || 0), (metrics[:flay] || 0)]
end
end
rescue Errno::ENOENT
raise "report.yml file not found. Try running rake metrics:all before running this script"
ensure
outfile.close if outfile
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment