lib/inspec/profile.rb in inspec-0.32.0 vs lib/inspec/profile.rb in inspec-0.33.0
- old
+ new
@@ -6,20 +6,22 @@
require 'forwardable'
require 'inspec/polyfill'
require 'inspec/fetcher'
require 'inspec/source_reader'
require 'inspec/metadata'
+require 'inspec/backend'
+require 'inspec/rule'
+require 'inspec/profile_context'
require 'inspec/dependencies/lockfile'
require 'inspec/dependencies/dependency_set'
module Inspec
class Profile # rubocop:disable Metrics/ClassLength
extend Forwardable
- def self.resolve_target(target, opts)
+ def self.resolve_target(target)
# Fetchers retrieve file contents
- opts[:target] = target
fetcher = Inspec::Fetcher.resolve(target)
if fetcher.nil?
fail("Could not fetch inspec profile in #{target.inspect}.")
end
# Source readers understand the target's structure and provide
@@ -30,12 +32,12 @@
"doesn't look like a supported profile structure.")
end
reader
end
- def self.for_target(target, opts)
- new(resolve_target(target, opts), opts)
+ def self.for_target(target, opts = {})
+ new(resolve_target(target), opts.merge(target: target))
end
attr_reader :source_reader
attr_accessor :runner_context
def_delegator :@source_reader, :tests
@@ -46,23 +48,68 @@
def initialize(source_reader, options = nil)
@options = options || {}
@target = @options.delete(:target)
@logger = @options[:logger] || Logger.new(nil)
@source_reader = source_reader
+ if options[:dependencies]
+ @locked_dependencies = options[:dependencies]
+ end
+ @controls = options[:controls] || []
@profile_id = @options[:id]
- @runner_context = nil
+ @backend = @options[:backend] || Inspec::Backend.create(options)
Metadata.finalize(@source_reader.metadata, @profile_id)
+ @runner_context = @options[:profile_context] || Inspec::ProfileContext.for_profile(self, @backend)
end
def name
metadata.params[:name]
end
def params
@params ||= load_params
end
+ def collect_tests(include_list = @controls)
+ if !@tests_collected
+ locked_dependencies.each(&:collect_tests)
+
+ tests.each do |path, content|
+ next if content.nil? || content.empty?
+ abs_path = source_reader.target.abs_path(path)
+ @runner_context.load_control_file(content, abs_path, nil)
+ end
+ @tests_collected = true
+ end
+ filter_controls(@runner_context.all_rules, include_list)
+ end
+
+ def filter_controls(controls_array, include_list)
+ return controls_array if include_list.nil? || include_list.empty?
+ controls_array.select do |c|
+ id = ::Inspec::Rule.rule_id(c)
+ include_list.include?(id)
+ end
+ end
+
+ def load_libraries
+ locked_dependencies.each do |d|
+ c = d.load_libraries
+ @runner_context.add_resources(c)
+ end
+
+ libs = libraries.map do |path, content|
+ [content, path]
+ end
+
+ @runner_context.load_libraries(libs)
+ @runner_context
+ end
+
+ def to_s
+ "Inspec::Profile<#{name}>"
+ end
+
def info
res = params.dup
# add information about the controls
controls = res[:controls].map do |id, rule|
next if id.to_s.empty?
@@ -247,15 +294,19 @@
#
# @param vendor_path [String] Path to the on-disk vendor dir
# @return [Inspec::Lockfile]
#
def generate_lockfile(vendor_path = nil)
- res = Inspec::DependencySet.new(cwd, vendor_path)
+ res = Inspec::DependencySet.new(cwd, vendor_path, nil, @backend)
res.vendor(metadata.dependencies)
Inspec::Lockfile.from_dependency_set(res)
end
+ def load_dependencies
+ Inspec::DependencySet.from_lockfile(lockfile, cwd, nil, @backend)
+ end
+
private
# Create an archive name for this profile and an additional options
# configuration. Either use :output or generate the name from metadata.
#
@@ -280,38 +331,21 @@
load_checks_params(params)
@profile_id ||= params[:name]
params
end
- #
- # Returns a new runner for the current profile.
- #
- # @params [Symbol] The type of backend to use when constructing a
- # new runner.
- # @returns [Inspec::Runner]
- #
- def runner_for_profile(backend = :mock)
- opts = @options.dup
- opts[:ignore_supports] = true
- r = Runner.new(id: @profile_id,
- backend: backend,
- test_collector: opts.delete(:test_collector))
- r.add_profile(self, opts)
- r
- end
-
def load_checks_params(params)
+ load_libraries
+ tests = collect_tests
params[:controls] = controls = {}
params[:groups] = groups = {}
prefix = @source_reader.target.prefix || ''
- # Load from the runner_context if it exists
- runner = @runner_context || runner_for_profile
- runner.all_rules.each do |rule|
+ tests.each do |rule|
f = load_rule_filepath(prefix, rule)
load_rule(rule, f, controls, groups)
end
- params[:attributes] = runner.attributes
+ params[:attributes] = @runner_context.attributes
params
end
def load_rule_filepath(prefix, rule)
file = rule.instance_variable_get(:@__file)
@@ -335,12 +369,8 @@
groups[file] ||= {
title: rule.instance_variable_get(:@__group_title),
controls: [],
}
groups[file][:controls].push(id)
- end
-
- def load_dependencies
- Inspec::DependencySet.from_lockfile(lockfile, cwd, nil)
end
end
end