Можно ли указать параметры форматирования для 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
Ответы
Ответ 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 для более подробной информации.