Sha256: cc954c534f444eee794a83c7d6e9cac82360ad949377bad3268b3a312e895397

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

require 'yaml'

module Shiba
  module Review
    class CommentRenderer
      # {{ variable }}
      VAR_PATTERN = /{{\s?([a-z_]+)\s?}}/

      def initialize(templates)
        @templates = templates
      end

      def render(explain)
        body = ""

        explain["messages"].each do |message|
          tag = message['tag']
          data = present(message)
          body << @templates[tag]["title"]
          body << ": "
          body << render_template(@templates[tag]["summary"], data)
          body << "\n"
        end

        body
      end

      protected

      def render_template(template, data)
        rendered = template.gsub(VAR_PATTERN) do
          data[$1]
        end
        # convert to markdown
        rendered.gsub!(/<\/?b>/, "**")
        rendered.gsub!(/<\/?i>/, "_")
        rendered
      end

      def present(message)
        {
          "fuzz_table_sizes" => fuzzed_sizes(message),
          "table"           => message["table"],
          "table_size"      => message["table_size"],
          "result_size"     => message["result_size"],
          "index"           => message["index"],
          "key_parts"       => (message["index_used"] || []).join(','),
          "size"            => message["size"],
          "formatted_cost"  => formatted_cost(message)
        }
      end

      def formatted_cost(explain)
        return nil unless explain["cost"] && explain["table_size"]
        percentage = (explain["cost"] / explain["table_size"]) * 100.0;

        if explain["cost"] > 100 && percentage > 1
          "#{percentage.floor}% (#{explain["cost"]}) of the"
        else
          explain["cost"]
        end
      end

      def fuzzed_sizes(message)
        return nil unless message["tables"]
        message['tables'].group_by { |k, v| v }.map do |size, arr|
          size.to_s + ": " + arr.map(&:first).join(', ')
        end.join(". ")
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
shiba-0.4.0 lib/shiba/review/comment_renderer.rb