The code
require \'yaml\'
puts YAML.load(\"
is_something:
values: [\'yes\', \'no\']
\").to_yaml
produces
---
is_somethin
The latest versions of Ruby use the Psych module for YAML parsing. There aren't many options that you can pass but you can change indention and line width. Check the latest Psych documentation for more details.
Just another hack to specify the output style, but this one allows to customize it per specific object, instead of globally (e.g. for all arrays).
https://gist.github.com/jirutka/31b1a61162e41d5064fc
Simple example:
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
About the hash options: see http://yaml4r.sourceforge.net/doc/page/examples.htm
Ex. 24: Using to_yaml
with an options Hash
puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
# --- %YAML:1.0
# -
# - Crispin
# - Glover
Ex. 25: Available symbols for an options Hash
Indent
: The default indentation to use when emitting (defaults to2
)
Separator
: The default separator to use between documents (defaults to'---'
)
SortKeys
: Sort Hash keys when emitting? (defaults tofalse
)
UseHeader
: Display the YAML header when emitting? (defaults tofalse
)
UseVersion
: Display the YAML version when emitting? (defaults tofalse
)
AnchorFormat
: A formatting string for anchor IDs when emitting (defaults to 'id%03d
')
ExplicitTypes
: Use explicit types when emitting? (defaults tofalse
)
BestWidth
: The character width to use when folding text (defaults to80
)
UseFold
: Force folding of text when emitting? (defaults tofalse
)
UseBlock
: Force all text to be literal when emitting? (defaults tofalse
)
Encoding
: Unicode format to encode with (defaults to:Utf8
; requires Iconv)
Starting from Ruby 1.9 psych
is used as a default YAML engine. It supports some attributes: http://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html
So for me it works:
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
This ugly hack seems to do the trick...
class Array
def to_yaml_style
:inline
end
end
Browsing through ruby's source, I can't find any options I could pass to achieve the same. Default options are described in the lib/yaml/constants.rb.