ruby yaml

¿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 : la Indent predeterminada para usar al emitir (por defecto es 2 )
Separator : el separador predeterminado para usar entre documentos (predeterminado en ''---'' )
SortKeys : ¿Ordenar las claves de hash al emitir? (por defecto es false )
UseHeader : UseHeader el encabezado YAML al emitir? (por defecto es false )
UseVersion : ¿Mostrar la versión YAML al emitir? (por defecto es false )
AnchorFormat : una cadena de formato para ID de ancla cuando se emite (por defecto es '' id%03d '')
Tipos ExplicitTypes : ¿Utilizar tipos explícitos al emitir? (por defecto es false )
BestWidth : el ancho de caracteres que se utilizará al doblar texto (el valor predeterminado es 80 )
UseFold : ¿Fuerza el plegado del texto al emitir? (por defecto es false )
UseBlock : ¿Forzar todo el texto para que sea literal al emitir? (por defecto es false )
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