2013-08-19 2 views
3

У меня есть небольшой скрипт для автоматизации некоторых вещей в файлах YAML.Как заставить двойные кавычки при сбрасывании YAML?

Я прочитал исходный файл YAML и преобразовать его в хэш, а затем dump его в файл после его модификации:

File.open(output_file, "w") do |out| 
    YAML.dump(modified_hash, out) 
end 

Это прекрасно работает, но он удаляет двойные кавычки строки, если они Арен Не нужно. Это действительно YAML, но это выглядит не очень хорошо.

Я мог бы добавить пробел в конце каждой строки, чтобы заставить одиночные кавычки, но я не слишком доволен этим. Есть ли способ форсировать двойные кавычки вокруг строк?

+1

Необязательные цитаты похожи на одно из трех больших отличий YAML от JSON. Третий - привлекательная неприятность, и вы, вероятно, не используете ее. Возможно, вы могли бы просто JSON? – delnan

+0

нет, к сожалению, я вынужден использовать YAML. Я также был бы в порядке с внешним инструментом, который автоматически добавляет цитаты – jomo

+0

JSON - это подмножество YAML (полностью для YAML 1.2, практически полностью для более ранних версий). – delnan

ответ

0

Я нашел решение, это странно, но оно работает.

Чтобы заставить одинарные кавычки, я прошел через хэш и добавил "foobar " (обратите внимание на пробел) на каждое значение. После использования YAML.dump я снова открыл файл и заменил "foobar " пустой строкой.

Чтобы заставить двойные кавычки, я обнаружил, что добавление "foo \nbar" делает эту работу. Опять же, я затем открываю файл и заменяю "foo \\nbar" пустой строкой. Странно, но работает.

Обратите внимание, что вы, вероятно, захотите выбрать что-то менее вероятное, чем foobar.

1

Вот версия Рубина ответа @ йом, ибо в будущем чьего:

def ensure_quotes(h) 
    h.each do |k, v| 
    if v.is_a?(Hash) 
     ensure_quotes(v) 
     next 
    end 
    h[k] = v + "__ensure_quotes__\n " 
    end 
end 

def dump_yaml_with_double_quotes(yaml_file) 
    yaml = YAML.load_file(yaml_file) 
    File.open(yaml_file, 'w') do |f| 
    YAML.dump(ensure_quotes(yaml), f, line_width: -1) 
    end 
    `sed -i '' "s/__ensure_quotes__[\\]n //g" #{yaml_file}` 
end 

Он загружает YAML из файла, рекурсивно присоединяет магию квотирования строки для всех значений в объекте YAML, а затем сбрасывает что YAML в тот же файл, а затем использует sed для удаления вхождения магической строки из выходного файла.

1

Это работает очень хорошо. Я получил его от here

require 'psych' 

ast = Psych.parse_stream DATA.read 

# First pass, quote everything 
ast.grep(Psych::Nodes::Scalar).each do |node| 
    node.plain = false 
    node.quoted = true 
    node.style = Psych::Nodes::Scalar::DOUBLE_QUOTED 
end 

# Second pass, unquote keys 
ast.grep(Psych::Nodes::Mapping).each do |node| 
    node.children.each_slice(2) do |k, _| 
    k.plain = true 
    k.quoted = false 
    k.style = Psych::Nodes::Scalar::ANY 
    end 
end 

puts ast.yaml