class Inspec::ControlEvalContext


etc).
as the basic DSL of the control files (describe, control, title,
The anonymous class includes the given passed resource_dsl as well
files will be instance_exec’d against.
ControlEvalContext constructs an anonymous class that control

def self.create(profile_context, resources_dsl) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

Returns:
  • (ProfileContextClass) -

Parameters:
  • outer_dsl (OuterDSLClass) --
  • profile_context (Inspec::ProfileContext) --
def self.create(profile_context, resources_dsl) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
  rule_class = rule_context(resources_dsl)
  profile_context_owner = profile_context
  profile_id = profile_context.profile_id
  Class.new do # rubocop:disable Metrics/BlockLength
    include Inspec::DSL
    include Inspec::DSL::RequireOverride
    include resources_dsl
    attr_accessor :skip_file
    def initialize(backend, conf, dependencies, require_loader, skip_only_if_eval)
      @backend = backend
      @conf = conf
      @dependencies = dependencies
      @require_loader = require_loader
      @skip_file = false
      @skip_only_if_eval = skip_only_if_eval
    end
    define_method :title do |arg|
      profile_context_owner.set_header(:title, arg)
    end
    def to_s
      "Control Evaluation Context (#{profile_name})"
    end
    define_method :profile_name do
      profile_id
    end
    define_method :control do |*args, &block|
      id = args[0]
      opts = args[1] || {}
      opts[:skip_only_if_eval] = @skip_only_if_eval
      register_control(rule_class.new(id, profile_id, opts, &block))
    end
    #
    # Describe allows users to write rspec-like bare describe
    # blocks without declaring an inclosing control. Here, we
    # generate a control for them automatically and then execute
    # the describe block in the context of that control.
    #
    define_method :describe do |*args, &block|
      loc = block_location(block, caller(1..1).first)
      id = "(generated from #{loc} #{SecureRandom.hex})"
      res = nil
      rule = rule_class.new(id, profile_id, {}) do
        res = describe(*args, &block)
      end
      register_control(rule, &block)
      res
    end
    define_method :add_resource do |name, new_res|
      resources_dsl.module_exec do
        define_method name.to_sym do |*args|
          new_res.new(@backend, name.to_s, *args)
        end
      end
    end
    define_method :add_resources do |context|
      self.class.class_eval do
        include context.to_resources_dsl
      end
      rule_class.class_eval do
        include context.to_resources_dsl
      end
    end
    define_method :add_subcontext do |context|
      profile_context_owner.add_subcontext(context)
    end
    define_method :register_control do |control, &block|
      if @skip_file
        ::Inspec::Rule.set_skip_rule(control, true)
      end
      unless profile_context_owner.profile_supports_platform?
        platform = inspec.platform
        msg = "Profile #{profile_context_owner.profile_id} is not supported on platform #{platform.name}/#{platform.release}."
        ::Inspec::Rule.set_skip_rule(control, msg)
      end
      unless profile_context_owner.profile_supports_inspec_version?
        msg = "Profile #{profile_context_owner.profile_id} is not supported on InSpec version (#{Inspec::VERSION})."
        ::Inspec::Rule.set_skip_rule(control, msg)
      end
      profile_context_owner.register_rule(control, &block) unless control.nil?
    end
    # method for attributes; import attribute handling
    define_method :attribute do |name, options|
      profile_context_owner.register_attribute(name, options)
    end
    define_method :skip_control do |id|
      profile_context_owner.unregister_rule(id)
    end
    define_method :only_if do |&block|
      return unless block
      return if @skip_file == true
      return if @skip_only_if_eval == true
      return if block.yield == true
      # Apply `set_skip_rule` for other rules in the same file
      profile_context_owner.rules.values.each do |r|
        sources_match = r.source_file == block.source_location[0]
        Inspec::Rule.set_skip_rule(r, true) if sources_match
      end
      @skip_file = true
    end
    alias_method :rule, :control
    alias_method :skip_rule, :skip_control
    private
    def block_location(block, alternate_caller)
      if block.nil?
        alternate_caller[/^(.+:\d+):in .+$/, 1] || 'unknown'
      else
        path, line = block.source_location
        "#{File.basename(path)}:#{line}"
      end
    end
  end
end

def self.rule_context(resources_dsl)

Returns:
  • (RuleContext) - the inner context of rules

Parameters:
  • resources_dsl (ResourcesDSL) -- which has all resources to attach
def self.rule_context(resources_dsl)
  require 'rspec/core/dsl'
  Class.new(Inspec::Rule) do
    include RSpec::Core::DSL
    with_resource_dsl resources_dsl
  end
end

def block_location(block, alternate_caller)

def block_location(block, alternate_caller)
  if block.nil?
    alternate_caller[/^(.+:\d+):in .+$/, 1] || 'unknown'
  else
    path, line = block.source_location
    "#{File.basename(path)}:#{line}"
  end
end

def initialize(backend, conf, dependencies, require_loader, skip_only_if_eval)

def initialize(backend, conf, dependencies, require_loader, skip_only_if_eval)
  @backend = backend
  @conf = conf
  @dependencies = dependencies
  @require_loader = require_loader
  @skip_file = false
  @skip_only_if_eval = skip_only_if_eval
end

def to_s

def to_s
  "Control Evaluation Context (#{profile_name})"
end