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 CHANGED
@@ -1,2 +1,7 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new
6
+
7
+ task :default => :spec
@@ -16,4 +16,6 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Emma::VERSION
17
17
 
18
18
  gem.add_dependency "childprocess"
19
+ gem.add_dependency "nokogiri"
20
+ gem.add_development_dependency "rspec", "~> 2.0"
19
21
  end
@@ -1,7 +1,10 @@
1
- require "emma/version"
2
1
  require 'childprocess'
2
+ require 'nokogiri'
3
3
  require 'tempfile'
4
+
5
+ require "emma/version"
4
6
  require 'emma/control'
7
+ require 'emma/report'
5
8
 
6
9
  module Emma
7
10
  class Error < StandardError
@@ -30,16 +30,17 @@ module Emma
30
30
  end
31
31
 
32
32
  def instrument(paths, opts = {})
33
- paths = Array(paths)
34
- mode = opts[:mode] || 'fullcopy'
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', 'yes',
43
+ '-merge', merge,
43
44
  '-filter', filter,
44
45
  '-verbose',
45
46
  *inputs
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Emma
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -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>
@@ -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: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
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: