class BaselineRedRpm::Backtrace

Public Class Methods

backtrace(opts = {}) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 6
def backtrace(opts = {})
  kind = opts[:kind]

  if kind
    bt = Kernel.caller
    bt = clean(bt)
    bt = filter(bt, kind)
    trim_backtrace(bt)
  end
end
clean(backtrace) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 17
def clean(backtrace)
  Array(backtrace)
    .map {|b| clean_line(b) }
    .select {|b| b !~ %r{lib/baseline_red_rpm} }
end
clean_line(line) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 66
def clean_line(line)
  line
    .sub(/#{::BaselineRedRpm.config.app_root.to_s}\//, "[APP_PATH]/")
    .sub(gems_regexp, '\2 (\3) [GEM_PATH]/\4')
end
filter(backtrace, kind) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 23
def filter(backtrace, kind)
  case kind
  when :all
    backtrace
  when :app
    backtrace.select {|b| b =~ /\[APP_PATH\]/ }
  when :gem
    backtrace.select {|b| b =~ /\[GEM_PATH\]/ }
  else
    []
  end
end
source_extract(opts = {}) click to toggle source
  {
    code: source_fragment(file, line_number),
    line_number: line_number
  }
else
  nil
end

end

# File lib/baseline_red_rpm/backtrace.rb, line 49
def source_extract(opts = {})
  backtrace = opts[:backtrace] || Kernel.caller(0)

  Array(backtrace).select {|bt| bt[/^#{::BaselineRedRpm.config.app_root.to_s}\//] }.map do |trace|
    file, line_number = extract_file_and_line_number(trace)
    source_to_hash(file, line_number)
  end
end
source_to_hash(file, line_number) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 58
def source_to_hash(file, line_number)
  {
    "file" => clean_line(file),
    "code" => source_fragment(file, line_number),
    "line_number" => line_number
  }
end

Private Class Methods

extract_file_and_line_number(trace) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 95
def extract_file_and_line_number(trace)
  file, line = trace.match(/^(.+?):(\d+).*$/, &:captures) || trace
  [file, line.to_i]
end
gems_regexp() click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 74
def gems_regexp
  gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) }
  if gems_paths
    %r{(#{gems_paths.join('|')})/gems/([^/]+)-([\w.]+)/(.*)}
  else
    nil
  end
end
source_fragment(path, line) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 83
def source_fragment(path, line)
  return unless BaselineRedRpm.config.app_root
  full_path = BaselineRedRpm.config.app_root.join(path)
  if File.exist?(full_path)
    File.open(full_path, "r") do |file|
      start = [line - 3, 0].max
      lines = file.each_line.drop(start).take(6)
      Hash[*(start + 1..(lines.count + start)).zip(lines).flatten]
    end
  end
end
trim_backtrace(_backtrace, opts = {}) click to toggle source
# File lib/baseline_red_rpm/backtrace.rb, line 100
def trim_backtrace(_backtrace, opts = {})
  kind = opts[:kind]

  return _backtrace unless _backtrace.is_a?(Array)

  length = _backtrace.size
  if length > 80
    trimmed = _backtrace[0, 80]
    trimmed += ['...[snip]...']
    trimmed += _backtrace[length - 20, 20]
  else
    trimmed = _backtrace
  end
  trimmed
end