class SidekiqUniqueJobs::Script::LuaError

@author Mikael Henriksson <mikael@mhenrixon.com>
LuaError raised on errors in Lua scripts

def self.intercepts?(error)

Returns:
  • (Boolean) - is this an error that should be reformatted?

Parameters:
  • error (StandardError) -- the original error raised by redis
def self.intercepts?(error)
  PATTERN.match?(error.message)
end

def backtrace_before_entering_gem(backtrace)

:nocov:
def backtrace_before_entering_gem(backtrace)
  backtrace.reverse.take_while { |line| !line_from_gem(line) }.reverse
end

def generate_backtrace(file, line_number)

:nocov:
def generate_backtrace(file, line_number)
  pre_gem                 = backtrace_before_entering_gem(@backtrace)
  index_of_first_gem_line = (@backtrace.size - pre_gem.size - 1)
  pre_gem.unshift(@backtrace[index_of_first_gem_line])
  pre_gem.unshift("#{file}:#{line_number}")
  pre_gem
end

def generate_error_context(content, line_number)

:nocov:
def generate_error_context(content, line_number)
  lines                 = content.lines.to_a
  beginning_line_number = [1, line_number - CONTEXT_LINE_NUMBER].max
  ending_line_number    = [lines.count, line_number + CONTEXT_LINE_NUMBER].min
  line_number_width     = ending_line_number.to_s.length
  (beginning_line_number..ending_line_number).map do |number|
    indicator = (number == line_number) ? "=>" : "  "
    formatted_number = format("%#{line_number_width}d", number)
    " #{indicator} #{formatted_number}: #{lines[number - 1]}"
  end.join.chomp
end

def initialize(error, script)

Parameters:
  • script (Script) -- a DTO with information about the script
  • error (StandardError) -- the original error raised by redis
def initialize(error, script)
  @error        = error
  @file         = script.path
  @content      = script.source
  @backtrace    = @error.backtrace
  @error.message.match(PATTERN) do |regexp_match|
    line_number   = regexp_match[2].to_i
    message       = regexp_match[3]
    error_context = generate_error_context(content, line_number)
    super("#{message}\n\n#{error_context}\n\n")
    set_backtrace(generate_backtrace(file, line_number))
  end
end

def line_from_gem(line)

:nocov:
def line_from_gem(line)
  line.split(":").first.include?(LIB_PATH)
end