From d4a53f52163287bc69548fccc1a506112cb31fb1 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Fri, 22 Nov 2013 13:54:52 -0600 Subject: [PATCH 1/2] Move code syntax highlighting into a formatter class --- lib/metric_fu/formatter/syntax.rb | 46 +++++++++++++++++++ .../templates/awesome/awesome_template.rb | 23 ++-------- 2 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 lib/metric_fu/formatter/syntax.rb diff --git a/lib/metric_fu/formatter/syntax.rb b/lib/metric_fu/formatter/syntax.rb new file mode 100644 index 000000000..c69f20b54 --- /dev/null +++ b/lib/metric_fu/formatter/syntax.rb @@ -0,0 +1,46 @@ +require 'coderay' +MetricFu.lib_require { 'utility' } +# CodeRay options +# used to analyze source code, because object Tokens is a list of tokens with specified types. +# :tab_width – tabulation width in spaces. Default: 8 +# :css – how to include the styles (:class и :style). Default: :class) +# +# :wrap – wrap result in html tag :page, :div, :span or not to wrap (nil) +# +# :line_numbers – how render line numbers (:table, :inline, :list or nil) +# +# :line_number_start – first line number +# +# :bold_every – make every n-th line number bold. Default: 10 +module MetricFu + module Formatter + class Syntax + + def initialize + @options = { :css => :class, :style => :alpha } + @line_number_options = {:line_numbers => :inline, :line_number_start => 0 } + end + + def highlight(ruby_text, line_number) + tokens = tokenize(ruby_text) + tokens.div(highlight_options(line_number)) + end + + def highlight_options(line_number) + if line_number.to_i > 0 + @options.merge(@line_number_options.merge(:line_number_start => line_number)) + else + @options + end + end + + private + + def tokenize(ruby_text) + ascii_text = MetricFu::Utility.clean_ascii_text(ruby_text) + tokens = CodeRay.scan(ascii_text, :ruby) + end + + end + end +end diff --git a/lib/metric_fu/reporting/templates/awesome/awesome_template.rb b/lib/metric_fu/reporting/templates/awesome/awesome_template.rb index a5efa7ad6..5528bc24f 100644 --- a/lib/metric_fu/reporting/templates/awesome/awesome_template.rb +++ b/lib/metric_fu/reporting/templates/awesome/awesome_template.rb @@ -1,7 +1,6 @@ require 'fileutils' -require 'coderay' MetricFu.metrics_require { 'base_template' } -MetricFu.lib_require { 'utility' } +MetricFu.lib_require { 'formatter/syntax' } class AwesomeTemplate < MetricFu::Template @@ -45,25 +44,9 @@ def write end def convert_ruby_to_html(ruby_text, line_number) - tokens = CodeRay.scan(MetricFu::Utility.clean_ascii_text(ruby_text), :ruby) - options = { :css => :class, :style => :alpha } - if line_number.to_i > 0 - options = options.merge({:line_numbers => :inline, :line_number_start => line_number.to_i }) - end - tokens.div(options) - # CodeRay options - # used to analyze source code, because object Tokens is a list of tokens with specified types. - # :tab_width – tabulation width in spaces. Default: 8 - # :css – how to include the styles (:class и :style). Default: :class) - # - # :wrap – wrap result in html tag :page, :div, :span or not to wrap (nil) - # - # :line_numbers – how render line numbers (:table, :inline, :list or nil) - # - # :line_number_start – first line number - # - # :bold_every – make every n-th line number bold. Default: 10 + MetricFu::Formatter::Syntax.new.highlight(ruby_text, line_number) end + def write_file_data per_file_data.each_pair do |file, lines| From 839b075833854aa2d972b09dbbfd8f58ff3a3f4f Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Fri, 22 Nov 2013 14:01:14 -0600 Subject: [PATCH 2/2] Extract report template --- lib/metric_fu/formatter/syntax.rb | 3 +- lib/metric_fu/metrics/base_template.rb | 4 +- .../templates/awesome/awesome_template.rb | 50 +++---------------- .../awesome => templates}/css/bluff.css | 0 .../awesome => templates}/css/buttons.css | 0 .../awesome => templates}/css/default.css | 0 .../awesome => templates}/css/integrity.css | 0 .../awesome => templates}/css/rcov.css | 0 .../awesome => templates}/css/reset.css | 0 .../awesome => templates}/css/syntax.css | 0 lib/metric_fu/templates/report.html.erb | 32 ++++++++++++ lib/metric_fu/templates/report.rb | 36 +++++++++++++ lib/metric_fu/utility.rb | 4 ++ spec/metric_fu/metrics/base_template_spec.rb | 8 +-- 14 files changed, 88 insertions(+), 49 deletions(-) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/bluff.css (100%) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/buttons.css (100%) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/default.css (100%) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/integrity.css (100%) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/rcov.css (100%) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/reset.css (100%) rename lib/metric_fu/{reporting/templates/awesome => templates}/css/syntax.css (100%) create mode 100644 lib/metric_fu/templates/report.html.erb create mode 100644 lib/metric_fu/templates/report.rb diff --git a/lib/metric_fu/formatter/syntax.rb b/lib/metric_fu/formatter/syntax.rb index c69f20b54..1642b1879 100644 --- a/lib/metric_fu/formatter/syntax.rb +++ b/lib/metric_fu/formatter/syntax.rb @@ -27,7 +27,8 @@ def highlight(ruby_text, line_number) end def highlight_options(line_number) - if line_number.to_i > 0 + line_number = line_number.to_i + if line_number > 0 @options.merge(@line_number_options.merge(:line_number_start => line_number)) else @options diff --git a/lib/metric_fu/metrics/base_template.rb b/lib/metric_fu/metrics/base_template.rb index 74b80e19b..b7773f02c 100644 --- a/lib/metric_fu/metrics/base_template.rb +++ b/lib/metric_fu/metrics/base_template.rb @@ -120,8 +120,8 @@ def output_filename(section) # @return String # The contents of the css file def inline_css(css) - css_file = File.join(template_directory, css) - open(css_file) {|f| f.read } + css_file = File.join(MetricFu.lib_dir,'templates', css) + MetricFu::Utility.binread(css_file) end # Provides a link to open a file through the textmate protocol diff --git a/lib/metric_fu/reporting/templates/awesome/awesome_template.rb b/lib/metric_fu/reporting/templates/awesome/awesome_template.rb index 5528bc24f..a1303e5f8 100644 --- a/lib/metric_fu/reporting/templates/awesome/awesome_template.rb +++ b/lib/metric_fu/reporting/templates/awesome/awesome_template.rb @@ -1,6 +1,6 @@ require 'fileutils' MetricFu.metrics_require { 'base_template' } -MetricFu.lib_require { 'formatter/syntax' } +MetricFu.lib_require { 'templates/report' } class AwesomeTemplate < MetricFu::Template @@ -43,54 +43,20 @@ def write write_file_data end - def convert_ruby_to_html(ruby_text, line_number) - MetricFu::Formatter::Syntax.new.highlight(ruby_text, line_number) - end - def write_file_data - per_file_data.each_pair do |file, lines| next if file.to_s.empty? next unless File.file?(file) + report = MetricFu::Templates::Report.new(file, lines).render(@metrics) - data = File.readlines(file) - fn = "#{file.gsub(%r{/}, '_')}.html" - - out = <<-HTML - - HTML - out << "" - data.each_with_index do |line, idx| - line_number = (idx + 1).to_s - out << "" - out << "" - if MetricFu::Formatter::Templates.option('syntax_highlighting') - line_for_display = convert_ruby_to_html(line, line_number) - else - line_for_display = "#{line_number}#{line}" - end - out << "" - out << "" - end - out << "
" - if lines.has_key?(line_number) - out << "
    " - lines[line_number].each do |problem| - out << "
  • #{problem[:description]} » #{problem[:type]}
  • " - end - out << "
" - else - out << " " - end - out << "
#{line_for_display}
" - - formatter.write_template(out, fn) + formatter.write_template(report, html_filename(file)) end end + + def html_filename(file) + "#{file.gsub(%r{/}, '_')}.html" + end + def template_directory File.dirname(__FILE__) end diff --git a/lib/metric_fu/reporting/templates/awesome/css/bluff.css b/lib/metric_fu/templates/css/bluff.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/bluff.css rename to lib/metric_fu/templates/css/bluff.css diff --git a/lib/metric_fu/reporting/templates/awesome/css/buttons.css b/lib/metric_fu/templates/css/buttons.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/buttons.css rename to lib/metric_fu/templates/css/buttons.css diff --git a/lib/metric_fu/reporting/templates/awesome/css/default.css b/lib/metric_fu/templates/css/default.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/default.css rename to lib/metric_fu/templates/css/default.css diff --git a/lib/metric_fu/reporting/templates/awesome/css/integrity.css b/lib/metric_fu/templates/css/integrity.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/integrity.css rename to lib/metric_fu/templates/css/integrity.css diff --git a/lib/metric_fu/reporting/templates/awesome/css/rcov.css b/lib/metric_fu/templates/css/rcov.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/rcov.css rename to lib/metric_fu/templates/css/rcov.css diff --git a/lib/metric_fu/reporting/templates/awesome/css/reset.css b/lib/metric_fu/templates/css/reset.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/reset.css rename to lib/metric_fu/templates/css/reset.css diff --git a/lib/metric_fu/reporting/templates/awesome/css/syntax.css b/lib/metric_fu/templates/css/syntax.css similarity index 100% rename from lib/metric_fu/reporting/templates/awesome/css/syntax.css rename to lib/metric_fu/templates/css/syntax.css diff --git a/lib/metric_fu/templates/report.html.erb b/lib/metric_fu/templates/report.html.erb new file mode 100644 index 000000000..617876097 --- /dev/null +++ b/lib/metric_fu/templates/report.html.erb @@ -0,0 +1,32 @@ + + + + + +
+ <% @data.each_with_index do |line, idx| %> + <% line_number = (idx + 1).to_s %> + + + + + <% end %> +
+ <% if @lines.has_key?(line_number) %> +
    + <% @lines[line_number].each do |problem| %> +
  • <%= "#{problem[:description]} » #{problem[:type]}" %>
  • + <% end %> +
+ <% else %> +   + <% end %> +
+ <%= line_for_display(line, line_number) %> +
+ + diff --git a/lib/metric_fu/templates/report.rb b/lib/metric_fu/templates/report.rb new file mode 100644 index 000000000..e3c53d11b --- /dev/null +++ b/lib/metric_fu/templates/report.rb @@ -0,0 +1,36 @@ +MetricFu.lib_require { 'formatter/syntax' } + +module MetricFu + module Templates + class Report < MetricFu::Template + + def initialize(file, lines) + @file = file + @lines = lines + @data = File.readlines(file) + end + + def render(metrics) + @metrics = metrics + erbify('report') + end + + def convert_ruby_to_html(ruby_text, line_number) + MetricFu::Formatter::Syntax.new.highlight(ruby_text, line_number) + end + + def line_for_display(line, line_number) + if MetricFu::Formatter::Templates.option('syntax_highlighting') + line_for_display = convert_ruby_to_html(line, line_number) + else + "#{line_number}#{line}" + end + end + + def template_directory + File.dirname(__FILE__) + end + + end + end +end diff --git a/lib/metric_fu/utility.rb b/lib/metric_fu/utility.rb index 604b66afb..841c2521c 100644 --- a/lib/metric_fu/utility.rb +++ b/lib/metric_fu/utility.rb @@ -33,5 +33,9 @@ def load_yaml(file) YAML.load_file(file) end + def binread(file) + File.binread(file) + end + end end diff --git a/spec/metric_fu/metrics/base_template_spec.rb b/spec/metric_fu/metrics/base_template_spec.rb index 9b9fef588..ef5e7091b 100644 --- a/spec/metric_fu/metrics/base_template_spec.rb +++ b/spec/metric_fu/metrics/base_template_spec.rb @@ -76,11 +76,11 @@ describe "#inline_css" do it 'should return the contents of a css file' do css = 'mycss.css' - @template.should_receive(:template_directory).and_return('dir') - io = double('io', :read => "css contents") - @template.should_receive(:open).and_yield(io) + dir = File.join(MetricFu.lib_dir, 'templates', css) + contents = "css contents" + MetricFu::Utility.should_receive(:binread).with(dir).and_return(contents) result = @template.send(:inline_css, css) - result.should == 'css contents' + expect(result).to eq(contents) end end