Sha256: ca83d413e48fed1ac86d23897c7e606e856e108f01136ef9f9cfce96daf5ebab

Contents?: true

Size: 1.31 KB

Versions: 1

Compression:

Stored size: 1.31 KB

Contents

# frozen_string_literal: true

require 'yaml_duplicate_checker/version'
require 'yaml'

module YamlDuplicateChecker
  # Yaml duplicate check class
  # @abstract
  #   Use Checker#dup_list returns duplicate yaml key list
  #
  class Checker
    def initialize(root)
      @key_list = Hash.new { |h, v| h[v] = [] }
      @root = root
      check
    end

    def dup_list
      @dup_list ||= @key_list.select { |_, v| v.size > 1 }
    end

    private

    def set_key_list(parsed_yaml, path, result_key = '')
      parsed_yaml.each_slice(2) do |k, v|
        unless v.mapping?
          update_key_list(result_key, k, path)
          next
        end

        next_key = result_key + format_key(k.value, result_key)
        set_key_list(v.children, path, next_key)
      end
    end

    def format_key(key, result_key)
      result_key == '' ? key : ".#{key}"
    end

    def check
      Dir.glob(["#{@root}/**/*.yaml", "#{@root}/**/*.yml"]).each do |yaml|
        parsed_yaml = YAML.parse(File.open(yaml)).root.children
        set_key_list(parsed_yaml, yaml)
      end
    end

    def update_key_list(result_key, current_key, path)
      dict_key = result_key + format_key(current_key.value, result_key)
      location = "#{path[@root.size + 1..-1]}:#{current_key.start_line}"
      @key_list[dict_key].push(location)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
yaml_duplicate_checker-0.1.1 lib/yaml_duplicate_checker.rb