Сохранить YAML с наследованием в ruby
У меня есть YAML-файл с наследованием, и я хочу добавить или отредактировать ключ программно. Я загружаю YAML в хеш, используя метод YAML.load, но когда я сохраняю хеш обратно, используя YAML.dump, я теряю всю информацию о наследовании.
Есть ли способ отредактировать YAML в Ruby без потери информации о наследовании?
Пример YAML:
main:
prod: &prod
key1: true
key2: 50
key3: "abc"
prod_v_3_5: &prod_v_3_5
<<: *prod
key2: 100
prod_v_3_6: &prod_v_3_6
<<: *prod_v_3_5
key2: 150
Пример кода:
config = Api.get(id)
yaml = YAML.load(config)
yaml["main"][section].store(key, value)
config = YAML.dump(yaml)
Api.set(id, config)
2 ответа
Насколько я знаю (я также использую эту опцию для импорта и переопределения), исходный код YAML читается и обрабатывается, а затем элементы хеш-функции открываются и не связаны внутренне. Таким образом, механизм переопределения копирования-вставки, а не связывания и перегрузки.
Я предполагаю, что вы должны изменить исходный код YAML, открыв файл и изменив его содержимое, если вы не уничтожите свой источник.
Чтобы добавить новый раздел:
config = Api.get(id)
config = "#{config}\n \n #{section}: &#{section}\n <<: *#{parent_section}"
Чтобы добавить новое значение:
config = Api.get(id)
matches = /^(.+)(\n #{section}:\s*&#{section}\s*\n )(<<:[^\n]+)?(.*)$/m.match(config)
config = "#{matches[1]}#{matches[2]}#{matches[3]}\n #{key}: #{value}#{matches[4]}\n"