require 'puppet/confine'
# Common module for the Boolean confines. It currently
# contains just enough code to implement PUP-9336.
class Puppet::Confine
module Boolean
# Returns the passing value for the Boolean confine.
def passing_value
raise NotImplementedError, "The Boolean confine %{confine} must provide the passing value." % { confine: self.class.name }
end
# The Boolean confines 'true' and 'false' let the user specify
# two types of values:
# * A lambda for lazy evaluation. This would be something like
# confine :true => lambda { true }
#
# * A single Boolean value, or an array of Boolean values. This would
# be something like
# confine :true => true OR confine :true => [true, false, false, true]
#
# This override distinguishes between the two cases.
def values
# Note that Puppet::Confine's constructor ensures that @values
# will always be an array, even if a lambda's passed in. This is
# why we have the length == 1 check.
unless @values.length == 1 && @values.first.respond_to?(:call)
return @values
end
# We have a lambda. Here, we want to enforce "cache positive"
# behavior, which is to cache the result _if_ it evaluates to
# the passing value (i.e. the class name).
return @cached_value unless @cached_value.nil?
# Double negate to coerce the value into a Boolean
calculated_value = !! @values.first.call
if calculated_value == passing_value
@cached_value = [calculated_value]
end
[calculated_value]
end
end
end
Copyright 2K16 - 2K18 Indonesian Hacker Rulez