turnip 0.3.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +128 -166
- data/examples/autoload_steps.feature +3 -2
- data/examples/errors.feature +8 -0
- data/examples/step_calling.feature +2 -0
- data/examples/steps/alignment_steps.rb +23 -0
- data/examples/{autoload_steps.rb → steps/autoload_steps.rb} +0 -0
- data/examples/steps/backtick_steps.rb +10 -0
- data/examples/steps/dragon_steps.rb +41 -0
- data/examples/{knight_steps.rb → steps/knight_steps.rb} +3 -1
- data/examples/{more_steps.rb → steps/more_steps.rb} +0 -0
- data/examples/{step_calling_steps.rb → steps/step_calling_steps.rb} +0 -0
- data/examples/{steps.rb → steps/steps.rb} +25 -1
- data/examples/steps_for.feature +2 -2
- data/examples/steps_with_variations.feature +17 -0
- data/lib/turnip.rb +19 -34
- data/lib/turnip/builder.rb +26 -24
- data/lib/turnip/define.rb +9 -0
- data/lib/turnip/dsl.rb +11 -17
- data/lib/turnip/execute.rb +15 -0
- data/lib/turnip/rspec.rb +80 -0
- data/lib/turnip/step_definition.rb +7 -32
- data/lib/turnip/version.rb +1 -1
- data/spec/builder_spec.rb +1 -40
- data/spec/define_and_execute.rb +38 -0
- data/spec/dsl_spec.rb +36 -19
- data/spec/integration_spec.rb +5 -1
- data/spec/spec_helper.rb +1 -3
- data/spec/step_definition_spec.rb +37 -51
- metadata +25 -55
- data/examples/alignment_steps.rb +0 -7
- data/examples/backtick_steps.rb +0 -4
- data/examples/dragon_steps.rb +0 -17
- data/examples/evil_steps.rb +0 -7
- data/examples/neutral_steps.rb +0 -7
- data/examples/red_dragon_steps.rb +0 -18
- data/lib/turnip/config.rb +0 -18
- data/lib/turnip/feature_file.rb +0 -20
- data/lib/turnip/loader.rb +0 -16
- data/lib/turnip/runner_dsl.rb +0 -9
- data/lib/turnip/scenario_context.rb +0 -41
- data/lib/turnip/scenario_runner.rb +0 -35
- data/lib/turnip/step_loader.rb +0 -27
- data/lib/turnip/step_module.rb +0 -89
- data/spec/feature_file_spec.rb +0 -18
- data/spec/runner_dsl_spec.rb +0 -23
- data/spec/scenario_context_spec.rb +0 -51
- data/spec/scenario_runner_spec.rb +0 -79
- data/spec/step_loader_spec.rb +0 -29
- data/spec/step_module_spec.rb +0 -106
data/examples/alignment_steps.rb
DELETED
data/examples/backtick_steps.rb
DELETED
data/examples/dragon_steps.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
steps_for :dragon do
|
2
|
-
use_steps :knight
|
3
|
-
|
4
|
-
attr_accessor :dragon
|
5
|
-
|
6
|
-
def dragon_attack
|
7
|
-
dragon * 10
|
8
|
-
end
|
9
|
-
|
10
|
-
step "there is a dragon" do
|
11
|
-
self.dragon = 1
|
12
|
-
end
|
13
|
-
|
14
|
-
step "the dragon attacks the knight" do
|
15
|
-
knight.attacked_for(dragon_attack)
|
16
|
-
end
|
17
|
-
end
|
data/examples/evil_steps.rb
DELETED
data/examples/neutral_steps.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
steps_for :red_dragon do
|
2
|
-
use_steps :dragon
|
3
|
-
|
4
|
-
attr_accessor :red_dragon
|
5
|
-
|
6
|
-
def dragon_attack
|
7
|
-
attack = super
|
8
|
-
if red_dragon
|
9
|
-
attack + 15
|
10
|
-
else
|
11
|
-
attack
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
step "the dragon breathes fire" do
|
16
|
-
self.red_dragon = 1
|
17
|
-
end
|
18
|
-
end
|
data/lib/turnip/config.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Turnip
|
2
|
-
module Config
|
3
|
-
extend self
|
4
|
-
|
5
|
-
attr_accessor :autotag_features
|
6
|
-
|
7
|
-
def step_dirs
|
8
|
-
@step_dirs ||= ['spec']
|
9
|
-
end
|
10
|
-
|
11
|
-
def step_dirs=(dirs)
|
12
|
-
@step_dirs = [] unless @step_dirs
|
13
|
-
@step_dirs.concat(Array(dirs))
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
Turnip::Config.autotag_features = true
|
data/lib/turnip/feature_file.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Turnip
|
2
|
-
class FeatureFile
|
3
|
-
attr_accessor :file_name, :content, :feature_name
|
4
|
-
|
5
|
-
def initialize(file_name)
|
6
|
-
@file_name = file_name
|
7
|
-
end
|
8
|
-
|
9
|
-
def feature_name
|
10
|
-
@feature_name ||= begin
|
11
|
-
file = Pathname.new(file_name).basename.to_s
|
12
|
-
file[0...file.index('.feature')]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def content
|
17
|
-
@content ||= File.read(file_name)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/turnip/loader.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module Turnip
|
2
|
-
module Loader
|
3
|
-
def load(*a, &b)
|
4
|
-
if a.first.end_with?('.feature')
|
5
|
-
begin
|
6
|
-
require 'spec_helper'
|
7
|
-
rescue LoadError
|
8
|
-
end
|
9
|
-
Turnip::StepLoader.load_steps
|
10
|
-
Turnip.run(Turnip::FeatureFile.new(a.first))
|
11
|
-
else
|
12
|
-
super
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/turnip/runner_dsl.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Turnip
|
2
|
-
class ScenarioContext
|
3
|
-
attr_accessor :feature
|
4
|
-
attr_accessor :scenario
|
5
|
-
|
6
|
-
def initialize(feature, scenario)
|
7
|
-
self.feature = feature
|
8
|
-
self.scenario = scenario
|
9
|
-
end
|
10
|
-
|
11
|
-
def available_background_steps
|
12
|
-
available_steps_for(*feature_tags)
|
13
|
-
end
|
14
|
-
|
15
|
-
def available_scenario_steps
|
16
|
-
available_steps_for(*scenario_tags)
|
17
|
-
end
|
18
|
-
|
19
|
-
def backgrounds
|
20
|
-
feature.backgrounds
|
21
|
-
end
|
22
|
-
|
23
|
-
def modules
|
24
|
-
Turnip::StepModule.modules_for(*scenario_tags)
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def available_steps_for(*tags)
|
30
|
-
Turnip::StepModule.all_steps_for(*tags)
|
31
|
-
end
|
32
|
-
|
33
|
-
def feature_tags
|
34
|
-
@feature_tags ||= feature.active_tags.uniq
|
35
|
-
end
|
36
|
-
|
37
|
-
def scenario_tags
|
38
|
-
@scenario_tags ||= (feature_tags + scenario.active_tags).uniq
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Turnip
|
2
|
-
class ScenarioRunner
|
3
|
-
attr_accessor :available_steps
|
4
|
-
attr_accessor :context
|
5
|
-
attr_accessor :world
|
6
|
-
|
7
|
-
def initialize(world)
|
8
|
-
self.world = world
|
9
|
-
end
|
10
|
-
|
11
|
-
def load(context)
|
12
|
-
self.context = context
|
13
|
-
world.extend Turnip::RunnerDSL
|
14
|
-
world.turnip_runner = self
|
15
|
-
context.modules.each {|mod| world.extend mod }
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
def run
|
20
|
-
self.available_steps = context.available_background_steps
|
21
|
-
context.backgrounds.each do |background|
|
22
|
-
run_steps(background.steps)
|
23
|
-
end
|
24
|
-
|
25
|
-
self.available_steps = context.available_scenario_steps
|
26
|
-
run_steps(context.scenario.steps)
|
27
|
-
end
|
28
|
-
|
29
|
-
def run_steps(steps)
|
30
|
-
steps.each do |step|
|
31
|
-
Turnip::StepDefinition.execute(world, available_steps, step)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/turnip/step_loader.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Turnip
|
2
|
-
module StepLoader
|
3
|
-
extend self
|
4
|
-
|
5
|
-
attr_accessor :steps_loaded
|
6
|
-
|
7
|
-
def load_steps
|
8
|
-
return if steps_loaded?
|
9
|
-
load_step_files
|
10
|
-
self.steps_loaded = true
|
11
|
-
end
|
12
|
-
|
13
|
-
def steps_loaded?
|
14
|
-
@steps_loaded
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def load_step_files
|
20
|
-
Turnip::Config.step_dirs.each do |dir|
|
21
|
-
Pathname.glob(Pathname.new(dir) + '**' + "*steps.rb").each do |step_file|
|
22
|
-
load step_file, true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/turnip/step_module.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
|
3
|
-
module Turnip
|
4
|
-
module StepModule
|
5
|
-
module DSL
|
6
|
-
def placeholder(name, &block)
|
7
|
-
Turnip::Placeholder.add(name, &block)
|
8
|
-
end
|
9
|
-
|
10
|
-
def step(description, &block)
|
11
|
-
steps << Turnip::StepDefinition.new(description, &block)
|
12
|
-
end
|
13
|
-
|
14
|
-
def steps
|
15
|
-
@steps ||= []
|
16
|
-
end
|
17
|
-
|
18
|
-
def use_steps(*tags)
|
19
|
-
uses_steps.concat(tags)
|
20
|
-
end
|
21
|
-
|
22
|
-
def uses_steps
|
23
|
-
@uses_steps ||= []
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class Entry < Struct.new(:for_tag, :step_module, :uses_steps)
|
28
|
-
def all_modules(already_visited = [])
|
29
|
-
if already_visited.include?(for_tag)
|
30
|
-
[]
|
31
|
-
else
|
32
|
-
already_visited << for_tag
|
33
|
-
uses_modules(already_visited) << step_module
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def uses_modules(already_visited)
|
38
|
-
uses_steps.map do |uses_tag|
|
39
|
-
StepModule.module_registry[uses_tag].map do |entry|
|
40
|
-
entry.all_modules(already_visited)
|
41
|
-
end
|
42
|
-
end.flatten.uniq
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
extend self
|
47
|
-
|
48
|
-
def all_steps_for(*taggings)
|
49
|
-
modules_for(*taggings).map do |step_module|
|
50
|
-
step_module.steps
|
51
|
-
end.flatten
|
52
|
-
end
|
53
|
-
|
54
|
-
def clear_module_registry
|
55
|
-
module_registry.clear
|
56
|
-
end
|
57
|
-
|
58
|
-
def modules_for(*taggings)
|
59
|
-
taggings.map do |tag|
|
60
|
-
module_registry[tag].map do |entry|
|
61
|
-
entry.all_modules
|
62
|
-
end
|
63
|
-
end.flatten.uniq
|
64
|
-
end
|
65
|
-
|
66
|
-
def module_registry
|
67
|
-
@module_registry ||= Hash.new { |hash, key| hash[key] = [] }
|
68
|
-
end
|
69
|
-
|
70
|
-
def registered?(module_name)
|
71
|
-
module_registry.has_key? module_name
|
72
|
-
end
|
73
|
-
|
74
|
-
def steps_for(tag, &block)
|
75
|
-
anon = step_module(&block)
|
76
|
-
|
77
|
-
entry = Entry.new(tag, anon, anon.uses_steps)
|
78
|
-
|
79
|
-
module_registry[tag] << entry
|
80
|
-
end
|
81
|
-
|
82
|
-
def step_module(&block)
|
83
|
-
anon = Module.new
|
84
|
-
anon.extend(Turnip::StepModule::DSL)
|
85
|
-
anon.module_eval(&block)
|
86
|
-
anon
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
data/spec/feature_file_spec.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Turnip::FeatureFile do
|
4
|
-
let(:file_name) {File.expand_path('../examples/with_comments.feature', File.dirname(__FILE__))}
|
5
|
-
let(:feature_file) {Turnip::FeatureFile.new(file_name)}
|
6
|
-
|
7
|
-
describe '.feature_name' do
|
8
|
-
it 'allows access to short name for the feature based on the file name' do
|
9
|
-
feature_file.feature_name.should == 'with_comments'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '.content' do
|
14
|
-
it 'allows access to the content in the feature file' do
|
15
|
-
feature_file.content.should be
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/spec/runner_dsl_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Turnip::RunnerDSL do
|
4
|
-
describe '#step' do
|
5
|
-
include Turnip::RunnerDSL
|
6
|
-
|
7
|
-
it 'runs the step' do
|
8
|
-
self.turnip_runner = Class.new do
|
9
|
-
attr_accessor :args
|
10
|
-
def run_steps(steps)
|
11
|
-
self.args << steps
|
12
|
-
end
|
13
|
-
end.new
|
14
|
-
self.turnip_runner.args = []
|
15
|
-
|
16
|
-
step('description', 'extra_arg')
|
17
|
-
step = turnip_runner.args.flatten.first
|
18
|
-
step.should be_kind_of(Turnip::Builder::Step)
|
19
|
-
step.description.should eq('description')
|
20
|
-
step.extra_arg.should eq('extra_arg')
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Turnip::ScenarioContext do
|
4
|
-
let(:context) { Turnip::ScenarioContext.new(feature, scenario) }
|
5
|
-
let(:feature) { stub(:active_tags => feature_tags) }
|
6
|
-
let(:feature_tags) { %w(feature both) }
|
7
|
-
let(:scenario) { stub(:active_tags => scenario_tags) }
|
8
|
-
let(:scenario_tags) { %w(scenario both) }
|
9
|
-
let(:unique_tags) { (feature_tags + scenario_tags).uniq }
|
10
|
-
|
11
|
-
describe '#initialize' do
|
12
|
-
let(:feature) { stub }
|
13
|
-
let(:scenario) { stub }
|
14
|
-
|
15
|
-
it 'keeps track of the feature' do
|
16
|
-
Turnip::ScenarioContext.new(feature, scenario).feature.should eq(feature)
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'keeps track of the scenario' do
|
20
|
-
Turnip::ScenarioContext.new(feature, scenario).scenario.should eq(scenario)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe '#available_background_steps' do
|
25
|
-
it 'gathers the steps for the feature tags' do
|
26
|
-
Turnip::StepModule.should_receive(:all_steps_for).with(*feature_tags)
|
27
|
-
context.available_background_steps
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '#available_scenario_steps' do
|
32
|
-
it 'gathers the steps for the unique scenario and feature tags' do
|
33
|
-
Turnip::StepModule.should_receive(:all_steps_for).with(*unique_tags)
|
34
|
-
context.available_scenario_steps
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#backgrounds' do
|
39
|
-
it 'delegates to the feature' do
|
40
|
-
feature.should_receive :backgrounds
|
41
|
-
context.backgrounds
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#modules' do
|
46
|
-
it 'gathers the modules for the unique scenario and feature tags' do
|
47
|
-
Turnip::StepModule.should_receive(:modules_for).with(*unique_tags)
|
48
|
-
context.modules
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Turnip::ScenarioRunner do
|
4
|
-
let(:runner) { Turnip::ScenarioRunner.new(world) }
|
5
|
-
let(:world) { Object.new }
|
6
|
-
|
7
|
-
describe '#initialize' do
|
8
|
-
it 'keeps track of the world' do
|
9
|
-
Turnip::ScenarioRunner.new(world).world.should eq(world)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '#load' do
|
14
|
-
let(:context) { stub(:modules => [some_module]) }
|
15
|
-
let(:some_module) { Module.new }
|
16
|
-
|
17
|
-
it 'is chainable' do
|
18
|
-
runner.load(context).should eq(runner)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'keeps track of the scenario context' do
|
22
|
-
runner.load(context).context.should eq(context)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'loads the given modules into the world' do
|
26
|
-
runner.load(context).world.should be_kind_of(some_module)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'loads the DSL module into the world' do
|
30
|
-
runner.load(context).world.should be_kind_of(Turnip::RunnerDSL)
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'adds the runner to the world' do
|
34
|
-
runner.load(context).world.turnip_runner.should eq(runner)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#run' do
|
39
|
-
it 'iterates over the background steps' do
|
40
|
-
runner.context = stub(:backgrounds => (0..2).map { stub(:steps => [stub]) },
|
41
|
-
:available_background_steps => [],
|
42
|
-
:available_scenario_steps => [],
|
43
|
-
:scenario => stub(:steps => []))
|
44
|
-
|
45
|
-
Turnip::StepDefinition.should_receive(:execute).exactly(3).times
|
46
|
-
runner.run
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'iterates over the scenario steps' do
|
50
|
-
runner.context = stub(:backgrounds => [],
|
51
|
-
:available_background_steps => [],
|
52
|
-
:available_scenario_steps => [],
|
53
|
-
:scenario => stub(:steps => (0..3)))
|
54
|
-
|
55
|
-
Turnip::StepDefinition.should_receive(:execute).exactly(4).times
|
56
|
-
runner.run
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe '#run_steps' do
|
61
|
-
let(:available_steps) { stub }
|
62
|
-
|
63
|
-
it 'executes the steps with the current world' do
|
64
|
-
step = stub
|
65
|
-
steps = [step]
|
66
|
-
runner.available_steps = available_steps
|
67
|
-
|
68
|
-
Turnip::StepDefinition.should_receive(:execute).with(world, available_steps, step)
|
69
|
-
runner.run_steps(steps)
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'iterates over the steps' do
|
73
|
-
steps = (0..2)
|
74
|
-
|
75
|
-
Turnip::StepDefinition.should_receive(:execute).exactly(3).times
|
76
|
-
runner.run_steps(steps)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|