diff --git a/features/recipe.feature b/features/recipe.feature index 56e4b61..73da50f 100644 --- a/features/recipe.feature +++ b/features/recipe.feature @@ -23,16 +23,3 @@ Feature: recipe evaluation \AOK recipe.rb:3:.+invalid recipe keyword `invalid_keyword' """ - - Scenario: source keyword, requires a recipe file - Given a recipe with: - """ - source 'sourced_recipe' - """ - And a file named "sourced_recipe.rb" with: - """ - puts 'sourced recipe' - """ - When I execute the recipe - Then the exit status must be 0 - And the output must contain "sourced recipe" diff --git a/features/source.feature b/features/source.feature new file mode 100644 index 0000000..34c03e9 --- /dev/null +++ b/features/source.feature @@ -0,0 +1,33 @@ +Feature: source recipe keyword + + Scenario: requires a recipe file + Given a recipe with: + """ + source 'sourced_recipe' + """ + And a file named "sourced_recipe.rb" with: + """ + puts 'sourced recipe' + """ + When I execute the recipe + Then the exit status must be 0 + And the output must contain "sourced recipe" + + Scenario: reports errors from sourced recipes + Given a recipe with: + """ + source 'sourced_recipe' + """ + And a file named "sourced_recipe.rb" with: + """ + puts 'OK' + + invalid_keyword + """ + When I execute the recipe + Then the output must match: + """ + \AOK + sourced_recipe.rb:3:.+invalid recipe keyword `invalid_keyword' + recipe.rb:1:.+ + """ diff --git a/lib/producer/core/recipe/dsl.rb b/lib/producer/core/recipe/dsl.rb index 68490fb..5b2d9db 100644 --- a/lib/producer/core/recipe/dsl.rb +++ b/lib/producer/core/recipe/dsl.rb @@ -27,7 +27,7 @@ module Producer private def source(filepath) - instance_eval File.read("./#{filepath}.rb") + instance_eval File.read("./#{filepath}.rb"), "#{filepath}.rb" end def task(name, &block) diff --git a/spec/producer/core/recipe/dsl_spec.rb b/spec/producer/core/recipe/dsl_spec.rb index 270620f..5c23871 100644 --- a/spec/producer/core/recipe/dsl_spec.rb +++ b/spec/producer/core/recipe/dsl_spec.rb @@ -59,12 +59,21 @@ module Producer::Core subject(:dsl) { Recipe::DSL.new(&code).evaluate(env) } describe '#source' do - let(:code) { "source '#{fixture_path_for 'recipes/error'}'" } - subject(:dsl) { Recipe::DSL.new code } + let(:filepath) { fixture_path_for 'recipes/error' } + let(:code) { "source '#{filepath}'" } + subject(:dsl) { Recipe::DSL.new code } it 'sources the recipe given as argument' do expect { dsl.evaluate(env) }.to raise_error(RuntimeError, 'error from recipe') end + + context 'invalid sourced recipe' do + it 'reports the sourced recipe file path in the error' do + expect { dsl.evaluate(env) }.to raise_error(RuntimeError) { |e| + expect(e.backtrace.first).to match /\A#{filepath}/ + } + end + end end describe '#tasks' do