2009-06-28 4 views
18

Der CodeIst es möglich, Formatierungsoptionen für to_yaml in Ruby anzugeben?

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

produziert

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

Zwar ist dies eine richtige yaml ist, es sieht einfach hässlich, wenn Sie einen Hash von Arrays haben. Gibt es eine Möglichkeit für mich, to_yaml die Inline-Array-Version des Yaml zu produzieren?

Ein Options-Hash kann an to_yaml übergeben werden, aber wie verwenden Sie es?

Edit 0: Danke Pozsár Balázs. Aber ab Ruby 1.8.7 (2009-04-08 Patchlevel 160) funktioniert der Optionen-Hash nicht wie angekündigt. :(

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 

Antwort

6

Dieser hässliche Hack scheint den Trick zu tun ...

class Array 
    def to_yaml_style 
    :inline 
    end 
end 

durch Quelle rubin surfen Ich kann keine Optionen finden, die ich weitergeben könnte, um dasselbe zu erreichen. Standardoptionen sind in der lib/yaml/constants.rb beschrieben.

+3

Um nur kleine Arrays inline zu drucken: Klasse Array; def to_yaml_style(); self.length <5? : Inline: Super; Ende Ende – Costi

9

über die Hash-Optionen: siehe http://yaml4r.sourceforge.net/doc/page/examples.htm

Ex. 24: Mit to_yaml mit einer options Hash

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

Ex. 25: Verfügbare Symbole für eine Option Hash

Indent: Die Standardeinzug beim Senden (standardmäßig 2)
Separator: Das Standardtrennzeichen, das zwischen Dokumenten verwendet werden soll (standardmäßig '---')
SortKeys: Hash-Schlüssel beim Senden sortieren? (standardmäßig false)
UseHeader: Anzeigen der YAML-Kopfzeile beim Senden? (standardmäßig false)
UseVersion: Zeigt die YAML-Version beim Senden an? (Standardeinstellung false)
AnchorFormat: Eine Formatierungsstring für IDs Anker, wenn emittierende (standardmäßig ‚id%03d‘)
ExplicitTypes: Verwenden Sie explizite Typen, wenn emittierende? (Standard: false)
BestWidth: die Zeichenbreite zu verwenden, wenn Text Falten (Standard: 80)
UseFold: Erzwingen Faltung von Text beim Emittieren? (standardmäßig false)
UseBlock: Erzwingen alle Text beim Senden wörtlich zu sein? (Standardeinstellung false)
Encoding: Unicode-Format mit zu kodieren (Standardeinstellung :Utf8; erfordert Iconv)

+15

funktioniert nicht. Von der Quelle bin ich nicht einmal sicher, ob der opts-Hash an syck weitergegeben wird. – anshul

1

Nur ein weiterer Hack, um den Ausgabestil anzugeben, aber dieser erlaubt es, ihn für jedes spezifische Objekt anzupassen, anstatt global (z. B. für alle Arrays).

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

Einfaches Beispiel:

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