Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions lib/puppet/functions/to_json_pretty.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,32 @@
# content => to_json_pretty($myhash),
# }
#
# @example how to output pretty JSON skipping over keys with undef values
# # output pretty JSON to a file skipping over undef values
# file { '/tmp/my.json':
# ensure => file,
# content => to_json_pretty({
# param_one => 'value',
# param_two => undef,
# }),
# }
#
require 'json'

Puppet::Functions.create_function(:to_json_pretty) do
dispatch :to_json_pretty do
param 'Variant[Hash, Array]', :data
optional_param 'Boolean', :skip_undef
end

def to_json_pretty(data)
JSON.pretty_generate(data)
def to_json_pretty(data, skip_undef = false)
if skip_undef
if data.is_a? Array
data = data.reject { |value| value.nil? }
elsif data.is_a? Hash
data = data.reject { |_, value| value.nil? }
end
end
JSON.pretty_generate(data) << "\n"
end
end
14 changes: 8 additions & 6 deletions spec/functions/to_json_pretty_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

describe 'to_json_pretty' do
it { is_expected.not_to eq(nil) }
it { is_expected.to run.with_params([]).and_return("[\n\n]") }
it { is_expected.to run.with_params(['one']).and_return("[\n \"one\"\n]") }
it { is_expected.to run.with_params(%w[one two]).and_return("[\n \"one\",\n \"two\"\n]") }
it { is_expected.to run.with_params({}).and_return("{\n}") }
it { is_expected.to run.with_params('key' => 'value').and_return("{\n \"key\": \"value\"\n}") }
it { is_expected.to run.with_params([]).and_return("[\n\n]\n") }
it { is_expected.to run.with_params(['one']).and_return("[\n \"one\"\n]\n") }
it { is_expected.to run.with_params(%w[one two]).and_return("[\n \"one\",\n \"two\"\n]\n") }
it { is_expected.to run.with_params({}).and_return("{\n}\n") }
it { is_expected.to run.with_params('key' => 'value').and_return("{\n \"key\": \"value\"\n}\n") }
it {
is_expected.to run.with_params('one' => { 'oneA' => 'A', 'oneB' => { 'oneB1' => '1', 'oneB2' => '2' } }, 'two' => %w[twoA twoB])
.and_return("{\n \"one\": {\n \"oneA\": \"A\",\n \"oneB\": {\n \"oneB1\": \"1\",\n \"oneB2\": \"2\"\n }\n },\n \"two\": [\n \"twoA\",\n \"twoB\"\n ]\n}") # rubocop:disable Metrics/LineLength : Unable to reduce line to required length
.and_return("{\n \"one\": {\n \"oneA\": \"A\",\n \"oneB\": {\n \"oneB1\": \"1\",\n \"oneB2\": \"2\"\n }\n },\n \"two\": [\n \"twoA\",\n \"twoB\"\n ]\n}\n") # rubocop:disable Metrics/LineLength : Unable to reduce line to required length
}
it { is_expected.to run.with_params({ 'one' => '1', 'two' => nil }, true).and_return("{\n \"one\": \"1\"\n}\n") }
it { is_expected.to run.with_params(['one', 'two', nil, 'three'], true).and_return("[\n \"one\",\n \"two\",\n \"three\"\n]\n") }
end