From 52ecf4899b403c1b5ceeaedc9dd88b7934127bf6 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 22 Sep 2014 22:04:19 +0000 Subject: [PATCH] Implement Recipe{.,#}compose_macro --- features/recipe_compose_macro.feature | 15 +++++++++++++++ lib/producer/core/recipe.rb | 12 +++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 features/recipe_compose_macro.feature diff --git a/features/recipe_compose_macro.feature b/features/recipe_compose_macro.feature new file mode 100644 index 0000000..8c4fefc --- /dev/null +++ b/features/recipe_compose_macro.feature @@ -0,0 +1,15 @@ +Feature: `compose_macro' recipe keyword + + Scenario: allows macro composition + Given a recipe with: + """ + macro :hello do |prefix, *args| + echo 'hello %s %s' % [prefix, args.join(', ')] + end + + compose_macro :hello_composed, :hello, 'composed' + + hello_composed :foo, :bar + """ + When I successfully execute the recipe + Then the output must contain "hello composed foo, bar" diff --git a/lib/producer/core/recipe.rb b/lib/producer/core/recipe.rb index b73501e..873ed87 100644 --- a/lib/producer/core/recipe.rb +++ b/lib/producer/core/recipe.rb @@ -5,6 +5,10 @@ module Producer def define_macro(name, block) define_method(name) { |*args| task name, *args, &block } end + + def compose_macro(name, meth, *base_args) + define_method(name) { |*args| send meth, *(base_args + args) } + end end attr_reader :env, :tasks @@ -27,11 +31,17 @@ module Producer end def macro(name, &block) - define_singleton_method(name) do |*args| + define_singleton_method name do |*args| task "#{name}", *args, &block end end + def compose_macro(name, meth, *base_args) + define_singleton_method name do |*args| + send meth, *(base_args + args) + end + end + def test_macro(name, &block) Condition.define_test(name, block) end