"Simon Strandgaard" <neoneye / adslhome.dk> schrieb im Newsbeitrag
news:pan.2004.02.04.09.26.42.335507 / adslhome.dk...
> 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?

Dunno whether it's worth the effort.  I guess, comments could be fixed by
identifying regions of comment lines and marking them as reached if the
line above and below is reached.  For arrays you could try to find the
matching "[" for a closing "]" and mark all lines in between if the line
of the closing "]" is marked.

Apart from that: nice output!

Regards

    robert

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