Module: KramdownRFC::YAMLcheck

Defined in:
lib/kramdown-rfc/yamlcheck.rb

Class Method Summary collapse

Class Method Details

.check_dup_keys(data) ⇒ Object



36
37
38
39
# File 'lib/kramdown-rfc/yamlcheck.rb', line 36

def self.check_dup_keys(data)
  ast = YAML.parse_stream(data)
  check_dup_keys1(ast, [])
end

.check_dup_keys1(node, path) ⇒ Object

Does not follow aliases.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/kramdown-rfc/yamlcheck.rb', line 15

def self.check_dup_keys1(node, path)
  if YAML::Nodes::Mapping === node
    children = node.children.each_slice(2)
    duplicates = children.map { |key_node, _value_node|
      key_node }.group_by{|nm| short_name(nm)}.select { |_value, nodes| nodes.size > 1 }

    duplicates.each do |key, nodes|
      name = (path + [key]).join("/")
      lines = nodes.map { |occurrence| occurrence.start_line + 1 }.join(", ")
      warn "** duplicate map key >#{name}< in YAML, lines #{lines}"
    end

    children.each do |key_node, value_node|
      newname = short_name(key_node)
      check_dup_keys1(value_node, path + Array(newname))
    end
  else
    node.children.to_a.each { |child| check_dup_keys1(child, path) }
  end
end

.short_name(node) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/kramdown-rfc/yamlcheck.rb', line 6

def self.short_name(node)
  if node.scalar?
    node.value
  else
    node.children&.map {|nm| short_name(nm)}&.join("_")
  end
end