2009-06-28 15 views
18

KodCzy jest możliwe określenie opcji formatowania dla to_yaml w ruby?

require 'yaml' 
puts YAML.load(" 
is_something: 
    values: ['yes', 'no'] 
").to_yaml 

produkuje

--- 
is_something: 
    values: 
    - "yes" 
    - "no" 

Chociaż jest to poprawne yaml, to po prostu wygląda brzydko, gdy masz hash tablic. Czy istnieje sposób, aby uzyskać to_yaml do produkcji wbudowanej wersji tablicy yaml?

Hash opcji może zostać przekazany do to_yaml, ale jak z niego korzystać?

Edytuj 0: Dzięki Pozsár Balázs. Jednak od wersji ruby ​​1.8.7 (2009-04-08 patchlevel 160) skrót mieszania opcji nie działa zgodnie z reklamą. :(

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 

Odpowiedz

6

Ten brzydki hack, wydaje rade ...

class Array 
    def to_yaml_style 
    :inline 
    end 
end 

Przeglądając źródła Rubiego , Nie mogę znaleźć żadnych opcji, które mógłbym przejść, aby osiągnąć to samo. Domyślne opcje są opisane w lib/yaml/constants.rb.

+3

Aby wydrukować tylko małe tabliczki wbudowane: klasa Array; def to_yaml_style(); self.length <5? : inline: super; koniec – Costi

9

o opcjach hash: patrz http://yaml4r.sourceforge.net/doc/page/examples.htm

Wj 24. Korzystanie to_yaml z opcji Hash

puts [[ 'Crispin', 'Glover' ]].to_yaml(:Indent => 4, :UseHeader => true, :UseVersion => true) 
# prints: 
# --- %YAML:1.0 
# - 
#  - Crispin 
#  - Glover 

Ex. 25: Dostępne symbole dla opcji Hash

Indent: Domyślne wcięcie używane podczas emitowania (domyślnie 2)
: Domyślny separator do użycia między dokumentami (domyślnie '---')
SortKeys: Sortowanie klawiszy skrótu podczas emitowania? (domyślnie false)
UseHeader: Wyświetlaj nagłówek YAML podczas emitowania? (domyślnie false)
UseVersion: Wyświetlaj wersję YAML podczas emisji? (domyślnie false)
AnchorFormat: formatowanie ciąg do identyfikatorów kotwicznych gdy emitujące (domyślnie „id%03d”)
ExplicitTypes: Stosować wyraźne typy gdy emitujące? (domyślnie false)
BestWidth: Szerokość znaków użyć przy składaniu tekstu (domyślnie 80)
UseFold: Siła składanie tekstu, gdy emitujące? (domyślnie false)
UseBlock: Wymuszenie, aby cały tekst był dosłowny podczas emitowania? (domyślnie false)
Encoding: Unicode format kodowania z (domyślnie :Utf8; wymaga iconv)

+15

nie działa. Od źródła nie jestem nawet pewien, czy hash opts jest przekazywane do syck. – anshul

1

Kolejny hack do określenia stylu wyjściowego, ale ten pozwala dostosować go do konkretnego obiektu, zamiast globalnie (np. Dla wszystkich tablic).

https://gist.github.com/jirutka/31b1a61162e41d5064fc

Prosty przykład:

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