emma 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +5 -0
- data/emma.gemspec +2 -0
- data/lib/emma.rb +4 -1
- data/lib/emma/control.rb +4 -3
- data/lib/emma/report.rb +155 -0
- data/lib/emma/version.rb +1 -1
- data/spec/emma/report_spec.rb +55 -0
- data/spec/fixtures/coverage.xml +76 -0
- data/spec/spec_helper.rb +1 -0
- metadata +40 -5
data/Rakefile
CHANGED
data/emma.gemspec
CHANGED
data/lib/emma.rb
CHANGED
data/lib/emma/control.rb
CHANGED
@@ -30,16 +30,17 @@ module Emma
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def instrument(paths, opts = {})
|
33
|
-
paths
|
34
|
-
mode
|
33
|
+
paths = Array(paths)
|
34
|
+
mode = opts[:mode] || 'fullcopy'
|
35
35
|
filter = opts[:filter] || '*'
|
36
|
+
merge = opts[:merge] == false ? 'no' : 'yes'
|
36
37
|
|
37
38
|
inputs = paths.map { |path| ['-instrpath', path] }.flatten
|
38
39
|
|
39
40
|
emma 'instr',
|
40
41
|
'-outmode', mode,
|
41
42
|
'-outfile', @em,
|
42
|
-
'-merge',
|
43
|
+
'-merge', merge,
|
43
44
|
'-filter', filter,
|
44
45
|
'-verbose',
|
45
46
|
*inputs
|
data/lib/emma/report.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
module Emma
|
2
|
+
class Report
|
3
|
+
def self.from(file)
|
4
|
+
new Nokogiri::XML.parse(File.read(file)), file
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(doc, uri = nil)
|
8
|
+
@doc = doc
|
9
|
+
@uri = uri
|
10
|
+
end
|
11
|
+
|
12
|
+
def inspect
|
13
|
+
'#<%s:0x%x %s>' % [self.class, hash, "uri=#{@uri}"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def stats
|
17
|
+
@stats ||= {
|
18
|
+
:packages => fetch_stat('packages'),
|
19
|
+
:classes => fetch_stat("classes"),
|
20
|
+
:methods => fetch_stat("methods"),
|
21
|
+
:source_files => fetch_stat("srcfiles"),
|
22
|
+
:source_lines => fetch_stat("srclines"),
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def data
|
27
|
+
el = @doc.css("report data all").first or raise Error, "invalid coverage report (missing report data)"
|
28
|
+
Node.new el
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def stats_node
|
34
|
+
@stats_node ||= @doc.css("report stats").first or raise Error, "invalid coverage report (missing report stats)"
|
35
|
+
end
|
36
|
+
|
37
|
+
def fetch_stat(name)
|
38
|
+
node = stats_node.css(name).first or raise Error, "could not find stats for #{name}"
|
39
|
+
Integer(node['value'])
|
40
|
+
end
|
41
|
+
|
42
|
+
class Node
|
43
|
+
attr_reader :parent
|
44
|
+
|
45
|
+
def initialize(element)
|
46
|
+
@element = element
|
47
|
+
end
|
48
|
+
|
49
|
+
def inspect
|
50
|
+
'#<%s:0x%x %s>' % [self.class, hash, "type=#{type.inspect} name=#{name.inspect}"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def type
|
54
|
+
@element.name.to_sym
|
55
|
+
end
|
56
|
+
|
57
|
+
def packages
|
58
|
+
nodes_from @element.xpath(".//package")
|
59
|
+
end
|
60
|
+
|
61
|
+
def classes
|
62
|
+
nodes_from @element.xpath(".//class")
|
63
|
+
end
|
64
|
+
|
65
|
+
def source_files
|
66
|
+
nodes_from @element.xpath(".//srcfile")
|
67
|
+
end
|
68
|
+
|
69
|
+
def methods
|
70
|
+
nodes_from @element.xpath(".//method")
|
71
|
+
end
|
72
|
+
|
73
|
+
def name
|
74
|
+
name = @element['name']
|
75
|
+
parent = @element.parent
|
76
|
+
if parent and not ['data', 'all'].include? parent.name
|
77
|
+
name = [Node.new(parent).name, name].join ':'
|
78
|
+
end
|
79
|
+
|
80
|
+
name
|
81
|
+
end
|
82
|
+
|
83
|
+
def coverages
|
84
|
+
@coverages ||= Coverages.new(
|
85
|
+
coverage_value_for('class'),
|
86
|
+
coverage_value_for('method'),
|
87
|
+
coverage_value_for('block'),
|
88
|
+
coverage_value_for('line')
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def nodes_from(elements)
|
95
|
+
elements.map { |e| Node.new e }
|
96
|
+
end
|
97
|
+
|
98
|
+
def coverage_value_for(name)
|
99
|
+
node = @element.xpath("./coverage[contains(@type, '#{name}')]").first
|
100
|
+
node or raise Error, "could not find coverage element for #{name} in #{@element}"
|
101
|
+
|
102
|
+
if node['value'] =~ /^(\d+)%\s+\(([\d.]+)\/([\d.]+)\)/
|
103
|
+
Coverage.new Integer($1), Float($2), Float($3)
|
104
|
+
else
|
105
|
+
raise Error, "unable to parse #{node['value'].inspect}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Coverages
|
111
|
+
attr_reader :klass, :method, :block, :line
|
112
|
+
|
113
|
+
def initialize(klass, method, block, line)
|
114
|
+
@klass = klass
|
115
|
+
@method = method
|
116
|
+
@block = block
|
117
|
+
@line = line
|
118
|
+
end
|
119
|
+
|
120
|
+
def as_json(opts = nil)
|
121
|
+
{
|
122
|
+
:class => klass,
|
123
|
+
:method => method,
|
124
|
+
:block => block,
|
125
|
+
:line => line
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
def to_json(*args)
|
130
|
+
as_json.to_json(*args)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class Coverage
|
135
|
+
attr_reader :percent, :covered, :total
|
136
|
+
|
137
|
+
def initialize(percent, covered, total)
|
138
|
+
@percent, @covered, @total = percent, covered, total
|
139
|
+
end
|
140
|
+
|
141
|
+
def as_json(opts = nil)
|
142
|
+
{
|
143
|
+
:percent => @percent,
|
144
|
+
:covered => @covered,
|
145
|
+
:total => @total
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
149
|
+
def to_json(*args)
|
150
|
+
as_json.to_json(*args)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
data/lib/emma/version.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Emma
|
4
|
+
describe Report do
|
5
|
+
before(:all) do
|
6
|
+
@report = Report.from File.expand_path("../../fixtures/coverage.xml", __FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "has stats" do
|
10
|
+
@report.stats.should == {
|
11
|
+
:packages => 624,
|
12
|
+
:classes => 5919,
|
13
|
+
:methods => 57688,
|
14
|
+
:source_files => 3973,
|
15
|
+
:source_lines => 265538,
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has packages" do
|
20
|
+
@report.data.packages.size.should == 1
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has source files" do
|
24
|
+
@report.data.source_files.size.should == 1
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has classes" do
|
28
|
+
@report.data.classes.size.should == 1
|
29
|
+
end
|
30
|
+
|
31
|
+
it "has methods" do
|
32
|
+
@report.data.methods.size.should == 7
|
33
|
+
end
|
34
|
+
|
35
|
+
it "knows the coverages of an element" do
|
36
|
+
cov = @report.data.source_files.first.coverages
|
37
|
+
|
38
|
+
cov.line.percent.should == 0
|
39
|
+
cov.line.total.should == 58.0
|
40
|
+
cov.line.covered.should == 0
|
41
|
+
|
42
|
+
cov.method.percent.should == 0
|
43
|
+
cov.method.total.should == 7.0
|
44
|
+
cov.method.covered.should == 0
|
45
|
+
|
46
|
+
cov.block.percent.should == 0
|
47
|
+
cov.block.total.should == 325.0
|
48
|
+
cov.block.covered.should == 0
|
49
|
+
|
50
|
+
cov.klass.percent.should == 0
|
51
|
+
cov.klass.total.should == 1.0
|
52
|
+
cov.klass.covered.should == 0
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><!-- EMMA v2.1.5320 (stable) report, generated Tue Feb 07 20:57:00 CET 2012 -->
|
2
|
+
|
3
|
+
<report>
|
4
|
+
<stats>
|
5
|
+
<packages value="624"/>
|
6
|
+
<classes value="5919"/>
|
7
|
+
<methods value="57688"/>
|
8
|
+
<srcfiles value="3973"/>
|
9
|
+
<srclines value="265538"/>
|
10
|
+
</stats>
|
11
|
+
<data>
|
12
|
+
<all name="all classes">
|
13
|
+
<coverage type="class, %" value="30% (1776/5919)"/>
|
14
|
+
<coverage type="method, %" value="9% (5062/57688)"/>
|
15
|
+
<coverage type="block, %" value="5% (60043/1162547)"/>
|
16
|
+
<coverage type="line, %" value="5% (14026.7/265538)"/>
|
17
|
+
|
18
|
+
<package name="com.example.actions.map">
|
19
|
+
<coverage type="class, %" value="0% (0/1)"/>
|
20
|
+
<coverage type="method, %" value="0% (0/7)"/>
|
21
|
+
<coverage type="block, %" value="0% (0/325)"/>
|
22
|
+
<coverage type="line, %" value="0% (0/58)"/>
|
23
|
+
|
24
|
+
<srcfile name="MapAction.java">
|
25
|
+
<coverage type="class, %" value="0% (0/1)"/>
|
26
|
+
<coverage type="method, %" value="0% (0/7)"/>
|
27
|
+
<coverage type="block, %" value="0% (0/325)"/>
|
28
|
+
<coverage type="line, %" value="0% (0/58)"/>
|
29
|
+
|
30
|
+
<class name="MapAction">
|
31
|
+
<coverage type="class, %" value="0% (0/1)"/>
|
32
|
+
<coverage type="method, %" value="0% (0/7)"/>
|
33
|
+
<coverage type="block, %" value="0% (0/325)"/>
|
34
|
+
<coverage type="line, %" value="0% (0/58)"/>
|
35
|
+
|
36
|
+
<method name="MapAction (): void">
|
37
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
38
|
+
<coverage type="block, %" value="0% (0/9)"/>
|
39
|
+
<coverage type="line, %" value="0% (0/3)"/>
|
40
|
+
</method>
|
41
|
+
<method name="extendService (HttpServletRequest, HttpServletResponse): void">
|
42
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
43
|
+
<coverage type="block, %" value="0% (0/53)"/>
|
44
|
+
<coverage type="line, %" value="0% (0/10)"/>
|
45
|
+
</method>
|
46
|
+
<method name="handleParameters (HttpServletRequest): Map">
|
47
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
48
|
+
<coverage type="block, %" value="0% (0/127)"/>
|
49
|
+
<coverage type="line, %" value="0% (0/19)"/>
|
50
|
+
</method>
|
51
|
+
<method name="handleSearchParameters (HttpServletRequest, Map): void">
|
52
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
53
|
+
<coverage type="block, %" value="0% (0/59)"/>
|
54
|
+
<coverage type="line, %" value="0% (0/8)"/>
|
55
|
+
</method>
|
56
|
+
<method name="handleShowPin (HttpServletRequest, Map): void">
|
57
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
58
|
+
<coverage type="block, %" value="0% (0/35)"/>
|
59
|
+
<coverage type="line, %" value="0% (0/8)"/>
|
60
|
+
</method>
|
61
|
+
<method name="rp (HttpServletRequest, String): String">
|
62
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
63
|
+
<coverage type="block, %" value="0% (0/5)"/>
|
64
|
+
<coverage type="line, %" value="0% (0/1)"/>
|
65
|
+
</method>
|
66
|
+
<method name="setupDefaultMap (Map): void">
|
67
|
+
<coverage type="method, %" value="0% (0/1)"/>
|
68
|
+
<coverage type="block, %" value="0% (0/37)"/>
|
69
|
+
<coverage type="line, %" value="0% (0/9)"/>
|
70
|
+
</method>
|
71
|
+
</class>
|
72
|
+
</srcfile>
|
73
|
+
</package>
|
74
|
+
</all>
|
75
|
+
</data>
|
76
|
+
</report>
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'emma'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: emma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jari Bakken
|
@@ -31,6 +31,35 @@ dependencies:
|
|
31
31
|
version: "0"
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: nokogiri
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 2
|
59
|
+
- 0
|
60
|
+
version: "2.0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
34
63
|
description: CLI wrapper for the Emma Java library http://emma.sourceforge.net/
|
35
64
|
email:
|
36
65
|
- jari.bakken@gmail.com
|
@@ -51,7 +80,11 @@ files:
|
|
51
80
|
- lib/emma.rb
|
52
81
|
- lib/emma/control.rb
|
53
82
|
- lib/emma/emma.jar
|
83
|
+
- lib/emma/report.rb
|
54
84
|
- lib/emma/version.rb
|
85
|
+
- spec/emma/report_spec.rb
|
86
|
+
- spec/fixtures/coverage.xml
|
87
|
+
- spec/spec_helper.rb
|
55
88
|
homepage: http://github.com/jarib/emma-rb
|
56
89
|
licenses: []
|
57
90
|
|
@@ -85,6 +118,8 @@ rubygems_version: 1.8.15
|
|
85
118
|
signing_key:
|
86
119
|
specification_version: 3
|
87
120
|
summary: CLI wrapper for the Emma Java library http://emma.sourceforge.net/
|
88
|
-
test_files:
|
89
|
-
|
121
|
+
test_files:
|
122
|
+
- spec/emma/report_spec.rb
|
123
|
+
- spec/fixtures/coverage.xml
|
124
|
+
- spec/spec_helper.rb
|
90
125
|
has_rdoc:
|