Неправильный отступ при преобразовании рубинового хэша в yaml

Я пытаюсь преобразовать рубиновый хэш-объект в формат YAML с помощью YAML.dump (obj), но я получаю неправильный отступ даже после использования параметров дампа.

У меня есть исполняемый скрипт ruby:

#!/usr/bin/ruby

require "yaml"
require "erb"

context_path = ARGV[0]
context = YAML.load_file(context_path)['context']

def get_yaml(obj)
  YAML.dump( obj['imports']['external_repositories']['credentials'] ).sub(/.*?\n/,'')
end

Стоимость - obj['imports']['external_repositories']['credentials'] составляет

{"iacbox"=>{"basic"=>{"name"=>"", "password"=>""}}, "nexus"=>{"basic"=>{"name"=>"cpreader", "password"=>"swordfish"}}}

Примечание. Я использовал вспомогательный метод, чтобы удалить "---" в начале вывода.

Шаблон ERB вызывает вышеуказанный метод get_yaml как:

credentials:
   <%= get_yaml( context ) %>

Ожидаемый результат:

credentials:
iacbox:
  basic:
    name: ''
    password: ''
nexus:
  basic:
    name: cpreader
    password: swordfish

в то время как я ожидаю вывода как:

credentials:
  iacbox:
    basic:
      name: ''
      password: ''
  nexus:
    basic:
      name: cpreader
      password: swordfish

Как я могу получить ожидаемый результат из дампа?

🤔 А знаете ли вы, что...
Один из популярных примеров использования Rails - Twitter, который начал свою историю как Rails-приложение.


1
481
1

Ответ:

Я думаю, что проще всего вам здесь просто поместить ключ учетных данных также в хэш, т.е. изменить фрагмент шаблона так, чтобы он состоял из одной строки:

<%= get_yaml( context ) %>

И измените свой метод get_yaml на:

def get_yaml(obj)
  YAML.dump({'credentials' => obj['imports']['external_repositories']['credentials']})
    .sub(/.*?\n/,'')
end

Если это не сработает для вас, например, если у вас есть дополнительные ключи под ключом учетных данных, который вы не упомянули, вы также можете сделать что-то вроде этого:

def get_yaml(obj)
  YAML.dump(obj['imports']['external_repositories']['credentials'])
    .sub(/^---\n/,'')
    .gsub(/\n/m,"\n  ")
end

Где gsub(/\n/m,"\n ") заменяет все новые строки на новую строку плюс два пробела.