Class Kwalify::YamlParser
In: kwalify/yaml-parser.rb
Parent: PlainYamlParser

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

Methods

Public Class methods

[Source]

# File kwalify/yaml-parser.rb, line 676
      def initialize(*args)
         super
         @linenums_table = {}     # object_id -> hash or array
      end

Public Instance methods

[Source]

# File kwalify/yaml-parser.rb, line 681
      def parse()
         @doc = super()
         return @doc
      end

[Source]

# File kwalify/yaml-parser.rb, line 686
      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

[Source]

# File kwalify/yaml-parser.rb, line 716
      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

[Source]

# File kwalify/yaml-parser.rb, line 710
      def set_errors_linenum(errors)
         errors.each do |error|
            error.linenum = path_linenum(error.path)
         end
      end

Protected Instance methods

[Source]

# File kwalify/yaml-parser.rb, line 745
      def add_to_map(map, key, value, linenum)
         map[key] = value
         @linenums_table[map.__id__][key] = linenum
      end

[Source]

# File kwalify/yaml-parser.rb, line 729
      def add_to_seq(seq, value, linenum)
         seq << value
         @linenums_table[seq.__id__] << linenum
      end

[Source]

# File kwalify/yaml-parser.rb, line 739
      def create_mapping(linenum=current_linenum())
         map = {}
         @linenums_table[map.__id__] = {}
         return map
      end

[Source]

# File kwalify/yaml-parser.rb, line 774
      def create_scalar(value, linenum=current_linenum())
         data = super(value)
         #return Scalar.new(data, linenum)
         return data
      end

[Source]

# File kwalify/yaml-parser.rb, line 723
      def create_sequence(linenum=current_linenum())
         seq = []
         @linenums_table[seq.__id__] = []
         return seq
      end

[Source]

# File kwalify/yaml-parser.rb, line 760
      def merge_map(map, collection, linenum)
         t = @linenums_table[map.__id__]
         list = collection.is_a?(Array) ? collection : [ collection ]
         list.each do |m|
            t2 = @linenums_table[m.__id__]
            m.each do |key, val|
               unless map.key?(key)
                  map[key] = val
                  t[key] = t2[key]
               end
            end
         end
      end

[Source]

# File kwalify/yaml-parser.rb, line 755
      def set_default(map, value, linenum)
         map.default = value
         @linenums_table[map.__id__]['=''='] = linenum
      end

[Source]

# File kwalify/yaml-parser.rb, line 750
      def set_map_with(map, key, value, linenum)
         map[key] = value
         @linenums_table[map.__id__][key] = linenum
      end

[Source]

# File kwalify/yaml-parser.rb, line 734
      def set_seq_at(seq, i, value, linenum)
         seq[i] = value
         @linenums_table[seq.__id__][i] = linenum
      end

[Validate]