2009-06-28 5 views
18

Le codeEst-il possible de spécifier des options de formatage pour to_yaml dans ruby?

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

produit

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

Bien que ce soit une yaml correcte, il semble juste laid quand vous avez un hachage de tableaux. Y at-il un moyen pour moi d'obtenir to_yaml pour produire la version de tableau en ligne du yaml?

Un hachage d'options peut être passé à to_yaml mais comment l'utilisez-vous?

Édition 0: Merci Pozsár Balázs. Mais, à partir de ruby ​​1.8.7 (2009-04-08 patchlevel 160), le hachage des options ne fonctionne pas comme annoncé. :(

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 

Répondre

6

Ce hack laid semble faire l'affaire ...

class Array 
    def to_yaml_style 
    :inline 
    end 
end 

En parcourant la source de rubis , Je ne peux pas trouver d'options que je pourrais passer pour atteindre la même chose. Les options par défaut sont décrites dans le lib/yaml/constants.rb.

+3

Pour n'imprimer que de petits tableaux en ligne: class Array; def to_yaml_style(); self.length <5? : en ligne: super; extrémité – Costi

9

A propos des options de hachage: voir http://yaml4r.sourceforge.net/doc/page/examples.htm

Ex. 24: Utilisation de to_yaml avec une des options Hash

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

Ex. 25: Symboles disponibles pour une des options Hash

Indent: indentation par défaut à utiliser lors de l'émission (par défaut)
Separator: Le séparateur par défaut à utiliser entre les documents (par défaut) '---'
SortKeys: Trier clés Hash lors de l'émission? (par défaut à false)
UseHeader: Afficher l'en-tête YAML lors de l'émission? (par défaut à false)
UseVersion: Afficher la version YAML lors de l'émission? (par défaut) false
AnchorFormat: Une chaîne de mise en forme pour les ID d'ancrage lors de l'émission (par défaut « id%03d »)
ExplicitTypes: Utilisez les types explicites lors de l'émission? (valeur par défaut) false
BestWidth: La largeur de caractères à utiliser pour le texte de pliage (par défaut) 80
UseFold: pliage de la Force de texte lors de l'émission? (par défaut à false)
UseBlock: Force tout le texte à être littéral lors de l'émission? (par défaut false)
Encoding: format Unicode pour coder avec (par défaut :Utf8, nécessite Iconv)

+15

ne fonctionne pas. De la source, je ne suis même pas sûr si le hachage opts est transmis à syck. – anshul

1

Juste un autre hack pour spécifier le style de sortie, mais celui-ci permet de le personnaliser par objet spécifique, au lieu de globalement (par exemple pour tous les tableaux).

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

Exemple 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