class Chef::Formatters::ErrorInspectors::CompileErrorInspector

CompileErrorInspector

Wraps exceptions that occur during the compile phase of a Chef run and tries to find the code responsible for the error.

Attributes

exception[R]
path[R]

Public Class Methods

new(path, exception) click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 31
def initialize(path, exception)
  @path, @exception = path, exception
end

Public Instance Methods

add_explanation(error_description) click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 35
def add_explanation(error_description)
  case exception
  when Chef::Exceptions::RecipeNotFound
    error_description.section(exception.class.name, exception.message)
  else
    error_description.section(exception.class.name, exception.message)

    traceback = filtered_bt.map {|line| "  #{line}"}.join("\n")
    error_description.section("Cookbook Trace:", traceback)
    error_description.section("Relevant File Content:", context)
  end
end
context() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 48
def context
  context_lines = []
  context_lines << "#{culprit_file}:\n\n"
  Range.new(display_lower_bound, display_upper_bound).each do |i|
    line_nr = (i + 1).to_s.rjust(3)
    indicator = (i + 1) == culprit_line ? ">> " : ":  "
    context_lines << "#{line_nr}#{indicator}#{file_lines[i]}"
  end
  context_lines.join("")
end
culprit_backtrace_entry() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 75
def culprit_backtrace_entry
  @culprit_backtrace_entry ||= begin
     bt_entry = filtered_bt.first
     Chef::Log.debug("backtrace entry for compile error: '#{bt_entry}'")
     bt_entry
  end
end
culprit_file() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 91
def culprit_file
  @culprit_file ||= culprit_backtrace_entry[/^((?:.\:)?[^:]+):([\d]+)/,1]
end
culprit_line() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 83
def culprit_line
  @culprit_line ||= begin
    line_number = culprit_backtrace_entry[/^(?:.\:)?[^:]+:([\d]+)/,1].to_i
    Chef::Log.debug("Line number of compile error: '#{line_number}'")
    line_number
  end
end
display_lower_bound() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 59
def display_lower_bound
  lower = (culprit_line - 8)
  lower = 0 if lower < 0
  lower
end
display_upper_bound() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 65
def display_upper_bound
  upper = (culprit_line + 8)
  upper = file_lines.size if upper > file_lines.size
  upper
end
file_lines() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 71
def file_lines
  @file_lines ||= IO.readlines(culprit_file)
end
filtered_bt() click to toggle source
# File lib/chef/formatters/error_inspectors/compile_error_inspector.rb, line 95
def filtered_bt
  filters = Array(Chef::Config.cookbook_path).map {|p| /^#{Regexp.escape(p)}/ }
  r = exception.backtrace.select {|line| filters.any? {|filter| line =~ filter }}
  Chef::Log.debug("filtered backtrace of compile error: #{r.join(",")}")
  return r.count > 0 ? r : exception.backtrace
end