class GCOVTOOLS::File

Attributes

lines[R]
meta[R]
name[R]
stats[R]

Public Class Methods

demangle(filename) click to toggle source
# File lib/file.rb, line 119
def self.demangle filename
  result = filename.dup
  if start = result.index(/###/)
    result = result[start..-1]
  end
  
  result.gsub!( /(###|#|\^|\.gcov$)/, {"###"=>"/","#"=>"/","^"=>"..",".gcov"=>""} ) 
  result = ::Pathname.new(result).cleanpath.to_s
  result
end
load(filename) click to toggle source
# File lib/file.rb, line 93
def self.load filename
  files = []
  file = nil
  ::File.open(filename, "r") do |file_handle|
    file_handle.each_line do |line_|
      line = GCOVTOOLS::Line.parse(line_)
      if line.number == 0
        key,val = /([^:]+):(.*)$/.match(line.text).to_a[1..2]
        if key == 'Source'
          if !file.nil?
            file._update_stats
            files << file
          end # if
          file = GCOVTOOLS::File.new val
        end # if source
      end # if line == 0
      file._add_line line
    end # each line
  end# file_handle
  if file
    file._update_stats
    files << file
  end # if file
  files
end
new(name) click to toggle source
# File lib/file.rb, line 22
def initialize name
  fail "name required" unless name and name.is_a? String
  @name = name
  @lines = {}
  @meta = {}
  @stats = {}
  _update_stats
end

Public Instance Methods

<<(line) click to toggle source
# File lib/file.rb, line 88
def <<(line)
  fail "need to be in add_lines block" unless @adding
  _add_line line
end
_add_line(line) click to toggle source
# File lib/file.rb, line 79
def _add_line line
  if line.number == 0
    key,val = /([^:]+):(.*)$/.match(line.text).to_a[1..2]
    @meta[key] = val
  else
    @lines[line.number] = line
  end
end
_update_stats() click to toggle source
# File lib/file.rb, line 44
def _update_stats
  @stats = { 
    :missed_lines => 0,
    :exec_lines => 0,
    :empty_lines => 0,
    :total_exec => 0,
    :total_lines => 0,
    :lines => 0,
    :coverage => 0.0,
    :hits_per_line => 0.0
  }

  @lines.each do |index,line|
    @stats[:missed_lines] += (line.state == :missed).to_i
    @stats[:exec_lines] += (line.state == :exec).to_i
    @stats[:total_exec] += (line.count.is_a?(Integer) ? line.count : 0 )
    @stats[:empty_lines] += (line.state == :none).to_i
  end
  
  @stats[:lines] = @stats[:exec_lines] + @stats[:missed_lines]
  @stats[:total_lines] = @stats[:lines] + @stats[:empty_lines]

  if @stats[:lines] > 0 
    @stats[:coverage] = @stats[:exec_lines].to_f / @stats[:lines].to_f
    @stats[:hits_per_line] = @stats[:total_exec].to_f / @stats[:lines]
  else
    @stats[:coverage] = 1
    @stats[:hits_per_line] = 0
  end
  
  @stats[:coverage_s] = sprintf("%0.01f%",100.0*@stats[:coverage])
  @stats[:hits_per_line_s] = sprintf("%0.02f",@stats[:hits_per_line])

end
add_lines() { || ... } click to toggle source
# File lib/file.rb, line 36
def add_lines &block
  fail "add_lines requires a block" unless block_given?
  @adding = true
  yield
  @adding = false
  _update_stats
end
merge(other) click to toggle source
# File lib/file.rb, line 141
def merge other
  result = self.dup
  result.merge! other
  result
end
merge!(other) click to toggle source
# File lib/file.rb, line 130
def merge! other
  other.lines.each do |line|
    if @lines.has_key? line.number
      @lines[line.number].merge! line
    else
      @lines[line.number] = line
    end
  end
  _update_stats
end