14 Stimmen

Psych YAML-Parsing einschließlich Kommentare

Nach Angaben von http://yaml.org/spec/current.html#id2509980 Kommentare in YAML-Dateien sind ein präsentatives Detail und dürfen nicht im Serialisierungs-/Repräsentationsgraphen enthalten sein ( http://yaml.org/spec/current.html#representation/ ). Das bedeutet, dass es nicht möglich ist, eine YAML-Datei zu parsen und auf genau dieselbe Weise wieder zu serialisieren, wenn die Datei Kommentare enthält. Was meiner Meinung nach sehr seltsam ist, da Kommentare in solchen Dateien (z.B. Configs) wichtig sind.

Weiß jemand, ob es möglich ist, Kommentare mit einer vorhandenen Bibliothek zu analysieren oder ist der einzige Weg, um zu gehen, um es alle von mir selbst zu tun?

2voto

Wir können auch etwas Ähnliches tun, was den Schlüsselwert ändern und die Kommentare beibehalten würde.

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

1voto

Bjoern Rennhak Punkte 6596

Man könnte die Knoten auf einer niedrigeren Ebene iterieren und dabei die Kommentare beim Emittieren beibehalten. Sie könnten auch sehen, ob die Syck-Engine Ihnen das gewünschte Ergebnis liefert.

0voto

TKH Punkte 798

Ich mag @josh-voigts verrückte Idee. Hier ist eine verrückte Umsetzung. Kommentare können fast überall eingestreut werden und es funktioniert!

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

Das können Sie in etwas wie:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X