Можно ли указать параметры форматирования для to_yaml в ruby? - PullRequest
20 голосов
/ 28 июня 2009

код

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, уровень исправления 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

Ответы [ 4 ]

10 голосов
/ 28 июня 2009

Об опциях хеширования: см. 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')
ExplicitTypes: Использовать явные типы при излучении? (по умолчанию false)
BestWidth: ширина символа, используемая при свертывании текста (по умолчанию 80)
UseFold: принудительное свертывание текста при излучении? (по умолчанию false)
UseBlock: заставить весь текст быть буквальным при излучении? (по умолчанию false)
Encoding: формат Unicode для кодирования (по умолчанию :Utf8; требуется Iconv)

6 голосов
/ 26 августа 2016

Начиная с 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
6 голосов
/ 28 июня 2009

Кажется, этот уродливый хак добился цели ...

class Array
  def to_yaml_style
    :inline
  end
end

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

1 голос
/ 13 августа 2014

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...