From d199ba56fd3111a53834d370a6a081cb5da05b05 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 29 Jul 2013 21:07:58 +0000 Subject: [PATCH] Add Env class --- lib/producer/core.rb | 1 + lib/producer/core/cli.rb | 4 +++- lib/producer/core/env.rb | 11 +++++++++++ lib/producer/core/recipe.rb | 6 +++--- spec/producer/core/cli_spec.rb | 14 ++++++++++++-- spec/producer/core/env_spec.rb | 14 ++++++++++++++ spec/producer/core/recipe_spec.rb | 11 ++++++----- 7 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 lib/producer/core/env.rb create mode 100644 spec/producer/core/env_spec.rb diff --git a/lib/producer/core.rb b/lib/producer/core.rb index f373de8..908c36b 100644 --- a/lib/producer/core.rb +++ b/lib/producer/core.rb @@ -1,4 +1,5 @@ require 'producer/core/cli' +require 'producer/core/env' require 'producer/core/recipe' require 'producer/core/task' require 'producer/core/version' diff --git a/lib/producer/core/cli.rb b/lib/producer/core/cli.rb index d1451ba..b6cb1fe 100644 --- a/lib/producer/core/cli.rb +++ b/lib/producer/core/cli.rb @@ -13,7 +13,9 @@ module Producer def run! print_usage_and_exit(64) unless @arguments.length == 2 - Recipe.from_file(@arguments[1]).evaluate + recipe = Recipe.from_file(@arguments[1]) + env = Env.new(recipe) + recipe.evaluate env end diff --git a/lib/producer/core/env.rb b/lib/producer/core/env.rb new file mode 100644 index 0000000..ff1f63c --- /dev/null +++ b/lib/producer/core/env.rb @@ -0,0 +1,11 @@ +module Producer + module Core + class Env + attr_reader :current_recipe + + def initialize(recipe) + @current_recipe = recipe + end + end + end +end diff --git a/lib/producer/core/recipe.rb b/lib/producer/core/recipe.rb index c697fb1..4ba8092 100644 --- a/lib/producer/core/recipe.rb +++ b/lib/producer/core/recipe.rb @@ -12,8 +12,8 @@ module Producer @filepath = filepath end - def evaluate - dsl = DSL.new(@code).evaluate + def evaluate(env) + dsl = DSL.new(@code).evaluate(env) dsl.tasks.each.map(&:evaluate) end @@ -27,7 +27,7 @@ module Producer @tasks = [] end - def evaluate + def evaluate(env) if @code instance_eval @code else diff --git a/spec/producer/core/cli_spec.rb b/spec/producer/core/cli_spec.rb index b058cb8..cf2f633 100644 --- a/spec/producer/core/cli_spec.rb +++ b/spec/producer/core/cli_spec.rb @@ -13,16 +13,26 @@ module Producer::Core end end + # FIXME: spec/method need refactoring describe '#run!' do it 'builds a recipe' do expect(Recipe).to receive(:from_file).with(arguments[1]).and_call_original cli.run! end - it 'evaluates the recipe' do + it 'builds an environment with the current recipe' do + recipe = double('recipe').as_null_object + allow(Recipe).to receive(:from_file).and_return(recipe) + expect(Env).to receive(:new).with(recipe).and_call_original + cli.run! + end + + it 'evaluates the recipe with the environment' do recipe = double('recipe') allow(Recipe).to receive(:from_file).and_return(recipe) - expect(recipe).to receive(:evaluate) + env = double('env') + allow(Env).to receive(:new).and_return(env) + expect(recipe).to receive(:evaluate).with(env) cli.run! end diff --git a/spec/producer/core/env_spec.rb b/spec/producer/core/env_spec.rb new file mode 100644 index 0000000..63cab69 --- /dev/null +++ b/spec/producer/core/env_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +module Producer::Core + describe Env do + let(:recipe) { Recipe.new(Proc.new { nil }) } + subject(:env) { Env.new(recipe) } + + describe '#current_recipe' do + it 'returns the assigned current recipe' do + expect(env.current_recipe).to eq recipe + end + end + end +end diff --git a/spec/producer/core/recipe_spec.rb b/spec/producer/core/recipe_spec.rb index 7e8fdad..c8cde5d 100644 --- a/spec/producer/core/recipe_spec.rb +++ b/spec/producer/core/recipe_spec.rb @@ -5,6 +5,7 @@ module Producer::Core include FixturesHelpers let(:code) { 'nil' } + let(:env) { double('env') } subject(:recipe) { Recipe.new(code) } describe '.from_file' do @@ -35,7 +36,7 @@ module Producer::Core describe '#evaluate' do it 'builds a recipe DSL sandbox' do expect(Recipe::DSL).to receive(:new).with(code).and_call_original - recipe.evaluate + recipe.evaluate(env) end end @@ -65,23 +66,23 @@ module Producer::Core describe '#evaluate' do it 'evaluates its code' do dsl = Recipe::DSL.new { raise 'error from recipe' } - expect { dsl.evaluate }.to raise_error(RuntimeError, 'error from recipe') + expect { dsl.evaluate(env) }.to raise_error(RuntimeError, 'error from recipe') end it 'returns itself' do - expect(dsl.evaluate).to eq dsl + expect(dsl.evaluate(env)).to eq dsl end end context 'DSL specific methods' do - subject(:dsl) { Recipe::DSL.new(&code).evaluate } + 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 } it 'sources the recipe given as argument' do - expect { dsl.evaluate }.to raise_error(RuntimeError, 'error from recipe') + expect { dsl.evaluate(env) }.to raise_error(RuntimeError, 'error from recipe') end end