mirror of
https://github.com/inspec/inspec
synced 2024-11-30 16:39:20 +00:00
4f2b66302d
When attempting to access array values via the `json` resource: ``` describe json('/tmp/test.json') do its(['array',0]) { should eq "zero" } end ``` ... the resulting data would be an array of the size of the original array with all the values replaced with nils: ``` expected: "zero" got: [nil, nil, nil] ``` This was due to a bug in the ObjectTraverser mixin that mapped array values back through `extract_value` rather than properly handling the passed-in key(s). This worked fine for the specific data format created by the `csv` resource but did not work `json` or any other resource that subclassed the `JsonConfig` resource. This change fixes the logic when dealing with an array when it's encountered, and fixes up the `csv` resource with its own `value` method. This change also adds tests for ObjectTraverser. Signed-off-by: Adam Leff <adam@leff.co>
24 lines
645 B
Ruby
24 lines
645 B
Ruby
# encoding: utf-8
|
|
# author: Dominik Richter
|
|
# author: Christoph Hartmann
|
|
module ObjectTraverser
|
|
def extract_value(keys, value)
|
|
key = keys.shift
|
|
return nil if key.nil? || value.nil?
|
|
|
|
if value.is_a?(Array)
|
|
value = if key.is_a?(Fixnum)
|
|
value[key]
|
|
elsif value.respond_to?(key.to_sym)
|
|
value.send(key.to_sym)
|
|
end
|
|
else
|
|
value = value[key.to_s].nil? ? nil : value[key.to_s]
|
|
end
|
|
|
|
# if there are no more keys, just return the value
|
|
return value if keys.first.nil?
|
|
# if there are more keys, extract more
|
|
extract_value(keys.clone, value)
|
|
end
|
|
end
|