p8-metric_fu 0.9.0.6 → 0.9.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/metric_fu/heckle.rb +106 -24
- data/lib/templates/heckle.html.erb +5 -9
- data/spec/spec_helper.rb +1 -0
- metadata +2 -2
data/lib/metric_fu/heckle.rb
CHANGED
@@ -1,37 +1,119 @@
|
|
1
1
|
module MetricFu
|
2
2
|
|
3
3
|
def self.generate_heckle_report
|
4
|
-
Heckle.generate_report
|
5
|
-
system("open #{Heckle.metric_dir}/index.html") if open_in_browser?
|
4
|
+
Heckle::Generator.generate_report
|
5
|
+
system("open #{Heckle::Generator.metric_dir}/index.html") if open_in_browser?
|
6
6
|
end
|
7
|
+
|
8
|
+
module Heckle
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
10
|
+
class Generator < Base::Generator
|
11
|
+
|
12
|
+
def analyze
|
13
|
+
files_to_heckle = MetricFu.heckle[:dirs_to_heckle].map{|dir| Dir[File.join(dir, "**/*.rb")] }
|
14
|
+
class_names = files_to_heckle.flatten.collect do |f|
|
15
|
+
buffer = open(f).readlines.join("\n")
|
16
|
+
outline = buffer.scan(/class\s+([\w|:]*)+?/)
|
17
|
+
klass = path_to_classname(f).split('::').last
|
18
|
+
end
|
19
|
+
class_names.flatten!
|
20
|
+
output = {}
|
21
|
+
ObjectSpace.each_object(Class) do |klass|
|
22
|
+
class_names.each do |name|
|
23
|
+
if klass.name =~ /::#{name}$/
|
24
|
+
output[name] = `heckle #{name} -t spec/**/#{underscore(name)}_spec.rb`
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
@pages = []
|
30
|
+
output.each_pair do |name, content|
|
31
|
+
page = Page.new(content)
|
32
|
+
if page
|
33
|
+
page.filename = name
|
34
|
+
@pages << page
|
24
35
|
end
|
25
36
|
end
|
37
|
+
generate_pages
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate_pages
|
41
|
+
@pages.each do |page|
|
42
|
+
#unless MetricFu::MD5Tracker.file_already_counted?(page.filename)
|
43
|
+
generate_page(page)
|
44
|
+
#end
|
45
|
+
end
|
46
|
+
save_html(ERB.new(File.read(template_file)).result(binding))
|
26
47
|
end
|
27
|
-
@matches = output.chomp.split("\n\n").map{|m| m.split("\n") }
|
28
|
-
end
|
29
48
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
49
|
+
def generate_page(page)
|
50
|
+
save_html(page.to_html, page.path)
|
51
|
+
end
|
52
|
+
|
53
|
+
def path_to_classname(s)
|
54
|
+
f = s.sub(/^lib/, '').sub(/\.rb$/, '').split('/')
|
55
|
+
f = f.map { |path| path.split(/_/).map { |seg| seg.capitalize }.join }
|
56
|
+
f.join('::')
|
57
|
+
end
|
58
|
+
|
59
|
+
def underscore(camel_cased_word)
|
60
|
+
camel_cased_word.to_s.gsub(/::/, '/').
|
61
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
62
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
63
|
+
gsub("-", "_").
|
64
|
+
downcase
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.template_name
|
68
|
+
"heckle"
|
69
|
+
end
|
70
|
+
|
34
71
|
end
|
35
72
|
|
73
|
+
class Page < MetricFu::Base::Generator
|
74
|
+
attr_accessor :filename, :content, :mutations, :score
|
75
|
+
|
76
|
+
def initialize(content)
|
77
|
+
@content = parse(content)
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse(content)
|
81
|
+
split_content = content.split("\n\n")
|
82
|
+
method = split_content.shift
|
83
|
+
split_content.shift
|
84
|
+
doc = split_content.shift
|
85
|
+
split_content.pop
|
86
|
+
split_content.pop
|
87
|
+
split_content.pop
|
88
|
+
@mutations = split_content
|
89
|
+
end
|
90
|
+
|
91
|
+
def path
|
92
|
+
@path ||= File.basename(filename, ".txt") + '.html'
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_html
|
96
|
+
ERB.new(File.read(template_file)).result(binding)
|
97
|
+
end
|
98
|
+
|
99
|
+
def average_score
|
100
|
+
return 0 if scanned_methods.length == 0
|
101
|
+
sum = 0
|
102
|
+
scanned_methods.each do |m|
|
103
|
+
sum += m.score
|
104
|
+
end
|
105
|
+
sum / scanned_methods.length
|
106
|
+
end
|
107
|
+
|
108
|
+
def highest_score
|
109
|
+
scanned_methods.inject(0) do |highest, m|
|
110
|
+
m.score > highest ? m.score : highest
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def template_name
|
115
|
+
'heckle_page'
|
116
|
+
end
|
117
|
+
end
|
36
118
|
end
|
37
119
|
end
|
@@ -11,17 +11,13 @@
|
|
11
11
|
<p><a href="http://ruby.sadi.st/Heckle.html">Heckle</a> is a mutation tester.</p>
|
12
12
|
<table>
|
13
13
|
<tr>
|
14
|
-
<th>
|
15
|
-
<th>
|
14
|
+
<th>Class</th>
|
15
|
+
<th>Failed Mutations</th>
|
16
16
|
</tr>
|
17
|
-
<% @
|
17
|
+
<% @pages.each_with_index do |page, count| %>
|
18
18
|
<tr class='<%= cycle("light", "dark", count) %>'>
|
19
|
-
|
20
|
-
|
21
|
-
<% match[1..-1].each do |line| %>
|
22
|
-
<%= line %><br>
|
23
|
-
<% end %>
|
24
|
-
</td>
|
19
|
+
<td><a href='<%= page.path %>'><%= page.path.sub('.html', '.rb') %></a></td>
|
20
|
+
<td class='score'><%= page.mutations.size %></td>
|
25
21
|
</tr>
|
26
22
|
<% end %>
|
27
23
|
</table>
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,7 @@ require 'date'
|
|
5
5
|
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/base')
|
6
6
|
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/flay')
|
7
7
|
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/flog')
|
8
|
+
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/heckle')
|
8
9
|
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/md5_tracker')
|
9
10
|
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/churn')
|
10
11
|
require File.join(File.dirname(__FILE__), '/../lib/metric_fu/reek')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: p8-metric_fu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.0.
|
4
|
+
version: 0.9.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jake Scruggs
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date: 2009-
|
15
|
+
date: 2009-03-26 00:00:00 -07:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|