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 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: