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