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