Reputation: 6005
The code
require 'yaml'
puts YAML.load("
is_something:
values: ['yes', 'no']
").to_yaml
produces
---
is_something:
values:
- "yes"
- "no"
While this is a correct yaml, it just looks ugly when you have a hash of arrays. Is there a way for me to get to_yaml
to produce the inline array version of the yaml?
An options hash can be passed to to_yaml
but how do you use it?
Edit 0: Thanks Pozsár Balázs. But, as of ruby 1.8.7 (2009-04-08 patchlevel 160), the options hash does not work as advertised. :(
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
Upvotes: 24
Views: 31314
Reputation: 2498
Use Psych directly.
Indentation has no effect:
my_yaml.to_yaml(:indentation => 2)
Indentation works:
Psych.dump(my_yaml, :indentation => 8)
Upvotes: 0
Reputation: 13402
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.
Upvotes: 0
Reputation: 111
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
Upvotes: 8
Reputation: 1689
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)
Upvotes: 11
Reputation: 10827
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
Upvotes: 1
Reputation: 6005
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.
Upvotes: 6