Est-il possible de spécifier des options de formatage pour to_yaml en ruby?
Question
Le code
require 'yaml'
puts YAML.load("
is_something:
values: ['yes', 'no']
").to_yaml
produit
---
is_something:
values:
- "yes"
- "no"
Bien qu’il s’agisse d’un yaml correct, il a tout simplement une apparence moche quand vous avez un hachage de tableaux. Existe-t-il un moyen d’obtenir to_yaml
la version inline array de yaml?
Un hachage d'options peut être passé à <=> mais comment l'utilisez-vous?
Modifier 0: Merci Pozs & # 225; r Bal & # 225; zs. Toutefois, à compter de la version 1.8.7 (2009-04-08 patchlevel 160), les options hash ne fonctionnent 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
La solution 2
Ce vilain bidule semble faire l'affaire ...
class Array
def to_yaml_style
:inline
end
end
En parcourant la source de Ruby, je ne trouve aucune option que je puisse utiliser pour atteindre le même objectif. Les options par défaut sont décrites dans le lib / yaml / constants.rb. .
Autres conseils
À propos des options de hachage: voir http://yaml4r.sourceforge.net/doc/ page / examples.htm
Ex. 24: Utilisation de to_yaml
avec un hachage d’options
puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
# --- %YAML:1.0
# -
# - Crispin
# - Glover
Ex. 25: Symboles disponibles pour un hachage d’options
.
Indent
: l'indentation par défaut à utiliser lors de l'émission (valeur par défaut de2
)
Separator
: Le séparateur par défaut à utiliser entre les documents ('---'
par défaut)
SortKeys
: Trier les clés de hachage lors de l'émission? (false
par défaut)
UseHeader
: Afficher l'en-tête YAML lors de l'émission? (UseVersion
par défaut)
AnchorFormat
: Afficher la version de YAML lors de l’émission? (id%03d
par défaut)
ExplicitTypes
: Chaîne de mise en forme pour les identifiants d'ancrage lors de l'émission (valeur par défaut: 'BestWidth
')
80
: Utiliser des types explicites lors de l'émission? (UseFold
par défaut)
UseBlock
: La largeur de caractère à utiliser lors du pliage du texte (Encoding
par défaut)
:Utf8
: Forcer le pliage du texte lors de l'émission? (<=> par défaut)
<=>: Forcer tout le texte à être littéral lors de l'émission? (<=> par défaut)
<=>: Format Unicode avec lequel coder (valeur par défaut <=>; requiert Iconv)
A partir de Ruby 1.9 psych
est utilisé comme moteur YAML par défaut. Il supporte certains attributs: http: // ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html
Donc pour moi ça marche:
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
Juste un autre hack pour spécifier le style de sortie, mais celui-ci permet de le personnaliser pour un objet spécifique plutôt que 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
Les dernières versions de Ruby utilisent le module Psych pour l’analyse YAML. Vous ne pouvez pas choisir beaucoup d'options, mais vous pouvez modifier le retrait et la largeur de ligne. Consultez la dernière documentation psychologique pour plus de détails.