diff --git a/lib/producer/core/recipe.rb b/lib/producer/core/recipe.rb index 2d93c5e..beb49f0 100644 --- a/lib/producer/core/recipe.rb +++ b/lib/producer/core/recipe.rb @@ -12,7 +12,18 @@ module Producer end def evaluate - Object.new.instance_eval @code + dsl = DSL.new(@code) + end + + + class DSL + def initialize(code = nil, &block) + if code + instance_eval code + else + instance_eval &block + end + end end end end diff --git a/spec/producer/core/recipe_spec.rb b/spec/producer/core/recipe_spec.rb index 0d491fd..533a0dc 100644 --- a/spec/producer/core/recipe_spec.rb +++ b/spec/producer/core/recipe_spec.rb @@ -4,7 +4,7 @@ module Producer::Core describe Recipe do include FixturesHelpers - let(:code) { 'some ruby code' } + let(:code) { 'nil' } subject(:recipe) { Recipe.new(code) } describe '.from_file' do @@ -28,11 +28,22 @@ module Producer::Core end describe '#evaluate' do - let(:message) { 'error from recipe' } - let(:code) { "raise '#{message}'" } + it 'builds a recipe DSL sandbox' do + expect(Recipe).to receive(:new).with(code).and_call_original + recipe.evaluate + end + end - it 'evaluates its code' do - expect { recipe.evaluate }.to raise_error(RuntimeError, message) + + describe Recipe::DSL do + let(:dsl) { Recipe::DSL.new &code } + + describe '#new' do + let(:code) { Proc.new { raise 'error from recipe' } } + + it 'evaluates its code' do + expect { dsl }.to raise_error(RuntimeError, 'error from recipe') + end end end end