Синхронизировать два файла YAML - PullRequest
1 голос
/ 29 марта 2011

Есть ли плагин для синхронизации двух файлов YAML?Например, file1 имеет

en:
   key1: "Value1"
   key2: "Value2"
es:
   key1: "EsValue1"

. После синхронизации необходимо добавить ключ 2: «Значение2» во второй файл без нарушения порядка и ключ1 во втором файле.

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Я не уверен, что при этом порядок останется таким, как вы хотите, но если вы используете Ruby 1.9, вполне вероятно, что он использует отсортированные хэши.Вы можете прочитать содержимое файлов YAML в хэши, используя YAML.load_file, а затем сделать что-то вроде этого:

merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
es.merge(en, &merger)

, а затем снова вывести es-хэш в файл YAML.

Это решение дляРекурсивное слияние было предложено здесь: http://www.ruby -forum.com / topic / 142809 # 635081

1 голос
/ 30 марта 2011

Вам на самом деле не нужен плагин для этого:

str = <<EOT
en:
  key1: "Value1"
  key2: "Value2"
es:
  key1: "EsValue1"
EOT

require 'yaml'
yaml = YAML::load(str)

(hash['en'].keys - hash['es'].keys).each{ |k| hash['es'][k] = hash['en'][k] }

>> ap hash #=> nil
{
    "en" => {
        "key1" => "Value1",
        "key2" => "Value2"
    },
    "es" => {
        "key1" => "EsValue1",
        "key2" => "Value2"
    }
}

Если у вас есть произвольное количество других хэшей для обработки:

(yaml.keys - ['en']).each do |h|
  (yaml['en'].keys - yaml[h].keys).each do |k|
    yaml[h][k] = yaml['en'][k]
  end
end

Итак, прочитайте YAMLфайл, запустите полученный хеш через код, затем запишите файл снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...