web-dev-qa-db-ja.com

rubyでto_yamlのフォーマットオプションを指定することは可能ですか?

コード

require 'yaml'
puts YAML.load("
is_something:
  values: ['yes', 'no']
").to_yaml

を生成します

--- 
is_something: 
  values: 
  - "yes"
  - "no"

これは正しいyamlですが、配列のハッシュがあると見栄えが悪くなります。 to_yamlを取得してyamlのインライン配列バージョンを生成する方法はありますか?

オプションハッシュは to_yaml に渡すことができますが、どのように使用しますか?

編集0:PozsárBalázsに感謝します。ただし、Ruby 1.8.7(2009-04-08パッチレベル160)の時点では、オプションハッシュはアドバタイズされたとおりに機能しません。:(

irb
irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
--- 
- - Crispin
  - Glover
=> nil
23
anshul

この醜いハックはトリックをするようです...

class Array
  def to_yaml_style
    :inline
  end
end

Rubyのソースを閲覧していると、同じことを実現するために渡すことができるオプションが見つかりません。デフォルトのオプションは lib/yaml/constants.rb で説明されています。

6
anshul

ハッシュオプションについて: http://yaml4r.sourceforge.net/doc/page/examples.htm を参照してください。

例24:オプションハッシュでto_yamlを使用する

puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
#   --- %YAML:1.0
#   -
#       - Crispin
#       - Glover

例25:オプションハッシュに使用可能な記号

Indent:発行時に使用するデフォルトのインデント(デフォルトは2
Separator:ドキュメント間で使用するデフォルトの区切り文字(デフォルトは'---'
SortKeys:発行時にハッシュキーを並べ替えますか? (デフォルトはfalse
UseHeader:発行時にYAMLヘッダーを表示しますか? (デフォルトはfalse
UseVersion:放出時にYAMLバージョンを表示しますか? (デフォルトはfalse
AnchorFormat:発行時のアンカーIDのフォーマット文字列(デフォルトは 'id%03d')
ExplicitTypes:発行時に明示的な型を使用しますか? (デフォルトはfalse
BestWidth:テキストを折りたたむときに使用する文字幅(デフォルトは80
UseFold:送信時にテキストを強制的に折りたたむ? (デフォルトはfalse
UseBlock:放出時にすべてのテキストをリテラルにする? (デフォルトはfalse
Encoding:エンコードに使用するUnicode形式(デフォルトは:Utf8、Iconvが必要)

13
Balázs Pozsár

Ruby 1.9 psychから開始してデフォルトのYAMLエンジンとして使用され、いくつかの属性をサポートします: http://Ruby-doc.org/stdlib-2.1。 0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html

だから私にとってはそれはうまくいく:

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> puts [{'a'=> 'b', 'c'=> 'd'}, {'e'=> 'f', 'g'=>'h'}].to_yaml(:indentation => 4)
---
-   a: b
    c: d
-   e: f
    g: h
8
Paul

出力スタイルを指定するためのもう1つのハックですが、これにより、グローバルにではなく、特定のオブジェクトごとにカスタマイズできます(たとえば、すべての配列に対して)。

https://Gist.github.com/jirutka/31b1a61162e41d5064fc

簡単な例:

class Movie
  attr_accessor :genres, :actors

  # method called by psych to render YAML
  def encode_with(coder)
    # render array inline (flow style)
    coder['genres'] = StyledYAML.inline(genres) if genres
    # render in default style (block)
    coder['actors'] = actors if actors
  end
end
1
Jakub Jirutka

Rubyの最新バージョンはYAML解析にPsychモジュールを使用します。渡すことができるオプションは多くありませんが、インデントと線幅を変更できます。最新の Psychドキュメントを確認してください) 詳細については。

0
Sixty4Bit