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
Foi útil?

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 para false)
UseHeader: Exibe o cabeçalho YAML ao emitir? (padrão para false)
UseVersion: Mostra a versão YAML ao emitir? (padrão para false)
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 para false)
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 para false)
UseBlock: Força todo o texto a ser literal quando emitindo? (padrão para false)
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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top