5

to_yamlメソッドは素晴らしいYAML出力を生成しますが、いくつかの要素の前にコメント行を含めたいと思います。そうする方法はありますか?

たとえば、私は以下を作成したいと思います。

# hostname or IP address of client
client: host4.example.com
# hostname or IP address of server
server: 192.168.222.222

次のようなものから:

{
  :client => 'host4.example.com',
  :server => '192.168.222.222',
}.to_yaml

...しかし、YAMLモジュールに達成する方法があるかどうかはわかりません。

更新:コメントからデータを分離する必要があるため、コメントを挿入するために正規表現を使用するソリューションを使用しないことになりました。私にとって最も簡単で理解しやすい解決策は次のとおりです。

require 'yaml'

source = <<SOURCE
# hostname or IP address of client
client: host4.example.com
# hostname or IP address of server
server: 192.168.222.222
SOURCE

conf = YAML::load(source)

puts source

私にとっての利点は、何も繰り返されず(たとえば、「client:」は1回だけ指定される)、データとコメントが一緒になり、ソースをYAMLとして出力でき、データ構造(confで利用可能)が使用する。

4

3 に答える 3

3

すべての挿入に対して文字列置換を実行できます。

require 'yaml'

source = {
  :client => 'host4.example.com',
  :server => '192.168.222.222',
}.to_yaml

substitution_list = {
  /:client:/ => "# hostname or IP address of client\n:client:",
  /:server:/ => "# hostname or IP address of server\n:server:"
}

substitution_list.each do |pattern, replacement|
  source.gsub!(pattern, replacement)
end

puts source

出力:

--- 
# hostname or IP address of client
:client: host4.example.com
# hostname or IP address of server
:server: 192.168.222.222
于 2013-01-04T01:19:43.850 に答える
2

このようなもの:

my_hash = {a: 444}
y=YAML::Stream.new()
y.add(my_hash)
y.emit("# this is a comment")

もちろん、入力ハッシュを自分で、add()またはemit()必要に応じて歩く必要があります。to_yamlクイックスタートのためにメソッドのソースを見ることができます。

于 2013-01-04T01:02:07.033 に答える
1

これは完璧ではありませんが(たとえば、ミッドアレイのサポートはありません)、私のニーズには対応しています。

  def commentify_yaml(db)
    ret = []
    db.to_yaml(line_width: -1).each_line do |l|
      if l.match(/^\s*:c\d+:/)
        l = l.sub(/:c(\d+)?:/, '#').
            sub(/(^\s*# )["']/, '\1').
            sub(/["']\s*$/, '').
            gsub(/''(\S+?)''/, "'\\1'").
            gsub(/(\S)''/, "\\1'")
      end
      ret << l.chomp
    end
    ret * "\n"
  end

使用例。

commentify_yaml(
  {
    c1: 'Comment line 1',
    c2: 'Comment line 2',
    'hash_1' => {
      c1: 'Foo',
      c2: 'Bar',
      'key_1' => "Hello!",
    },
    'baz' => qux,
    c3: 'Keep up-numbering the comments in the same hash',
    'array_1' => [
       1,
       2,
       3
     ]
  }
)

==>

# Comment line 1
# Comment line 2
hash_1:
  # Foo
  # Bar
  key_1: "Hello!"
baz: "Value of qux"
# Keep up-numbering the comments in the same hash
array_1:
- 1
- 2
- 3

(注:Syckは、ほぼ間違いなく必要な方法で配列をインデントしません。)

于 2019-11-03T20:35:55.083 に答える