class Lono::Yamler::Validator

Public Class Methods

new(path) click to toggle source
# File lib/lono/yamler/validator.rb, line 3
def initialize(path)
  @path = path
end

Public Instance Methods

handle_yaml_syntax_error(e, path) click to toggle source
# File lib/lono/yamler/validator.rb, line 20
def handle_yaml_syntax_error(e, path)
  io = StringIO.new
  io.puts "Invalid yaml. Output written for debugging: #{path}".color(:red)
  io.puts "ERROR: #{e.message}".color(:red)

  # Grab line info.  Example error:
  #   ERROR: (<unknown>): could not find expected ':' while scanning a simple key at line 2 column 1
  md = e.message.match(/at line (\d+) column (\d+)/)
  line = md[1].to_i

  lines = IO.read(path).split("\n")
  context = 5 # lines of context
  top, bottom = [line-context-1, 0].max, line+context-1
  spacing = lines.size.to_s.size
  lines[top..bottom].each_with_index do |line_content, index|
    line_number = top+index+1
    if line_number == line
      io.printf("%#{spacing}d %s\n".color(:red), line_number, line_content)
    else
      io.printf("%#{spacing}d %s\n", line_number, line_content)
    end
  end

  if ENV['LONO_TEST']
    io.string
  else
    puts io.string
    exit 1
  end
end
validate!() click to toggle source
# File lib/lono/yamler/validator.rb, line 7
def validate!
  validate_yaml(@path)
end
validate_yaml(path) click to toggle source
# File lib/lono/yamler/validator.rb, line 11
def validate_yaml(path)
  text = IO.read(path)
  begin
    YAML.load(text)
  rescue Psych::SyntaxError => e
    handle_yaml_syntax_error(e, path)
  end
end