Skip to content

Commit

Permalink
Add support for passing opts to to_json_pretty
Browse files Browse the repository at this point in the history
This gives the ability to set e.g. indentation level and max nesting depth.
  • Loading branch information
runejuhl committed Oct 9, 2019
1 parent ac78da8 commit 87a9215
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
41 changes: 38 additions & 3 deletions lib/puppet/functions/to_json_pretty.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,61 @@
# param_two => undef,
# }, true),
# }
#
# * how to output pretty JSON using tabs for indentation
# file { '/tmp/my.json':
# ensure => file,
# content => to_json_pretty({
# param_one => 'value',
# param_two => {
# param_more => 42,
# },
# }, nil, {indent => ' '}),
# }

Puppet::Functions.create_function(:to_json_pretty) do
# @param data
# data structure which needs to be converted to pretty json
# @param skip_undef
# value `true` or `false`
# @param opts
# hash-map of settings passed to JSON.pretty_generate, see
# https://ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html#method-i-generate.
# Note that `max_nesting` doesn't take the value `false`; use `-1` instead.
# @return
# converted data to pretty json
dispatch :to_json_pretty do
param 'Variant[Hash, Array]', :data
optional_param 'Boolean', :skip_undef
optional_param 'Optional[Boolean]', :skip_undef
optional_param 'Struct[{
indent => Optional[String],
space => Optional[String],
space_before => Optional[String],
object_nl => Optional[String],
array_nl => Optional[String],
allow_nan => Optional[Boolean],
max_nesting => Optional[Integer[-1,default]],
}]', :opts
end

def to_json_pretty(data, skip_undef = false)
def to_json_pretty(data, skip_undef = false, opts = nil)
# It's not possible to make an abstract type that can be either a boolean
# false or an integer, so we use -1 as the falsey value
if opts
opts = Hash[opts.map { |k, v| [k.to_sym, v] }]

if opts[:max_nesting] == -1
opts[:max_nesting] = false
end
end

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"
JSON.pretty_generate(data, opts) << "\n"
end
end
1 change: 1 addition & 0 deletions spec/functions/to_json_pretty_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@
}
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") }
it { is_expected.to run.with_params(['one', 'two', nil, 'three'], true, {'indent' => '@@@@'}).and_return("[\n@@@@\"one\",\n@@@@\"two\",\n@@@@\"three\"\n]\n") }
end

0 comments on commit 87a9215

Please sign in to comment.