Implement `test_macro' recipe keyword

This commit is contained in:
Thibault Jouan
2014-06-02 10:49:05 +00:00
parent 18b835b10e
commit 3c46c5bc61
9 changed files with 197 additions and 15 deletions

View File

@@ -2,9 +2,9 @@ module Producer
module Core
class Condition
class << self
def evaluate(env, &block)
def evaluate(env, *args, &block)
dsl = DSL.new(env, &block)
return_value = dsl.evaluate
return_value = dsl.evaluate *args
Condition.new(dsl.tests, return_value)
end
end

View File

@@ -3,12 +3,21 @@ module Producer
class Condition
class DSL
class << self
def define_test(keyword, klass)
define_method(keyword) do |*args|
@tests << klass.new(@env, *args)
end
define_method("no_#{keyword}") do |*args|
@tests << klass.new(@env, *args, negated: true)
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
end
@@ -29,8 +38,8 @@ module Producer
@tests = []
end
def evaluate
instance_eval &@block
def evaluate(*args)
instance_exec *args, &@block
end
end
end

View File

@@ -38,6 +38,10 @@ module Producer
end
end
def test_macro(name, dsl: Condition::DSL, &block)
dsl.define_test(name, block)
end
def set(key, value)
env[key] = value
end

View File

@@ -0,0 +1,23 @@
module Producer
module Core
module Tests
class ConditionTest < Test
def verify
condition.met?
end
def condition
Condition.evaluate(env, *condition_args, &condition_block)
end
def condition_args
arguments.drop 1
end
def condition_block
arguments.first
end
end
end
end
end