diff --git a/features/recipe_macro.feature b/features/recipe_macro.feature index 447be6a..e40fb18 100644 --- a/features/recipe_macro.feature +++ b/features/recipe_macro.feature @@ -1,6 +1,6 @@ Feature: `macro' recipe keyword - Scenario: declares a new keyword accepting task code + Scenario: declares a new recipe keyword accepting task code Given a recipe with: """ macro :hello do @@ -12,6 +12,16 @@ Feature: `macro' recipe keyword When I successfully execute the recipe Then the output must contain "hello macro" + Scenario: declares a new task keyword + Given a recipe with: + """ + macro(:hello) { echo 'hello macro' } + + task(:some_task) { hello } + """ + When I successfully execute the recipe + Then the output must contain "hello macro" + Scenario: supports arguments Given a recipe with: """ diff --git a/lib/producer/core/recipe.rb b/lib/producer/core/recipe.rb index e61a95b..47eb479 100644 --- a/lib/producer/core/recipe.rb +++ b/lib/producer/core/recipe.rb @@ -3,7 +3,11 @@ module Producer class Recipe class << self def define_macro(name, block) - define_method(name) { |*args| task name, *args, &block } + [self, Task].each do |klass| + klass.class_eval do + define_method(name) { |*args| task name, *args, &block } + end + end end def compose_macro(name, macro, *base_args) diff --git a/spec/producer/core/recipe_spec.rb b/spec/producer/core/recipe_spec.rb index c5c8901..0846322 100644 --- a/spec/producer/core/recipe_spec.rb +++ b/spec/producer/core/recipe_spec.rb @@ -49,10 +49,15 @@ module Producer::Core describe '#macro' do it 'defines the new recipe keyword' do - recipe.macro :hello + recipe.macro(:hello) { } expect(recipe).to respond_to(:hello) end + it 'defines the new task keyword' do + recipe.macro(:hello) { } + expect { recipe.task(:some_task) { hello } }.not_to raise_error + end + context 'when a defined macro is called' do before { recipe.macro(:hello) { :some_macro_code } }