Sha256: 926e4906c07762da8a83bc4fbb1a470bc478e732a571eacf87fceb57344ed3b9

Contents?: true

Size: 1.42 KB

Versions: 4

Compression:

Stored size: 1.42 KB

Contents

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

# Parses a json document
# Usage:
# describe json('policyfile.lock.json') do
#   its('cookbook_locks.omnibus.version') { should eq('2.2.0') }
# end
class JsonConfig < Inspec.resource(1)
  name 'json'

  # make params readable
  attr_reader :params

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

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

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

    # check if key is a num, try to extract from array
    if key.to_i.to_s == key
      value = value[key.to_i]
    # if value is an array, iterate over each child
    elsif value.is_a?(Array)
      value = value.map { |i|
        extract_value([key], i)
      }
    # normal value extraction
    else
      value = value[key].nil? ? nil : value[key]
    end

    # check if further keys exist
    if !keys.first.nil?
      return extract_value(keys.clone, value)
    else
      return value
    end
  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(name)
    @params[name.to_s]
  end

  def to_s
    "Json #{@path}"
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
inspec-0.9.3 lib/resources/json.rb
inspec-0.9.2 lib/resources/json.rb
inspec-0.9.1 lib/resources/json.rb
inspec-0.9.0 lib/resources/json.rb