¿Es posible especificar opciones de formato para to_yaml en ruby?
(4)
A partir de Ruby 1.9 psych
se utiliza como un motor YAML predeterminado. Admite algunos atributos: http://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html
Así que para mí funciona:
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
El código
require ''yaml''
puts YAML.load("
is_something:
values: [''yes'', ''no'']
").to_yaml
produce
---
is_something:
values:
- "yes"
- "no"
Si bien este es un yaml correcto, solo se ve feo cuando tienes un hash de arreglos. ¿Hay alguna manera de que llegue to_yaml
para producir la versión de matriz en línea del yaml?
Se puede pasar un hash de opciones a to_yaml
pero, ¿cómo se usa?
Edit 0: Gracias Pozsár Balázs. Pero, a partir de ruby 1.8.7 (2009-04-08 patchlevel 160), el hash de opciones no funciona como se anuncia. :(
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
Acerca de las opciones de hash: ver http://yaml4r.sourceforge.net/doc/page/examples.htm
Ex. 24: Usando to_yaml
con un hash de opciones
puts [[ ''Crispin'', ''Glover'' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
# --- %YAML:1.0
# -
# - Crispin
# - Glover
Ex. 25: Símbolos disponibles para un hash de opciones
Indent
: laIndent
predeterminada para usar al emitir (por defecto es2
)
Separator
: el separador predeterminado para usar entre documentos (predeterminado en''---''
)
SortKeys
: ¿Ordenar las claves de hash al emitir? (por defecto esfalse
)
UseHeader
:UseHeader
el encabezado YAML al emitir? (por defecto esfalse
)
UseVersion
: ¿Mostrar la versión YAML al emitir? (por defecto esfalse
)
AnchorFormat
: una cadena de formato para ID de ancla cuando se emite (por defecto es ''id%03d
'')
TiposExplicitTypes
: ¿Utilizar tipos explícitos al emitir? (por defecto esfalse
)
BestWidth
: el ancho de caracteres que se utilizará al doblar texto (el valor predeterminado es80
)
UseFold
: ¿Fuerza el plegado del texto al emitir? (por defecto esfalse
)
UseBlock
: ¿Forzar todo el texto para que sea literal al emitir? (por defecto esfalse
)
Encoding
: formato Unicode para codificar con (predeterminado:Utf8
; requiere Iconv)
Este truco feo parece hacer el truco ...
class Array
def to_yaml_style
:inline
end
end
Al buscar en la fuente de Ruby, no puedo encontrar ninguna opción que pueda aprobar para lograr lo mismo. Las opciones predeterminadas se describen en lib/yaml/constants.rb .
Solo otro truco para especificar el estilo de salida, pero este permite personalizarlo por objeto específico, en lugar de globalmente (por ejemplo, para todas las matrices).
https://gist.github.com/jirutka/31b1a61162e41d5064fc
Ejemplo simple:
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