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