Ruby: записать экранированную строку в YAML - PullRequest
7 голосов
/ 04 апреля 2009

следующие ...

require 'yaml'
test = "I'm a b&d string"
File.open('test.yaml', 'w') do |out|
  out.write(test.to_yaml)
end

... выходы ...

--- this is a b&d string

Как я могу получить его на выходе

--- 'this is a b&d string'

???

Ответы [ 2 ]

19 голосов
/ 04 апреля 2009

Если вы хотите сохранить экранированную строку в YAML, экранируйте его, используя #inspect, прежде чем конвертировать его в YAML:

irb> require 'yaml'
=> true
irb> str = %{This string's a little complicated, but it "does the job" (man, I hate scare quotes)}
=> "This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)"
irb> puts str
This string's a little complicated, but it "does the job" (man, I hate scare quotes)
=> nil
irb> puts str.inspect
"This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)"
=> nil
irb> puts str.to_yaml
--- This string's a little complicated, but it "does the job" (man, I hate scare quotes)
=> nil
irb> puts str.inspect.to_yaml
--- "\"This string's a little complicated, but it \\\"does the job\\\" (man, I hate scare quotes)\""
=> nil

YAML не заключает в кавычки строки, если это не требуется. Он заключает в кавычки строки, если они включают вещи, которые он пропустил бы, если бы хранил их без кавычек - например, окружающие символы кавычек или завершающие или начальные пробелы:

irb> puts (str + " ").to_yaml
--- "This string's a little complicated, but it \"does the job\" (man, I hate scare quotes) "
=> nil
irb> puts %{"#{str}"}.to_yaml
--- "\"This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)\""
=> nil
irb> puts (" " + str).to_yaml
--- " This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)"
=> nil

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

Не имеет значения, есть ли в ваших строках '&', YAML сохранит строку:

irb> test = "I'm a b&d string"
=> "I'm a b&d string"
irb> YAML::load(YAML::dump(test))
=> "I'm a b&d string"
irb> YAML::load(YAML::dump(test)) == test
=> true
2 голосов
/ 18 декабря 2017

Согласно спецификации YAML 1.2 , документ JSON является действительным документом YAML.

Основная цель этого пересмотра - привести YAML в соответствие с JSON в качестве официального подмножества.

Следовательно, допустимая строка JSON является допустимой строкой YAML.

require 'json'
'my string'.to_json  # => produces a valid YAML string

Это очень удобно для файлов YAML, обогащенных синтаксисом ERB, где string.to_yaml не будет работать во многих случаях.

Пример:

# openvpn.yml.erb
openvpn:
  cert: <%= ENV.fetch('OPENVPN_CERT').to_json %>
  key: <%= ENV.fetch('OPENVPN_KEY').to_json %>
...