Himanshu
Himanshu

Reputation: 21

Improper indentation in converting ruby hash to yaml

I am trying to convert ruby hash object to YAML format using YAML.dump(obj) but I am getting improper indentation even after using dump options.

I have below executable ruby script :

#!/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

The value of - obj['imports']['external_repositories']['credentials'] is

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

Note : I used the sub method to remove "---" at the start of the output

The ERB template calls the above get_yaml method as :

credentials:
   <%= get_yaml( context ) %>

The output that is coming is :

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

while I am expecting the output as :

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

How can I get the expected output from a dump?

Upvotes: 2

Views: 842

Answers (1)

Alex Harvey
Alex Harvey

Reputation: 15472

I think the easiest thing for you to do here is just put the credentials key also in the Hash, i.e. change your template snippet so that it is one line:

<%= get_yaml( context ) %>

And change your get_yaml method to be:

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

If that doesn't work for you, for example, if you have additional keys underneath the credentials key that you haven't mentioned, you could also do something like this:

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

Where gsub(/\n/m,"\n ") replaces all newlines with a newline plus two spaces.

Upvotes: 2

Related Questions