duplicate_keys

in dockerfiles/scripts/helpers/merge-yaml.rb [28:57]


def duplicate_keys(content)
  duplicate_keys = []

  validator = ->(node, parent_path) do
    if node.is_a?(Psych::Nodes::Mapping)
      children = node.children.each_slice(2) 
      duplicates = children.map(&:first).group_by(&:value).select { |_value, nodes| nodes.size > 1 }

      duplicates.each do |key, nodes|
        duplicate_keys.append(
          key: parent_path + [key],
          occurrences: nodes.map { |occurrence| "line: #{occurrence.start_line + 1}" }
        )
      end

      children.each do |key_node, value_node|
        key_node_value = key_node.respond_to?(:value) ? key_node.value : nil
        validator.call(value_node, parent_path + [key_node_value].compact)
      end
    else
      node.children.to_a.each { |child| validator.call(child, parent_path) }
    end
  end

  ast = Psych.parse_stream(content)
  validator.call(ast, [])

  duplicate_keys if duplicate_keys.any?
end