Class: Kwalify::YamlParser

Inherits:
PlainYamlParser show all
Defined in:
lib/kwalify/yaml-parser.rb

Overview

ex.

# load document with YamlParser
str = ARGF.read()
parser = Kwalify::YamlParser.new(str)
document = parser.parse()

# validate document
schema = YAML.load(File.read('schema.yaml'))
validator = Kwalify::Validator.new(schema)
errors = validator.validate(document)

# print validation result
if errors && !errors.empty?
  parser.set_errors_linenum(errors)
  errors.sort.each do |error|
    print "line %d: path %s: %s" % [error.linenum, error.path, error.message]
  end
end

Direct Known Subclasses

Parser

Instance Method Summary collapse

Methods inherited from PlainYamlParser

#has_next?, #parse_all

Constructor Details

#initialize(*args) ⇒ YamlParser

Returns a new instance of YamlParser.



701
702
703
704
# File 'lib/kwalify/yaml-parser.rb', line 701

def initialize(*args)
   super
   @linenums_table = {}     # object_id -> hash or array
end

Instance Method Details

#parseObject



706
707
708
709
# File 'lib/kwalify/yaml-parser.rb', line 706

def parse()
   @doc = super()
   return @doc
end

#path_linenum(path) ⇒ Object



711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
# File 'lib/kwalify/yaml-parser.rb', line 711

def path_linenum(path)
   return 1 if path.empty? || path == '/'
   elems = path.split('/')
   elems.shift if path[0] == ?/    # delete empty string on head
   last_elem = elems.pop
   c = @doc   # collection
   elems.each do |elem|
      if c.is_a?(Array)
         c = c[elem.to_i]
      elsif c.is_a?(Hash)
         c = c[elem]
      else
         assert false
      end
   end
   linenums = @linenums_table[c.__id__]
   if c.is_a?(Array)
      linenum = linenums[last_elem.to_i]
   elsif c.is_a?(Hash)
      linenum = linenums[last_elem]
   end
   return linenum
end

#set_error_linenums(errors) ⇒ Object



741
742
743
744
# File 'lib/kwalify/yaml-parser.rb', line 741

def set_error_linenums(errors)
   $stderr.puts "*** Kwalify::YamlParser#set_error_linenums() is obsolete. You should use set_errors_linenum() instead."
   set_errors_linenum(errors)
end

#set_errors_linenum(errors) ⇒ Object



735
736
737
738
739
# File 'lib/kwalify/yaml-parser.rb', line 735

def set_errors_linenum(errors)
   errors.each do |error|
      error.linenum = path_linenum(error.path)
   end
end