2014-09-22 19:43:43 +00:00

60 lines
1.6 KiB
Ruby

module Producer
module Core
class Condition
class << self
def define_test(keyword, test)
{
keyword => false,
"no_#{keyword}" => true
}.each do |kw, negated|
define_method(kw) do |*args|
if test.respond_to? :call
args = [test, *args]
klass = Tests::ConditionTest
else
klass = test
end
t = klass.new(@env, *args, negated: negated)
@tests << t
end
end
end
def evaluate(env, *args, &block)
new.tap do |o|
o.instance_eval { @env = env }
return_value = o.instance_exec *args, &block
o.instance_eval { @return_value = return_value }
end
end
end
define_test :`, Tests::ShellCommandStatus
define_test :sh, Tests::ShellCommandStatus
define_test :file_contains, Tests::FileContains
define_test :file_eq, Tests::FileEq
define_test :env?, Tests::HasEnv
define_test :executable?, Tests::HasExecutable
define_test :dir?, Tests::HasDir
define_test :file?, Tests::HasFile
attr_reader :tests, :return_value
def initialize(tests = [], return_value = nil)
@tests = tests
@return_value = return_value
end
def met?
return !!@return_value if @tests.empty?
@tests.each { |t| return false unless t.pass? }
true
end
def !
!met?
end
end
end
end