emma 0.0.2 → 0.0.3
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/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:
|