lib/metric_fu/heckle.rb in p8-metric_fu-0.9.0.6 vs lib/metric_fu/heckle.rb in p8-metric_fu-0.9.0.7

- old
+ new

@@ -1,37 +1,119 @@ module MetricFu def self.generate_heckle_report - Heckle.generate_report - system("open #{Heckle.metric_dir}/index.html") if open_in_browser? + Heckle::Generator.generate_report + system("open #{Heckle::Generator.metric_dir}/index.html") if open_in_browser? end + + module Heckle - class Heckle < Base::Generator + class Generator < Base::Generator - def analyze - files_to_heckle = MetricFu.heckle[:dirs_to_heckle].map{|dir| Dir[File.join(dir, "**/*.rb")] } - class_names = files_to_heckle.flatten.collect do |f| - buffer = open(f).readlines.join("\n") - outline = buffer.scan(/class\s+([\w|:]*)+?/) - klass = path_to_classname(f).split('::').last - end - class_names.flatten! - output = '' - ObjectSpace.each_object(Class) do |klass| - class_names.each do |name| - if klass.name =~ /::#{name}$/ - res = `heckle #{name} -t spec/**/#{name}_spec.rb` - output << res + def analyze + files_to_heckle = MetricFu.heckle[:dirs_to_heckle].map{|dir| Dir[File.join(dir, "**/*.rb")] } + class_names = files_to_heckle.flatten.collect do |f| + buffer = open(f).readlines.join("\n") + outline = buffer.scan(/class\s+([\w|:]*)+?/) + klass = path_to_classname(f).split('::').last + end + class_names.flatten! + output = {} + ObjectSpace.each_object(Class) do |klass| + class_names.each do |name| + if klass.name =~ /::#{name}$/ + output[name] = `heckle #{name} -t spec/**/#{underscore(name)}_spec.rb` + end end end + + @pages = [] + output.each_pair do |name, content| + page = Page.new(content) + if page + page.filename = name + @pages << page + end + end + generate_pages end - @matches = output.chomp.split("\n\n").map{|m| m.split("\n") } - end - def path_to_classname(s) - f = s.sub(/^lib/, '').sub(/\.rb$/, '').split('/') - f = f.map { |path| path.split(/_/).map { |seg| seg.capitalize }.join } - f.join('::') + def generate_pages + @pages.each do |page| + #unless MetricFu::MD5Tracker.file_already_counted?(page.filename) + generate_page(page) + #end + end + save_html(ERB.new(File.read(template_file)).result(binding)) + end + + def generate_page(page) + save_html(page.to_html, page.path) + end + + def path_to_classname(s) + f = s.sub(/^lib/, '').sub(/\.rb$/, '').split('/') + f = f.map { |path| path.split(/_/).map { |seg| seg.capitalize }.join } + f.join('::') + end + + def underscore(camel_cased_word) + camel_cased_word.to_s.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + gsub("-", "_"). + downcase + end + + def self.template_name + "heckle" + end + end + class Page < MetricFu::Base::Generator + attr_accessor :filename, :content, :mutations, :score + + def initialize(content) + @content = parse(content) + end + + def parse(content) + split_content = content.split("\n\n") + method = split_content.shift + split_content.shift + doc = split_content.shift + split_content.pop + split_content.pop + split_content.pop + @mutations = split_content + end + + def path + @path ||= File.basename(filename, ".txt") + '.html' + end + + def to_html + ERB.new(File.read(template_file)).result(binding) + end + + def average_score + return 0 if scanned_methods.length == 0 + sum = 0 + scanned_methods.each do |m| + sum += m.score + end + sum / scanned_methods.length + end + + def highest_score + scanned_methods.inject(0) do |highest, m| + m.score > highest ? m.score : highest + end + end + + def template_name + 'heckle_page' + end + end end end \ No newline at end of file