É possível especificar opções para to_yaml em ruby ??formatação?
Pergunta
O código
require 'yaml'
puts YAML.load("
is_something:
values: ['yes', 'no']
").to_yaml
produz
---
is_something:
values:
- "yes"
- "no"
Embora esta seja uma yaml correta, ele só olha feio quando você tem um hash de matrizes. Existe uma maneira para eu conseguir to_yaml
para produzir a versão série em linha do yaml?
opções de um hash pode ser passado para to_yaml
mas como você usá-lo?
Editar 0: Graças Pozsár Balázs. Mas, a partir de ruby ??1.8.7 (2009-04-08 patchlevel 160), as opções de hash não funciona como anunciado. : (
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
Solução 2
Este hack feio parece fazer o truque ...
class Array
def to_yaml_style
:inline
end
end
Navegação através de fonte de Ruby, eu não posso encontrar todas as opções que eu poderia passar para conseguir o mesmo. opções padrão são descritos no lib / yaml / constants.rb .
Outras dicas
Sobre as opções de hash: consulte http://yaml4r.sourceforge.net/doc/ page / examples.htm
Ex. 24: Usando to_yaml
com um Hash opções
puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
# --- %YAML:1.0
# -
# - Crispin
# - Glover
Ex. 25: Símbolos disponíveis para uma Hash opções
Indent
: A fissura padrão para usar quando emissores de luz (o padrão é2
)
Separator
: O separador padrão para uso entre documentos (padrão para'---'
)
SortKeys
: Ordenação de chaves de hash quando emissores? (padrão parafalse
)
UseHeader
: Exibe o cabeçalho YAML ao emitir? (padrão parafalse
)
UseVersion
: Mostra a versão YAML ao emitir? (padrão parafalse
)
AnchorFormat
: Uma seqüência de formatação para IDs de ancoragem quando emissores de luz (padrão é 'id%03d
')
ExplicitTypes
: Utilize tipos explícitas ao emitir? (padrão parafalse
)
BestWidth
: A largura de caracteres para uso ao dobrar de texto (o padrão é80
)
UseFold
: Força dobrar de texto quando emitindo? (padrão parafalse
)
UseBlock
: Força todo o texto a ser literal quando emitindo? (padrão parafalse
)
Encoding
: formato Unicode para codificar com (o padrão é:Utf8
; requer Iconv)
A partir de Ruby 1.9 psych
é usado como um motor YAML padrão. Ele suporta alguns atributos: http: // ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html
Então, para mim 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
Apenas mais um hack para especificar o estilo de saída, mas este permite personalizá-lo por objeto específico, em vez de globalmente (por exemplo para todas as matrizes).
https://gist.github.com/jirutka/31b1a61162e41d5064fc
Um exemplo simples:
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
As últimas versões do Ruby utilizar o módulo de Psych para YAML análise. Não há muitas opções que você pode passar, mas você pode mudar recuo e largura da linha. Verifique a documentação mais recente Psych para mais detalhes.