Est-il possible de spécifier des options de formatage pour to_yaml en ruby?

StackOverflow https://stackoverflow.com/questions/1054730

  •  20-08-2019
  •  | 
  •  

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
Était-ce utile?

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 de 2)
  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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top