rails国际化yaml文件中有两个ruby。一个文件已完成,另一个文件缺少密钥。如何比较两个yaml文件并查看第二个文件中缺少的键?有没有工具可以做到这一点?
答案 0 :(得分:13)
假设file1
是正确的版本而file2
是缺少密钥的版本:
def compare_yaml_hash(cf1, cf2, context = [])
cf1.each do |key, value|
unless cf2.key?(key)
puts "Missing key : #{key} in path #{context.join(".")}"
next
end
value2 = cf2[key]
if (value.class != value2.class)
puts "Key value type mismatch : #{key} in path #{context.join(".")}"
next
end
if value.is_a?(Hash)
compare_yaml_hash(value, value2, (context + [key]))
next
end
if (value != value2)
puts "Key value mismatch : #{key} in path #{context.join(".")}"
end
end
end
现在
compare_yaml_hash(YAML.load_file("file1"), YAML.load_file("file2"))
限制:如果YAML文件包含数组,则应扩展当前实现以支持数组。
答案 1 :(得分:2)
我找不到一个快速的工具来做到这一点。我决定写我的own tool for this.
您可以使用cabal进行安装:
$ cabal update
$ cabal install yamlkeysdiff
然后你可以这样区分两个文件:
$ yamlkeysdiff file1.yml file2.yml
> missing key in file2
< missing key in file1
您还可以比较文件的两个子集:
$ yamlkeysdiff "file1.yml#key:subkey" "file2.yml#otherkey"
它的行为与diff
完全相同,您可以这样做:
$ yamlkeysdiff file1.yml file2.yml && echo Is the same || echo Is different
答案 2 :(得分:0)
我想提取diff来处理一些东西,这里的代码片段只是打印东西。所以我的版本返回带有diff的哈希。它的结构反映了原始哈希,但是值是对差异的描述。
def deep_hash_diff(hash1, hash2, hash1_name = 'Hash 1', hash2_name = 'Hash 2')
diff = {}
(hash1.keys - hash2.keys).each do |key1|
diff[key1] = "Present in #{hash1_name}, but not in #{hash2_name}"
end
(hash2.keys - hash1.keys).each do |key2|
diff[key2] = "Present in #{hash2_name}, but not in #{hash1_name}"
end
(hash1.keys & hash2.keys).each do |common_key|
if hash1[common_key].is_a?(Hash)
if hash2[common_key].is_a?(Hash)
res = deep_hash_diff(hash1[common_key], hash2[common_key], hash1_name, hash2_name)
diff[common_key] = res if res.present?
else
diff[common_key] = "#{hash1_name} has nested hash, but #{hash2_name} just value #{hash2[common_key]}"
end
elsif hash2[common_key].is_a?(Hash)
diff[common_key] = "#{hash2_name} has nested hash, but #{hash1_name} just value #{hash1[common_key]}"
end
end
diff
end
然后,我将其用作:
res = deep_hash_diff(YAML.load_file("en.yml"), YAML.load_file("spa.yml"), 'English translation', 'Spanish translation')
puts(res.to_yaml) # for nicer output
答案 3 :(得分:0)
differz 比较两个YAML文件,并在第二个文件中打印丢失的密钥。
它既作为库又作为命令行工具来提供。您可以使用within(str, serial.number <- ave(structure,cluster,FUN = seq_along))
安装后者。