module Peek::Rblineprof::ControllerHelpers

Protected Instance Methods

inject_rblineprof() { || ... } click to toggle source
# File lib/peek/rblineprof/controller_helpers.rb, line 61
def inject_rblineprof
  ret = nil
  profile = lineprof(rblineprof_profiler_regex) do
    ret = yield
  end

  if response.content_type =~ %r|text/html|
    sort = params[:lineprofiler_sort]
    mode = params[:lineprofiler_mode] || 'cpu'
    min  = (params[:lineprofiler_min] || 5).to_i * 1000
    summary = params[:lineprofiler_summary]

    # Sort each file by the longest calculated time
    per_file = profile.map do |file, lines|
      total, child, excl, total_cpu, child_cpu, excl_cpu = lines[0]

      wall = summary == 'exclusive' ? excl : total
      cpu  = summary == 'exclusive' ? excl_cpu : total_cpu
      idle = summary == 'exclusive' ? (excl - excl_cpu) : (total - total_cpu)

      [
        file, lines,
        wall, cpu, idle,
        sort == 'idle' ? idle : sort == 'cpu' ? cpu : wall
      ]
    end.sort_by{ |a,b,c,d,e,f| -f }

    output = ''
    per_file.each do |file_name, lines, file_wall, file_cpu, file_idle, file_sort|

      output << "<div class='peek-rblineprof-file'><div class='heading'>"

      show_src = file_sort > min
      tmpl = show_src ? "<a href='#' class='js-lineprof-file'>%s</a>" : "%s"

      if mode == 'cpu'
        output << sprintf("<span class='duration'>% 8.1fms + % 8.1fms</span> #{tmpl}", file_cpu / 1000.0, file_idle / 1000.0, file_name.sub(Rails.root.to_s + '/', ''))
      else
        output << sprintf("<span class='duration'>% 8.1fms</span> #{tmpl}", file_wall/1000.0, file_name.sub(Rails.root.to_s + '/', ''))
      end

      output << "</div>" # .heading

      next unless show_src

      output << "<div class='data'>"
      code = []
      times = []
      File.readlines(file_name).each_with_index do |line, i|
        code << line
        wall, cpu, calls = lines[i + 1]

        if calls && calls > 0
          if mode == 'cpu'
            idle = wall - cpu
            times << sprintf("% 8.1fms + % 8.1fms (% 5d)", cpu / 1000.0, idle / 1000.0, calls)
          else
            times << sprintf("% 8.1fms (% 5d)", wall / 1000.0, calls)
          end
        else
          times << ' '
        end
      end
      output << "<pre class='duration'>#{times.join("\n")}</pre>"
      output << "<div class='code'>#{pygmentize(file_name, code.join, 'ruby')}</div>"
      output << "</div></div>" # .data then .peek-rblineprof-file
    end

    response.body += "<div class='peek-rblineprof-modal' id='line-profile'>#{output}</div>".html_safe
  end

  ret
end
lexer_for_filename(file_name) click to toggle source
# File lib/peek/rblineprof/controller_helpers.rb, line 36
def lexer_for_filename(file_name)
  case file_name
  when /\.rb$/ then 'ruby'
  when /\.erb$/ then 'erb'
  end
end
pygmentize(file_name, code, lexer = nil) click to toggle source
# File lib/peek/rblineprof/controller_helpers.rb, line 24
def pygmentize(file_name, code, lexer = nil)
  if pygmentize? && lexer.present?
    Pygments.highlight(code, :lexer => lexer_for_filename(file_name))
  else
    "<pre>#{Rack::Utils.escape_html(code)}</pre>"
  end
end
pygmentize?() click to toggle source
# File lib/peek/rblineprof/controller_helpers.rb, line 20
def pygmentize?
  defined?(Pygments)
end
rblineprof_enabled?() click to toggle source
# File lib/peek/rblineprof/controller_helpers.rb, line 32
def rblineprof_enabled?
  params[:lineprofiler].present?
end
rblineprof_profiler_regex() click to toggle source
# File lib/peek/rblineprof/controller_helpers.rb, line 43
def rblineprof_profiler_regex
  escaped_rails_root = Regexp.escape(Rails.root.to_s)
  case params[:lineprofiler]
  when 'app'
    %r{^#{escaped_rails_root}/(app|lib)}
  when 'views'
    %r{^#{escaped_rails_root}/app/view}
  when 'gems'
    %r|^#{escaped_rails_root}/vendor/gems|
  when 'all'
    %r|^#{escaped_rails_root}|
  when 'stdlib'
    %r|^#{Regexp.escape RbConfig::CONFIG['rubylibdir']}|
  else
    %r{^#{escaped_rails_root}/(app|config|lib|vendor/plugin)}
  end
end