Sha256: f5976aa88c620faf76c9d4baef7448359f19308000148e003fb617524566a8f5

Contents?: true

Size: 1.04 KB

Versions: 4

Compression:

Stored size: 1.04 KB

Contents

# frozen_string_literal: true

module Fusuma
  class Config
    # ref: https://github.com/rubocop-hq/rubocop/blob/97e4ffc8a71e9e5239a927c6a534dfc1e0da917f/lib/rubocop/yaml_duplication_checker.rb
    # Find duplicated keys from YAML.
    module YAMLDuplicationChecker
      def self.check(yaml_string, filename, &on_duplicated)
        tree = YAML.parse(yaml_string, filename: filename)
        return unless tree

        traverse(tree, &on_duplicated)
      end

      def self.traverse(tree, &on_duplicated)
        case tree
        when Psych::Nodes::Mapping
          tree.children.each_slice(2).with_object([]) do |(key, value), keys|
            exist = keys.find { |key2| key2.value == key.value }
            on_duplicated.call(exist, key) if exist
            keys << key
            traverse(value, &on_duplicated)
          end
        else
          children = tree.children
          return unless children

          children.each { |c| traverse(c, &on_duplicated) }
        end
      end

      private_class_method :traverse
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
fusuma-3.7.0 lib/fusuma/config/yaml_duplication_checker.rb
fusuma-3.6.2 lib/fusuma/config/yaml_duplication_checker.rb
fusuma-3.6.1 lib/fusuma/config/yaml_duplication_checker.rb
fusuma-3.6.0 lib/fusuma/config/yaml_duplication_checker.rb