class Inspec::Resources::CsvConfig
def initialize(path, headers = true)
def initialize(path, headers = true) @headers = headers @path = path super(@path) end
def parse(content)
['row2', 'value3', 'value4']
['name', col1', 'col2'],
[
When headers is set to false it will return data as array of array
]
{ 'name' => 'row2', 'col1' => 'value3', 'col2' => 'value4' }
{ 'name' => 'row1', 'col1' => 'value1', 'col2' => 'value2' },
[
Assuming a header row of name,col1,col2, it will output an array of hashes like so:
override the parse method from JsonConfig
def parse(content) require "csv" unless defined?(CSV) # convert empty field to nil CSV::Converters[:blank_to_nil] = lambda do |field| field && field.empty? ? nil : field end # implicit conversion of values csv = CSV.new(content, headers: @headers, converters: %i{all blank_to_nil}) # convert to hash if @headers csv.to_a.map(&:to_hash) else csv.to_a end rescue => e raise Inspec::Exceptions::ResourceFailed, "Unable to parse CSV: #{e.message}" end
def resource_base_name
used by JsonConfig to build up a full to_s method
def resource_base_name "CSV" end
def resource_id
def resource_id @path || "csv" end
def value(key)
#value method from JsonConfig (which uses ObjectTraverser.extract_value)
than what the YAML, JSON, and INI resources create, so using the
The format of the CSV hash as created by #parse is very different
override the value method from JsonConfig
def value(key) if @headers @params.map { |x| x[key.first.to_s] }.compact else # when headers is set to false send the array as it is. @params end end