Подтвердить что ты не робот

Можно ли указать параметры форматирования для to_yaml в ruby?

Код

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

производит

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

Хотя это правильный yaml, он просто выглядит уродливым, когда у вас есть хэш массивов. Есть ли способ для меня получить to_yaml для создания встроенной версии массива yaml?

Хэш параметров можно передать to_yaml, но как вы его используете?

Редактировать 0: Спасибо Pozsár Balázs. Но, начиная с ruby ​​1.8.7 (2009-04-08 patchlevel 160), хэш настроек не работает, как рекламируется.: (

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
4b9b3361

Ответ 1

Этот уродливый хак, похоже, делает трюк...

class Array
  def to_yaml_style
    :inline
  end
end

Просмотр через ruby ​​source, я не могу найти какие-либо опции, которые я мог бы передать, чтобы добиться того же. Параметры по умолчанию описаны в lib/yaml/constants.rb.

Ответ 2

Об опциях хеширования: см. Http://yaml4r.sourceforge.net/doc/page/examples.htm.

Ex. 24: Использование to_yaml с опциями Hash

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

Ex. 25: Доступные символы для опций Hash

Indent: отступ по умолчанию для использования при излучении (по умолчанию 2)
Separator: разделитель по умолчанию для использования между документами (по умолчанию '---')
SortKeys: сортировать хэш-ключи при излучении? (по умолчанию false)
UseHeader: отображать заголовок YAML при излучении? (по умолчанию false)
UseVersion: отображать версию YAML при излучении? (по умолчанию false)
AnchorFormat: строка форматирования для идентификаторов привязки при id%03d (по умолчанию ' id%03d ')
ExplicitTypes: Использовать явные типы при излучении? (по умолчанию false)
BestWidth: ширина символа, используемая при свертывании текста (по умолчанию 80)
UseFold: UseFold сворачивание текста при излучении? (по умолчанию false)
UseBlock: UseBlock весь текст быть буквальным при излучении? (по умолчанию false)
Encoding: формат Unicode для кодирования (по умолчанию :Utf8; требуется Iconv)

Ответ 3

Начиная с Ruby 1.9 psych используется в качестве движка YAML по умолчанию. Он поддерживает некоторые атрибуты: http://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html

Так что для меня это работает:

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

Ответ 4

Просто еще один хак, чтобы указать стиль вывода, но это позволяет настраивать его для определенного объекта, а не глобально (например, для всех массивов).

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

Простой пример:

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

Ответ 5

В последних версиях Ruby для анализа YAML используется модуль Psych. Есть не так много вариантов, которые вы можете передать, но вы можете изменить отступ и ширину строки. Проверьте последнюю документацию Psych для более подробной информации.