class RFacter::Util::Resolution

This represents a fact resolution. A resolution is a concrete implementation of a fact. A single fact can have many resolutions and the correct resolution will be chosen at runtime. Each time {RFacter::DSL::Facter.add Facter.add} is called, a new resolution is created and added to the set of resolutions for the fact named in the call. Each resolution has a {#has_weight weight}, which defines its priority over other resolutions, and a set of {#confine confinements}, which defines the conditions under which it will be chosen. All confinements must be satisfied for a fact to be considered suitable.

@api private @since 0.1.0

Attributes

code[RW]
fact[R]

@!attribute [r] fact @return [RFacter::Util::Fact]

name[RW]

@!attribute [rw] name The name of this resolution. The resolution name should be unique with respect to the given fact. @return [String]

value[W]

Public Class Methods

new(name, fact, config: RFacter::Config.config, **options) click to toggle source

Create a new resolution mechanism.

@param name [String] The name of the resolution. @return [void]

# File lib/rfacter/util/resolution.rb, line 54
def initialize(name, fact, config: RFacter::Config.config, **options)
  @name = name
  @fact = fact
  @config = config
  @confines = []
  @value = nil
  @timeout = 0
  @weight = nil
end

Public Instance Methods

evaluate(&block) click to toggle source

Evaluate the given block in the context of this resolution. If a block has already been evaluated emit a warning to that effect.

@return [void]

# File lib/rfacter/util/resolution.rb, line 72
def evaluate(&block)
  if @last_evaluated
    msg = "Already evaluated #{@name}"
    msg << " at #{@last_evaluated}" if msg.is_a? String
    msg << ", reevaluating anyways"
    logger.warn msg
  end

  instance_eval(&block)

  @last_evaluated = block.source_location.join(':')
end
exec(command) click to toggle source
# File lib/rfacter/util/resolution.rb, line 46
def exec(command)
  ::RFacter::DSL::Facter::Core::Execution.exec(command)
end
resolution_type() click to toggle source
# File lib/rfacter/util/resolution.rb, line 64
def resolution_type
  :simple
end
set_options(options) click to toggle source
# File lib/rfacter/util/resolution.rb, line 85
def set_options(options)
  if options[:name]
    @name = options.delete(:name)
  end

  if options.has_key?(:value)
    @value = options.delete(:value)
  end

  if options.has_key?(:timeout)
    @timeout = options.delete(:timeout)
  end

  if options.has_key?(:weight)
    @weight = options.delete(:weight)
  end

  if not options.keys.empty?
    raise ArgumentError, "Invalid resolution options #{options.keys.inspect}"
  end
end
setcode(string = nil, &block) click to toggle source

Sets the code block or external program that will be evaluated to get the value of the fact.

@return [void]

@overload setcode(string)

Sets an external program to call to get the value of the resolution
@param [String] string the external program to run to get the
  value

@overload setcode(&block)

Sets the resolution's value by evaluating a block at runtime
@param [Proc] block The block to determine the resolution's value.
  This block is run when the fact is evaluated. Errors raised from
  inside the block are rescued and printed to stderr.
# File lib/rfacter/util/resolution.rb, line 122
def setcode(string = nil, &block)
  if string
    @code = Proc.new do
      output = exec(string)
      if output.nil? or output.empty?
        nil
      else
        output
      end
    end
  elsif block_given?
    @code = block
  else
    raise ArgumentError, "You must pass either code or a block"
  end
end
which(command) click to toggle source
# File lib/rfacter/util/resolution.rb, line 42
def which(command)
  ::RFacter::DSL::Facter::Core::Execution.which(command)
end

Private Instance Methods

resolve_value() click to toggle source
# File lib/rfacter/util/resolution.rb, line 141
def resolve_value
  if @value
    @value
  elsif @code.nil?
    nil
  elsif @code
    @code.call()
  end
end