class BetterErrors::CodeFormatter

@private

Constants

FILE_TYPES

Attributes

context[R]
filename[R]
line[R]

Public Class Methods

new(filename, line, context = 5) click to toggle source
# File lib/better_errors/code_formatter.rb, line 17
def initialize(filename, line, context = 5)
  @filename = filename
  @line     = line
  @context  = context
end

Public Instance Methods

coderay_scanner() click to toggle source
# File lib/better_errors/code_formatter.rb, line 33
def coderay_scanner
  ext = File.extname(filename)
  FILE_TYPES[ext] || :text
end
context_lines() click to toggle source
# File lib/better_errors/code_formatter.rb, line 48
def context_lines
  range = line_range
  source_lines[(range.begin - 1)..(range.end - 1)] or raise Errno::EINVAL
end
each_line_of(lines) { |current_line == line| ... } click to toggle source
# File lib/better_errors/code_formatter.rb, line 38
def each_line_of(lines, &blk)
  line_range.zip(lines).map { |current_line, str|
    yield (current_line == line), current_line, str
  }
end
formatted_code() click to toggle source
# File lib/better_errors/code_formatter.rb, line 29
def formatted_code
  formatted_lines.join
end
highlighted_lines() click to toggle source
# File lib/better_errors/code_formatter.rb, line 44
def highlighted_lines
  CodeRay.scan(context_lines.join, coderay_scanner).div(wrap: nil).lines
end
line_range() click to toggle source
# File lib/better_errors/code_formatter.rb, line 57
def line_range
  min = [line - context, 1].max
  max = [line + context, source_lines.count].min
  min..max
end
output() click to toggle source
# File lib/better_errors/code_formatter.rb, line 23
def output
  formatted_code
rescue Errno::ENOENT, Errno::EINVAL
  source_unavailable
end
source_lines() click to toggle source
# File lib/better_errors/code_formatter.rb, line 53
def source_lines
  @source_lines ||= File.readlines(filename)
end