Psych YAML解析包括评论

时间:2012-07-31 06:52:25

标签: ruby yaml psych

根据YAML文件中的http://yaml.org/spec/current.html#id2509980条评论是一个表示性细节,不得在序列化/表示图(http://yaml.org/spec/current.html#representation/)中。看起来Psych正在根据规范进行解析并丢失注释,这意味着当文件包含注释时,无法解析YAML文件并将其再次序列化。在我看来这很奇怪,因为评论在这样的文件中很重要(例如配置)。

有没有人知道是否可以解析现有图书馆的评论,或者是我自己完成这一切的唯一方法?

3 个答案:

答案 0 :(得分:1)

您可以在较低级别上迭代节点,在发出时保留注释。此外,您可以看到syck引擎是否为您提供了所需的结果。

答案 1 :(得分:1)

我们也可以做一些这样的事情,它会改变键值并保留评论。

require 'yaml'
thing = YAML.load_file('/opt/database.yml')
hostname = thing["common"]["host_name"]
appname = thing["common"]["app_name"]
motdobj = IO.readlines('/opt/database.yml')
motdobj = motdobj.map {|s| s.gsub(hostname, "mrigesh")}
motdobj = motdobj.map {|s| s.gsub(appname, "abc")}

File.open('/opt/database.yml', "w" ) do | file1 |
    file1.puts motdobj
    file1.close
end

答案 2 :(得分:0)

我喜欢@ josh-voigts的疯狂想法。这是一个疯狂的实现。评论几乎可以在任何地方穿插,并且有效!

require 'tempfile'

def yaml_conf_edit(fn, &block)
  conf = File.open(fn) {|f| YAML.load(f.read)}

  before = Tempfile.new('before')
  before.write(conf.to_yaml)
  before.close

  yield conf

  after = Tempfile.new('after')
  after.write(conf.to_yaml)
  after.close

  `merge #{fn} #{before.path} #{after.path}`
  before.unlink; after.unlink

  conf
end

您可以使用以下内容:

yaml_conf_edit('conf/database.yml') do |conf| 
  conf['development']['database'] = db_timestamped
end