Sha256: 4cea27cb2e209e4a8673bb12cd79b6e8408994612078a94804592c9221417a5f
Contents?: true
Size: 1.78 KB
Versions: 8
Compression:
Stored size: 1.78 KB
Contents
require "inspec/resources/json" # Parses a csv document # This implementation was inspired by a blog post # @see http://technicalpickles.com/posts/parsing-csv-with-ruby module Inspec::Resources class CsvConfig < JsonConfig name "csv" desc "Use the csv InSpec audit resource to test configuration data in a CSV file." example <<~EXAMPLE describe csv('example.csv') do its('name') { should eq(['John', 'Alice']) } end EXAMPLE # override the parse method from JsonConfig # Assuming a header row of name,col1,col2, it will output an array of hashes like so: # [ # { 'name' => 'row1', 'col1' => 'value1', 'col2' => 'value2' }, # { 'name' => 'row2', 'col1' => 'value3', 'col2' => 'value4' } # ] def parse(content) require "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: true, converters: [:all, :blank_to_nil]) # convert to hash csv.to_a.map(&:to_hash) rescue => e raise Inspec::Exceptions::ResourceFailed, "Unable to parse CSV: #{e.message}" end # override the value method from JsonConfig # The format of the CSV hash as created by #parse is very different # than what the YAML, JSON, and INI resources create, so using the # #value method from JsonConfig (which uses ObjectTraverser.extract_value) # doesn't make sense here. def value(key) @params.map { |x| x[key.first.to_s] }.compact end private # used by JsonConfig to build up a full to_s method # based on whether a file path, content, or command was supplied. def resource_base_name "CSV" end end end
Version data entries
8 entries across 8 versions & 2 rubygems