ruby 将多个YAML文件交互式合并为一个

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 将多个YAML文件交互式合并为一个相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env ruby                                                                                       
#                                                                                                         
# synopsis                                                                                                
#                                                                                                         
#   ruby merge_locales.rb config/locales translations.yml

require 'yaml'
require 'rubygems'
require 'highline/import'

::Hash.class_eval do
  class MergeConflict < StandardError; end
  def deep_merge(other, &bloc)
    other.keys.inject(dup) do |result, key|
      begin
        case result[key]
        when Hash
          if other[key].is_a?(Hash)
            result[key] = result[key].deep_merge(other[key], &bloc)
            result
          else
            raise MergeConflict
          end
        when nil then result.merge key => other[key]
        else
          raise MergeConflict
        end
      rescue MergeConflict
        if bloc.nil?
          result[key] = other[key]
        else
          result[key] = bloc.call(result, other, key)
        end
        result
      end
    end
  end
end

result = ARGV.inject({}) do |result, path|
  files = [path] if File.file?(path) && path.match(/\.yml$/)
  files ||= Dir.glob( File.join(path, '**', '*.yml')).to_a
  files.inject(result) do |inner_result, file|
    warn "loading #{file}"
    yaml = File.open(file) { |yf| YAML::load(yf) }
    inner_result.deep_merge(yaml) do |res, other, key|
      if res[key] == other[key]
        res[key]
      else
        warn "Conflict on key: '#{key}'"
        warn "  1. #{res[key].inspect}"
        warn "  2. #{other[key].inspect}"
        select = ask('')
        case select
        when '1' then res[key]
        when '2' then other[key]
        end
      end
    end
  end
end

YAML.dump(result, STDOUT)

以上是关于ruby 将多个YAML文件交互式合并为一个的主要内容,如果未能解决你的问题,请参考以下文章

YAML 将多个锚点合并到同一个映射中

如何将 yaml 文件解析为 ruby​​ 哈希和/或数组?

将 Ruby 哈希转换为 YAML

如何将yaml文件拆分为多个文件?

如何表示将 ruby​​ 哈希转换为 yaml 的 aws 内部函数

YAML