[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-talk
Subject:    Re: code that has been reached
From:       Simon Strandgaard <neoneye () adslhome ! dk>
Date:       2004-02-04 9:35:04
Message-ID: pan.2004.02.04.09.26.42.335507 () adslhome ! dk
[Download RAW message or body]

On Wed, 04 Feb 2004 00:46:20 +0900, nobu.nokad wrote:
> At Wed, 4 Feb 2004 00:30:04 +0900,
> Simon Strandgaard wrote:
>> If I do "cat report.txt" then my terminal just scrolls for 10 seconds,
>> which is much larger than what my terminal history can remember.
>> If I pipe it into "less" then the coloring disappears. How do you view
>> ANSI files?  
> 
> less -r

Thanks..

I have done some improvements to the original 'coverage.rb', so that
HTML is now generated. For an example have a look at:
http://neoneye.dk/parser.rb.coverage.html

As you may notice comments/arrays appears as if they are not executed!
How can I fix this?

--
Simon Strandgaard

module PrettyCoverage
  class HTML
    def initialize
      @files = {}
    end
    def execute
      puts "execute"
      @files.each{|file, line_marked|
        create_file(file, line_marked)
      }
      create_file_index
    end
    def mk_filename(name)  
      name+".coverage.html" 
    end
    def create_file_index
      output_filename = "index.html"
      rows = []
      @files.each{|file, line_marked|
        filename = mk_filename(file)
        rows << "<tr><td><a href=\"#{filename}\">#{file}</a></td></tr>"
      }
      result = rows.join("\n")
      body = "<table>#{result}</table>"
      title = "coverage"
      css = <<EOCSS
body {
  background-color: rgb(180, 180, 180);
}
div.marked {
  background-color: rgb(185, 200, 200);
}
div.overview {
  border-bottom: 8px solid black;
}
EOCSS
      html = <<EOHTML 
<html><head><title>#{title}</title>
<style type="text/css">#{css}</style></head>
<body>#{body}</body></html> 
EOHTML
      File.open(output_filename, "w+") do |f|
        f.puts html
      end
    end
    def add_file(file, line_marked)
      percent = calc_coverage(line_marked)
      printf("file=#{file} coverage=%02.1f%\n", percent)
      @files[file] = line_marked
    end
    def calc_coverage(line_marked)
      marked = line_marked.transpose[1]
      n = marked.inject(0) {|r, i| (i) ? (r+1) : r } 
      percent = n.to_f * 100 / marked.size
    end
    def format_overview(file, line_marked)
      percent = "%02.1f" % calc_coverage(line_marked)
      html = <<EOHTML
<div class="overview">
<table>
<tr><td>filename</td><td><tt>#{file}</tt></td></tr>
<tr><td>coverage</td><td>#{percent}</td></tr>
</table>
</div>
EOHTML
      html
    end
    def format_lines(line_marked)
      result = ""
      last = nil
      end_of_div = ""
      format_line = "%#{line_marked.size.to_s.size}d"
      line_no = 1
      line_marked.each {|(line, marked)|
        if marked != last
          result += end_of_div
          case marked
          when true
            result += "<div class=\"marked\">"
            end_of_div = "</div>"
          when false
            end_of_div = ""
          end
        end
        result += (format_line % line_no) + " " + line + "\n"
        last = marked
        line_no += 1
      }
      result += end_of_div
      "<pre>#{result}</pre>"
    end
    def create_file(file, line_marked)
      output_filename = mk_filename(file)
      puts "outputting #{output_filename.inspect}"
      body = 
        format_overview(file, line_marked) + 
        format_lines(line_marked)
      title = file + " - coverage"
      css = <<EOCSS
body {
  background-color: rgb(180, 180, 180);
}
div.marked {
  background-color: rgb(185, 200, 200);
}
div.overview {
  border-bottom: 8px solid black;
}
EOCSS
      html = <<EOHTML 
<html><head><title>#{title}</title>
<style type="text/css">#{css}</style></head>
<body>#{body}</body></html> 
EOHTML
      File.open(output_filename, "w+") do |f|
        f.puts html
      end
    end
  end
end

SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__

module COVERAGE__
  COVER = {}
  def self.trace_func(event, file, line, id, binding, klass)
    case event
    when 'c-call', 'c-return', 'class'
      return
    end
    COVER[file] ||= []
    COVER[file][line] ||= 0
    COVER[file][line] += 1
  end

  END {
    set_trace_func(nil)
  printer = PrettyCoverage::HTML.new
    COVER.each do |file, lines|
    next if SCRIPT_LINES__.has_key?(file) == false
    lines = SCRIPT_LINES__[file]
    covers = COVER[file]
    line_status = []
    0.upto(lines.size - 1) do |c|
      line = lines[c].chomp
      marked = false
      if covers[c + 1]
        marked = true
      elsif /^\s*(?:begin\s*(?:#.*)?|ensure\s*(?:#.*)?|else\s*(?:#.*)?)$/ =~ line and covers[c + 1 + 1]
        covers[c + 1] = covers[c + 1 + 1]
        marked = true
      elsif /^\s*(?:end|})\s*$/ =~ line && covers[c + 1 - 1]
        covers[c + 1] = covers[c + 1 - 1]
        marked = true
      end
      line_status << [line, marked]
    end
    printer.add_file(file, line_status)
    end
  printer.execute
  }

  set_trace_func(COVERAGE__.method(:trace_func).to_proc)
end

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic