Неправильный отступ при преобразовании хэша ruby ​​в yaml - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь преобразовать хэш-объект ruby ​​в формат 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"}}}

Примечание: я использовал метод sub для удаления "---" в начале вывода

Шаблон 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

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

1 Ответ

0 голосов
/ 07 декабря 2018

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

<%= 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 ") заменяет все символы новой строки на новую строку плюс два пробела.

...