Sha256: 93b4f56ed3a1c1a384c755d6748e215d05802ac1738497a92ce2a323156224b4

Contents?: true

Size: 1.91 KB

Versions: 3

Compression:

Stored size: 1.91 KB

Contents

# encoding: utf-8
# author: Christoph Hartmann
# author: Dominik Richter

class JsonConfig < Inspec.resource(1)
  name 'json'
  desc 'Use the json InSpec audit resource to test data in a JSON file.'
  example "
    describe json('policyfile.lock.json') do
      its('cookbook_locks.omnibus.version') { should eq('2.2.0') }
    end
  "

  # make params readable
  attr_reader :params

  def initialize(path)
    @path = path
    @file = inspec.file(@path)
    @file_content = @file.content

    # check if file is available
    if !@file.file?
      skip_resource "Can't find file \"#{@conf_path}\""
      return @params = {}
    end

    # check if file is readable
    if @file_content.empty? && @file.size > 0
      skip_resource "Can't read file \"#{@conf_path}\""
      return @params = {}
    end

    @params = parse(@file_content)
  end

  def parse(content)
    require 'json'
    JSON.parse(content)
  end

  def value(key)
    extract_value(key, @params)
  end

  # Shorthand to retrieve a parameter name via `#its`.
  # Example: describe json('file') { its('paramX') { should eq 'Y' } }
  #
  # @param [String] name name of the field to retrieve
  # @return [Object] the value stored at this position
  def method_missing(*keys)
    # catch bahavior of rspec its implementation
    # @see https://github.com/rspec/rspec-its/blob/master/lib/rspec/its.rb#L110
    keys.shift if keys.is_a?(Array) && keys[0] == :[]
    value(keys)
  end

  def to_s
    "Json #{@path}"
  end

  private

  def extract_value(keys, value)
    key = keys.shift
    return nil if key.nil?

    # if value is an array, iterate over each child
    if value.is_a?(Array)
      value = value.map { |i|
        extract_value([key], i)
      }
    else
      value = value[key.to_s].nil? ? nil : value[key.to_s]
    end

    # check if further keys exist
    if !keys.first.nil?
      return extract_value(keys.clone, value)
    else
      return value
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
inspec-0.9.8 lib/resources/json.rb
inspec-0.9.7 lib/resources/json.rb
inspec-0.9.6 lib/resources/json.rb