class SourceReaders::InspecReader

def self.resolve(target)

def self.resolve(target)
  return new(target, 'inspec.yml') if target.files.include?('inspec.yml')
  # TODO: deprecated for 1.0.0 release
  if target.files.include?('metadata.rb') &&
     (
       target.files.include?('controls') ||
       target.files.include?('test')
     )
    return new(target, 'metadata.rb')
  end
  nil
end

def initialize(target, metadata_source)

Parameters:
  • metadata_source (String) -- eg. inspec.yml or metadata.rb
  • target (FileProvider) -- An instance of a FileProvider object that can list files and read them
def initialize(target, metadata_source)
  @target     = target
  @metadata   = load_metadata(metadata_source)
  @tests      = load_tests
  @libraries  = load_libs
  @data_files = load_data_files
end

def load_data_files

def load_data_files
  files = @target.files.find_all do |path|
    path.start_with?('files' + File::SEPARATOR)
  end
  Hash[files.map { |x| [x, @target.read(x)] }.delete_if { |_file, contents| contents.nil? }]
end

def load_libs

def load_libs
  tests = @target.files.find_all do |path|
    path.start_with?('libraries') && path.end_with?('.rb')
  end
  Hash[tests.map { |x| [x, @target.read(x)] }.delete_if { |_file, contents| contents.nil? }]
end

def load_metadata(metadata_source)

def load_metadata(metadata_source)
  Inspec::Metadata.from_ref(
    metadata_source,
    @target.read(metadata_source),
    nil,
  )
rescue Psych::SyntaxError => e
  raise "Unable to parse inspec.yml: line #{e.line}, #{e.problem} #{e.context}"
rescue => e
  raise "Unable to parse #{metadata_source}: #{e.class} -- #{e.message}"
end

def load_tests

def load_tests
  tests = @target.files.find_all do |path|
    path.start_with?('controls') && path.end_with?('.rb')
  end
  Hash[tests.map { |x| [x, @target.read(x)] }.delete_if { |_file, contents| contents.nil? }]
end