# 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