gcov2x 0.2.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 86e9963bfe5c1d5e50a80853ce8e9772123efd9f
4
+ data.tar.gz: 7c201f588c22f3f5c2296e3e45874518cf084ad8
5
+ SHA512:
6
+ metadata.gz: c2551f66a91913ef11c5a54e877bb7801a7ced9b320e1349a51505deaa09d226c09402aa9d4131f7735031b62f62257184d4102cfc5bff8400357fe7b5d054d4
7
+ data.tar.gz: 57b0e1c8d95ccc1ae41eb0859abbe792306da800f953a6c42139e33e9868d8c33576bc82dd153ebeae2d2c2dc63b310058d8fbad34652772a6dfb40928861332
data/.gitignore ADDED
@@ -0,0 +1,37 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ # Gemfile.lock
30
+ # .ruby-version
31
+ # .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
35
+
36
+ ## Emacs
37
+ *~
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ ruby "2.1.0"
4
+
5
+ gem "rspec"
6
+ gem "terminal-table"
7
+ gem "term-ansicolor"
8
+ gem "mixlib-cli"
9
+ gem 'gyoku', '~> 1.0'
10
+ gem 'rake'
11
+ gem 'rubygems-tasks'
data/Gemfile.lock ADDED
@@ -0,0 +1,38 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ builder (3.2.2)
5
+ diff-lcs (1.2.5)
6
+ gyoku (1.2.2)
7
+ builder (>= 2.1.2)
8
+ mixlib-cli (1.5.0)
9
+ rake (10.3.2)
10
+ rspec (3.1.0)
11
+ rspec-core (~> 3.1.0)
12
+ rspec-expectations (~> 3.1.0)
13
+ rspec-mocks (~> 3.1.0)
14
+ rspec-core (3.1.7)
15
+ rspec-support (~> 3.1.0)
16
+ rspec-expectations (3.1.2)
17
+ diff-lcs (>= 1.2.0, < 2.0)
18
+ rspec-support (~> 3.1.0)
19
+ rspec-mocks (3.1.3)
20
+ rspec-support (~> 3.1.0)
21
+ rspec-support (3.1.2)
22
+ rubygems-tasks (0.2.4)
23
+ term-ansicolor (1.3.0)
24
+ tins (~> 1.0)
25
+ terminal-table (1.4.5)
26
+ tins (1.3.3)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ gyoku (~> 1.0)
33
+ mixlib-cli
34
+ rake
35
+ rspec
36
+ rubygems-tasks
37
+ term-ansicolor
38
+ terminal-table
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Mattias Bergbom
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ gcov2x
2
+ ======
3
+
4
+ ![Travis CI Status](https://travis-ci.org/mattiasbergbom/gcov2x.svg)
5
+
6
+ **gcov2x** takes coverage data emitted from [llvm-cov](http://llvm.org/docs/CommandGuide/llvm-cov.html) and aggregates it into various formats, some more easily interpreted by humans, some better suited for machines.
7
+
8
+ Quick Start
9
+ -----------
10
+
11
+ First, unless you haven't already done so, compile your project using ```clang --coverage``` and digest the output using ```llvm-cov``` (see the `src` dir for examples). You should end up with one or more ```.gcov``` files.
12
+
13
+ Next, install the gem:
14
+
15
+ ```gem install gcov2x```
16
+
17
+ This should furnish you with a ```gcov2x``` executable in your path.
18
+
19
+ Finally, execute ```gcov2x``` in one of multiple possible ways. For instance, generate a HTML coverage report:
20
+
21
+ ```gcov2x --format html *.gcov > coverage.html```
22
+
23
+ Disclaimer
24
+ ----------
25
+ This is a work in progress.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ Dir['tasks/**/*.rake'].sort.each { |lib| load lib }
2
+
data/bin/gcov2x ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'mixlib/cli'
4
+
5
+ require_relative '../lib/gcov2x'
6
+ require_relative '../lib/ansii_formatter'
7
+ require_relative '../lib/xml_formatter'
8
+ require_relative '../lib/html_formatter'
9
+
10
+ class Util
11
+ def Util.opt_wrap(s, width=61)
12
+ s.gsub(/(.{1,#{width}})(\s+|\Z)/, "\\1\n ")
13
+ end
14
+ end
15
+
16
+ class CGOV_CLI
17
+ include Mixlib::CLI
18
+
19
+ option :filter,
20
+ :long => "--filter FILTER",
21
+ :description => Util.opt_wrap("A regex filter which specifies which files not to include in the conversion. Will filter on the actual filename (replacing any mangling done by llvm-cov using #'s) as well as the 'Source' meta attribute in the GCOV data. Available presets:
22
+ xcode - Xcode system headers
23
+ linux - Linux system headers
24
+ "),
25
+ :proc => Proc.new { |f| (f.size > 0 and f[0] == ":" ? f[1..-1].to_sym : f ) }
26
+
27
+ option :format,
28
+ :short => "-f FORMAT",
29
+ :long => "--format FORMAT",
30
+ :description => Util.opt_wrap("The output format (ascii, html, xml, json)"),
31
+ :proc => Proc.new { |f| f.to_sym }
32
+
33
+ option :css,
34
+ :short => "-c CSS",
35
+ :long => "--css CSS",
36
+ :description => Util.opt_wrap("CSS file to reference in HTML output.")
37
+
38
+ option :xsl,
39
+ :short => "-x XSL",
40
+ :long => "--xsl XSL",
41
+ :description => Util.opt_wrap("XSL file to reference in XML output.")
42
+
43
+ option :recursive,
44
+ :short => "-r",
45
+ :long => "--recursive",
46
+ :description => Util.opt_wrap("Recursively load all .gcov files in the given directory"),
47
+ :on => :tail,
48
+ :boolean => true
49
+
50
+ option :help,
51
+ :short => "-h",
52
+ :long => "--help",
53
+ :description => Util.opt_wrap("Show this message"),
54
+ :on => :tail,
55
+ :boolean => true,
56
+ :show_options => true,
57
+ :exit => 0
58
+
59
+ end
60
+
61
+ cli = CGOV_CLI.new
62
+ filenames = cli.parse_options
63
+
64
+ fail "Got no filename" unless filenames.is_a? Array and filenames.count > 0
65
+
66
+ STDERR.puts "filter: #{cli.config[:filter]}"
67
+
68
+ proj = GCOV::Project.new
69
+
70
+ filter = case cli.config[:filter]
71
+ when :xcode then /Developer\/Toolchains\/.*\/usr\/include\//
72
+ when :linux then /\/usr\/include\//
73
+ else /#{cli.config[:filter]}/
74
+ end
75
+
76
+ STDERR.puts "filter regex: #{filter}"
77
+
78
+ filenames.each do |filename|
79
+ if File.directory? filename
80
+ proj.add_dir filename, :recursive => cli.config[:recursive], :filter => filter
81
+ elsif File.file? filename
82
+ proj.add_file filename, :filter => filter
83
+ end
84
+ end
85
+
86
+ case cli.config[:format]
87
+ when :ascii then
88
+ formatter = GCOV::ANSIIFormatter.new proj
89
+ formatter.print
90
+ when :html then
91
+ formatter = GCOV::HTMLFormatter.new( proj, :css => cli.config[:css] )
92
+ formatter.print
93
+ when :xml then
94
+ formatter = GCOV::XMLFormatter.new( proj, :xsl => cli.config[:xsl] )
95
+ formatter.print
96
+ when :json then
97
+ fail "json export not implemented yet"
98
+ else
99
+ fail "Invalid format"
100
+ end
101
+
data/gcov2x.gemspec ADDED
@@ -0,0 +1,15 @@
1
+ require File.expand_path('../lib/version.rb', __FILE__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'gcov2x'
5
+ gem.version = GCOV::VERSION
6
+ gem.date = '2014-12-09'
7
+ gem.summary = "gcov parser and formatter"
8
+ gem.description = "gcov2x digests .gcov files generated by llvm-cov and translates them into various common formats"
9
+ gem.authors = ["Mattias Bergbom"]
10
+ gem.email = 'mattias.bergbom@gmail.com'
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = ["gcov2x"]
13
+ gem.homepage = 'http://rubygems.org/gems/gcov2x'
14
+ gem.license = 'MIT'
15
+ end
@@ -0,0 +1,34 @@
1
+ require 'term/ansicolor'
2
+ include Term::ANSIColor
3
+
4
+ require_relative './project'
5
+ require_relative './file'
6
+ require_relative './line'
7
+
8
+ module GCOV
9
+
10
+ class ANSIIFormatter
11
+
12
+ def initialize project
13
+ @project = project
14
+ end
15
+
16
+ def print
17
+
18
+ @project.files.each do |file|
19
+ puts "#{white}#{bold}=== #{file.meta['Source']} ===#{reset}"
20
+ file.lines.select{|line| line.number > 0}.each do |line|
21
+ col = case line.count
22
+ when :none then dark+white
23
+ when :missed then black+on_red
24
+ else green
25
+ end
26
+ puts col + line.text + reset
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
data/lib/file.rb ADDED
@@ -0,0 +1,84 @@
1
+ require_relative './line'
2
+
3
+ class TrueClass
4
+ def to_i
5
+ return 1
6
+ end
7
+ end
8
+
9
+ class FalseClass
10
+ def to_i
11
+ return 0
12
+ end
13
+ end
14
+
15
+ module GCOV
16
+
17
+ class File
18
+
19
+ attr_reader :name, :lines, :meta, :stats
20
+
21
+ def initialize name
22
+ fail "name required" unless name and name.is_a? String
23
+ @name = name
24
+ @lines = []
25
+ @meta = {}
26
+ @stats = {}
27
+ end
28
+
29
+ def add_lines &block
30
+ fail "add_lines requires a block" unless block_given?
31
+ @adding = true
32
+ yield
33
+ @adding = false
34
+ _update_stats
35
+ end
36
+
37
+ def _update_stats
38
+ @stats = {
39
+ :missed_lines => 0,
40
+ :exec_lines => 0,
41
+ :empty_lines => 0,
42
+ :total_exec => 0,
43
+ :total_lines => 0,
44
+ :lines => 0,
45
+ :coverage => 0.0
46
+ }
47
+
48
+ @lines.each do |line|
49
+ @stats[:missed_lines] += (line.state == :missed).to_i
50
+ @stats[:exec_lines] += (line.state == :exec).to_i
51
+ @stats[:total_exec] += (line.count.is_a?(Integer) ? line.count : 0 )
52
+ @stats[:empty_lines] += (line.state == :none).to_i
53
+ end
54
+
55
+ @stats[:lines] = @stats[:exec_lines] + @stats[:missed_lines]
56
+ @stats[:total_lines] = @stats[:lines] + @stats[:empty_lines]
57
+ @stats[:coverage] = @stats[:exec_lines].to_f / @stats[:lines].to_f
58
+ @stats[:coverage_s] = sprintf("%0.01f%",100.0*@stats[:coverage])
59
+ end
60
+
61
+ def <<(line)
62
+ fail "need to be in add_lines block" unless @adding
63
+ if line.number == 0
64
+ key,val = /([^:]+):(.*)$/.match(line.text).to_a[1..2]
65
+ @meta[key] = val
66
+ else
67
+ @lines << line
68
+ end
69
+ end
70
+
71
+ def self.load filename
72
+ file = GCOV::File.new filename
73
+ ::File.open(filename, "r") do |file_handle|
74
+ file.add_lines do
75
+ file_handle.each_line do |line|
76
+ file << GCOV::Line.parse(line)
77
+ end
78
+ end
79
+ end
80
+ file
81
+ end
82
+ end
83
+
84
+ end
data/lib/gcov2x.rb ADDED
@@ -0,0 +1,4 @@
1
+ require_relative './line'
2
+ require_relative './file'
3
+ require_relative './project'
4
+ require_relative './version'
@@ -0,0 +1,68 @@
1
+
2
+ require_relative './project'
3
+ require_relative './file'
4
+ require_relative './line'
5
+
6
+ require 'erb'
7
+ require 'cgi'
8
+
9
+ module GCOV
10
+
11
+ class HTMLFormatter
12
+
13
+ def get_binding # this is only a helper method to access the objects binding method
14
+ binding
15
+ end
16
+
17
+ def initialize project, va={}
18
+ @project = project
19
+ @css = va[:css]
20
+
21
+ if !@css
22
+ @csslink = <<EOF
23
+ <style>
24
+
25
+ </style>
26
+ EOF
27
+ else
28
+ @csslink = "<link rel=\"stylesheet\" href=\"#{@css}\" />"
29
+ end
30
+
31
+ @template = ::File.read(::File.join(::File.dirname(__FILE__),"html_view.html.erb"))
32
+ end # initialize
33
+
34
+ def class_of line
35
+ case line.count
36
+ when :none then "moot"
37
+ when :missed then "missed"
38
+ else "ok"
39
+ end
40
+ end
41
+
42
+ def class_of_stat value, &block
43
+ fail "class_of_stat needs a block" unless block_given?
44
+ return ( (yield value) ? "value" : "value_bad" )
45
+ end
46
+
47
+ def class_of_file file
48
+ case file.stats[:missed_lines]
49
+ when 0 then "header good"
50
+ else "header bad"
51
+ end
52
+ end
53
+
54
+ def encode text
55
+ CGI.escapeHTML( text )
56
+ end
57
+
58
+ def print
59
+
60
+ renderer = ERB.new( @template )
61
+
62
+ puts renderer.result(self.get_binding)
63
+
64
+ end # HTMLFormatter#print
65
+
66
+ end # HTMLFormatter
67
+
68
+ end # GCOV