From baaa957e9e31cf1d51e0815f1540839ee82f5ab4 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Sat, 27 Jul 2013 23:53:12 +0000 Subject: [PATCH] Implement task evaluation feature --- features/task.feature | 12 ++++++++++++ lib/producer/core.rb | 1 + lib/producer/core/recipe.rb | 8 ++++++++ lib/producer/core/task.rb | 16 ++++++++++++++++ spec/producer/core/recipe_spec.rb | 17 +++++++++++++++++ spec/producer/core/task_spec.rb | 23 +++++++++++++++++++++++ 6 files changed, 77 insertions(+) create mode 100644 features/task.feature create mode 100644 lib/producer/core/task.rb create mode 100644 spec/producer/core/task_spec.rb diff --git a/features/task.feature b/features/task.feature new file mode 100644 index 0000000..4a261a4 --- /dev/null +++ b/features/task.feature @@ -0,0 +1,12 @@ +Feature: tasks + + Scenario: evaluates ruby code grouped in task blocks + Given a recipe with: + """ + task :hello do + puts 'hello from recipe' + end + """ + When I execute the recipe + Then the exit status must be 0 + And the output must contain "hello from recipe" diff --git a/lib/producer/core.rb b/lib/producer/core.rb index 91b5bf7..f373de8 100644 --- a/lib/producer/core.rb +++ b/lib/producer/core.rb @@ -1,3 +1,4 @@ require 'producer/core/cli' require 'producer/core/recipe' +require 'producer/core/task' require 'producer/core/version' diff --git a/lib/producer/core/recipe.rb b/lib/producer/core/recipe.rb index ea37846..ebf5387 100644 --- a/lib/producer/core/recipe.rb +++ b/lib/producer/core/recipe.rb @@ -13,11 +13,15 @@ module Producer def evaluate dsl = DSL.new(@code) + dsl.tasks.each.map(&:evaluate) end class DSL + attr_reader :tasks + def initialize(code = nil, &block) + @tasks = [] if code instance_eval code else @@ -31,6 +35,10 @@ module Producer def source(filepath) instance_eval File.read("./#{filepath}.rb") end + + def task(name, &block) + @tasks << Task.new(name, &block) + end end end end diff --git a/lib/producer/core/task.rb b/lib/producer/core/task.rb new file mode 100644 index 0000000..457d7a7 --- /dev/null +++ b/lib/producer/core/task.rb @@ -0,0 +1,16 @@ +module Producer + module Core + class Task + attr_reader :name + + def initialize(name, &block) + @name = name + @block = block + end + + def evaluate + instance_eval &@block + end + end + end +end diff --git a/spec/producer/core/recipe_spec.rb b/spec/producer/core/recipe_spec.rb index d31b00c..249809a 100644 --- a/spec/producer/core/recipe_spec.rb +++ b/spec/producer/core/recipe_spec.rb @@ -54,6 +54,23 @@ module Producer::Core expect { dsl }.to raise_error(RuntimeError, 'error from recipe') end end + + describe '#tasks' do + let(:code) { Proc.new { task(:some_task) } } + + it 'returns registered tasks' do + expect(dsl.tasks[0].name).to eq :some_task + end + end + + describe '#task' do + let(:code) { Proc.new { task(:one); task(:two) } } + + it 'registers tasks in declaration order' do + expect(dsl.tasks[0].name).to eq :one + expect(dsl.tasks[1].name).to eq :two + end + end end end end diff --git a/spec/producer/core/task_spec.rb b/spec/producer/core/task_spec.rb new file mode 100644 index 0000000..59513ba --- /dev/null +++ b/spec/producer/core/task_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +module Producer::Core + describe Task do + let(:name) { :some_task } + let(:block) { } + subject(:task) { Task.new(name, &block) } + + describe '#name' do + it 'returns its name' do + expect(task.name).to eq name + end + end + + describe 'evaluate' do + let(:block) { Proc.new { raise 'error from task' } } + + it 'evaluates its block' do + expect { task.evaluate }.to raise_error(RuntimeError, 'error from task') + end + end + end +end