turnip 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.travis.yml +3 -7
- data/README.md +7 -2
- data/lib/turnip/builder.rb +10 -5
- data/lib/turnip/rspec.rb +20 -7
- data/lib/turnip/table.rb +21 -6
- data/lib/turnip/version.rb +1 -1
- data/spec/define_and_execute_spec.rb +2 -2
- data/spec/dsl_spec.rb +2 -2
- data/spec/integration_spec.rb +17 -0
- data/spec/spec_helper.rb +9 -1
- data/spec/table_spec.rb +18 -0
- data/turnip.gemspec +1 -0
- metadata +25 -19
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 72456decf90242ed5674a042e9094c9934ff893a
|
4
|
+
data.tar.gz: 8f8bbb0a619043fbaf1a086a17c335d17f24ba9c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ac830dc4654120f8499dd690c037a06e420f98aca282e6de2a36cf20830e1202d628ed1b1c8869e2bc069912c2731805fffde12466e7a5419c0a152061824b2f
|
7
|
+
data.tar.gz: 9e61d6909a13750d29517b6f56ff0ad971450f8efe7934bef86d05975d766d9aab3bb0fcca6d8a74557ee820c608cdb1b667b142b002a43d12d1b7397a791826
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,11 @@ extension for RSpec. It allows you to write tests in Gherkin and run them
|
|
8
8
|
through your RSpec environment. Basically you can write cucumber features in
|
9
9
|
RSpec.
|
10
10
|
|
11
|
+
## Maintainer wanted!
|
12
|
+
|
13
|
+
Are you interested in maintaining Turnip's code base? Please get in touch with
|
14
|
+
[me](http://github.com/jnicklas).
|
15
|
+
|
11
16
|
## Installation
|
12
17
|
|
13
18
|
Install the gem
|
@@ -239,7 +244,7 @@ step "the value is :num" do |num|
|
|
239
244
|
@value = num
|
240
245
|
end
|
241
246
|
|
242
|
-
step "the value is the magic number"
|
247
|
+
step "the value is the magic number" do
|
243
248
|
step "the value is 3"
|
244
249
|
end
|
245
250
|
```
|
@@ -332,7 +337,7 @@ end
|
|
332
337
|
|
333
338
|
Just require `turnip/capybara` in your `spec_helper`. You can now use the same
|
334
339
|
tags you'd use in Cucumber to switch between drivers e.g. `@javascript` or
|
335
|
-
`@selenium`. Your Turnip features will also be run with the `:type => :
|
340
|
+
`@selenium`. Your Turnip features will also be run with the `:type => :feature`
|
336
341
|
metadata, so that Capybara is included and also any other extensions you might
|
337
342
|
want to add.
|
338
343
|
|
data/lib/turnip/builder.rb
CHANGED
@@ -22,9 +22,16 @@ module Turnip
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
module Line
|
26
|
+
def line
|
27
|
+
@raw.line
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
25
31
|
class Feature
|
26
32
|
include Tags
|
27
33
|
include Name
|
34
|
+
include Line
|
28
35
|
|
29
36
|
attr_reader :scenarios, :backgrounds
|
30
37
|
attr_accessor :feature_tag
|
@@ -35,10 +42,6 @@ module Turnip
|
|
35
42
|
@backgrounds = []
|
36
43
|
end
|
37
44
|
|
38
|
-
def line
|
39
|
-
@raw.line
|
40
|
-
end
|
41
|
-
|
42
45
|
def metadata_hash
|
43
46
|
super.merge(:type => Turnip.type, :turnip => true)
|
44
47
|
end
|
@@ -55,6 +58,7 @@ module Turnip
|
|
55
58
|
class Scenario
|
56
59
|
include Tags
|
57
60
|
include Name
|
61
|
+
include Line
|
58
62
|
|
59
63
|
attr_accessor :steps
|
60
64
|
|
@@ -153,7 +157,8 @@ module Turnip
|
|
153
157
|
if step.doc_string
|
154
158
|
extra_args.push step.doc_string.value
|
155
159
|
elsif step.rows
|
156
|
-
|
160
|
+
table = Turnip::Table.new(step.rows.map(&:cells).map(&:to_a))
|
161
|
+
extra_args.push(table)
|
157
162
|
end
|
158
163
|
@current_step_context.steps << Step.new(step.name, extra_args, step.line)
|
159
164
|
end
|
data/lib/turnip/rspec.rb
CHANGED
@@ -42,8 +42,11 @@ module Turnip
|
|
42
42
|
def run_step(feature_file, step)
|
43
43
|
begin
|
44
44
|
step(step)
|
45
|
-
rescue Turnip::Pending
|
46
|
-
|
45
|
+
rescue Turnip::Pending => e
|
46
|
+
# This is kind of a hack, but it will make RSpec throw way nicer exceptions
|
47
|
+
example = Turnip::RSpec.fetch_current_example(self)
|
48
|
+
example.metadata[:line_number] = step.line
|
49
|
+
pending("No such step: '#{e}'")
|
47
50
|
rescue StandardError => e
|
48
51
|
e.backtrace.push "#{feature_file}:#{step.line}:in `#{step.description}'"
|
49
52
|
raise e
|
@@ -52,10 +55,19 @@ module Turnip
|
|
52
55
|
end
|
53
56
|
|
54
57
|
class << self
|
58
|
+
def fetch_current_example(context)
|
59
|
+
if ::RSpec.respond_to?(:current_example)
|
60
|
+
::RSpec.current_example
|
61
|
+
else
|
62
|
+
context.example
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
55
66
|
def run(feature_file)
|
56
67
|
Turnip::Builder.build(feature_file).features.each do |feature|
|
57
68
|
describe feature.name, feature.metadata_hash do
|
58
69
|
before do
|
70
|
+
example = Turnip::RSpec.fetch_current_example(self)
|
59
71
|
# This is kind of a hack, but it will make RSpec throw way nicer exceptions
|
60
72
|
example.metadata[:file_path] = feature_file
|
61
73
|
|
@@ -64,13 +76,14 @@ module Turnip
|
|
64
76
|
end
|
65
77
|
end
|
66
78
|
feature.scenarios.each do |scenario|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
79
|
+
instance_eval <<-EOS, feature_file, scenario.line
|
80
|
+
describe scenario.name, scenario.metadata_hash do it(scenario.steps.map(&:description).join(' -> ')) do
|
81
|
+
scenario.steps.each do |step|
|
82
|
+
run_step(feature_file, step)
|
83
|
+
end
|
71
84
|
end
|
72
85
|
end
|
73
|
-
|
86
|
+
EOS
|
74
87
|
end
|
75
88
|
end
|
76
89
|
end
|
data/lib/turnip/table.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
module Turnip
|
2
2
|
class Table
|
3
|
+
class WidthMismatch < StandardError
|
4
|
+
def initialize(expected, actual)
|
5
|
+
super("Expected the table to be #{expected} columns wide, got #{actual}")
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class ColumnNotExist < StandardError
|
10
|
+
def initialize(column_name)
|
11
|
+
super("The column named \"#{column_name}\" does not exist")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
3
15
|
attr_reader :raw
|
4
16
|
alias_method :to_a, :raw
|
5
17
|
|
@@ -34,16 +46,19 @@ module Turnip
|
|
34
46
|
raw.each { |row| yield(row) }
|
35
47
|
end
|
36
48
|
|
49
|
+
def map_column!(name, strict = true)
|
50
|
+
index = headers.index(name.to_s)
|
51
|
+
if index.nil?
|
52
|
+
raise ColumnNotExist.new(name) if strict
|
53
|
+
else
|
54
|
+
rows.each { |row| row[index] = yield(row[index]) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
37
58
|
private
|
38
59
|
|
39
60
|
def width
|
40
61
|
raw[0].size
|
41
62
|
end
|
42
|
-
|
43
|
-
class WidthMismatch < StandardError
|
44
|
-
def initialize(expected, actual)
|
45
|
-
super("Expected the table to be #{expected} columns wide, got #{actual}")
|
46
|
-
end
|
47
|
-
end
|
48
63
|
end
|
49
64
|
end
|
data/lib/turnip/version.rb
CHANGED
@@ -41,13 +41,13 @@ describe Turnip::Execute do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
it "can be executed with a builder step" do
|
44
|
-
builder_step =
|
44
|
+
builder_step = double(:to_s => "a cool step", :extra_args => [])
|
45
45
|
mod.step("a :test step") { |test| test.upcase }
|
46
46
|
obj.step(builder_step).should == "COOL"
|
47
47
|
end
|
48
48
|
|
49
49
|
it "sends in extra arg from a builder step" do
|
50
|
-
builder_step =
|
50
|
+
builder_step = double(:to_s => "a cool step", :extra_args => ["foo"])
|
51
51
|
mod.step("a :test step") { |test, foo| test.upcase + foo }
|
52
52
|
obj.step(builder_step).should == "COOLfoo"
|
53
53
|
end
|
data/spec/dsl_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Turnip::DSL do
|
4
|
-
let(:context) {
|
4
|
+
let(:context) { double.tap { |s| s.extend(Turnip::DSL) }}
|
5
5
|
let(:an_object) { Object.new.tap { |o| o.extend(Turnip::Execute) }}
|
6
6
|
describe '.steps_for' do
|
7
7
|
before do
|
@@ -22,7 +22,7 @@ describe Turnip::DSL do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'tells RSpec to include the module' do
|
25
|
-
config =
|
25
|
+
config = double
|
26
26
|
RSpec.should_receive(:configure).and_yield(config)
|
27
27
|
config.should_receive(:include)
|
28
28
|
|
data/spec/integration_spec.rb
CHANGED
@@ -17,4 +17,21 @@ describe 'The CLI', :type => :integration do
|
|
17
17
|
it "includes features in backtraces" do
|
18
18
|
@result.should include('examples/errors.feature:5:in `raise error')
|
19
19
|
end
|
20
|
+
|
21
|
+
it "includes the right step name when steps call steps" do
|
22
|
+
@result.should include("No such step: 'this is an unimplemented step'")
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'prints line numbers of pending/failure scenario' do
|
26
|
+
@result.should include('./examples/pending.feature:3')
|
27
|
+
@result.should include('./examples/errors.feature:4')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'conforms to line-number option' do
|
31
|
+
@result.should include('rspec ./examples/errors.feature:4')
|
32
|
+
@result.should include('rspec ./examples/errors.feature:6')
|
33
|
+
result_with_line_number = %x(rspec -fs ./examples/errors.feature:4)
|
34
|
+
result_with_line_number.should include('rspec ./examples/errors.feature:4')
|
35
|
+
result_with_line_number.should_not include('rspec ./examples/errors.feature:6')
|
36
|
+
end
|
20
37
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1 +1,9 @@
|
|
1
|
-
|
1
|
+
require "pry"
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.expect_with :rspec do |c|
|
5
|
+
c.syntax = [:should, :expect]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
Dir.glob(File.expand_path("../examples/**/*steps.rb", File.dirname(__FILE__))) { |f| require f }
|
data/spec/table_spec.rb
CHANGED
@@ -77,4 +77,22 @@ describe Turnip::Table do
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
describe '#map_column!' do
|
81
|
+
let(:raw) { [['name', 'age'], ['Dave', '31'], ['John', '45']] }
|
82
|
+
it 'iterates through the column value and assigns it the value returned by the block' do
|
83
|
+
table.map_column!(:age) { |age| age.to_i }
|
84
|
+
table.rows.should == [['Dave', 31], ['John', 45]]
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'with undefined column' do
|
88
|
+
|
89
|
+
it 'raies an error' do
|
90
|
+
expect { table.map_column!(:undefined){} }.to raise_error Turnip::Table::ColumnNotExist
|
91
|
+
end
|
92
|
+
it 'not raises an error when the strict param is false' do
|
93
|
+
expect { table.map_column!(:undefined, false){} }.to_not raise_error
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
80
98
|
end
|
data/turnip.gemspec
CHANGED
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turnip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jonas Nicklas
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-26 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,33 +27,43 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: gherkin
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '2.5'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '2.5'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rake
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
description: Provides the ability to define steps and run Gherkin files from with
|
@@ -121,27 +128,26 @@ files:
|
|
121
128
|
- turnip.gemspec
|
122
129
|
homepage: ''
|
123
130
|
licenses: []
|
131
|
+
metadata: {}
|
124
132
|
post_install_message:
|
125
133
|
rdoc_options: []
|
126
134
|
require_paths:
|
127
135
|
- lib
|
128
136
|
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
137
|
requirements:
|
131
|
-
- -
|
138
|
+
- - '>='
|
132
139
|
- !ruby/object:Gem::Version
|
133
140
|
version: '0'
|
134
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
|
-
none: false
|
136
142
|
requirements:
|
137
|
-
- -
|
143
|
+
- - '>='
|
138
144
|
- !ruby/object:Gem::Version
|
139
145
|
version: '0'
|
140
146
|
requirements: []
|
141
147
|
rubyforge_project: turnip
|
142
|
-
rubygems_version:
|
148
|
+
rubygems_version: 2.0.6
|
143
149
|
signing_key:
|
144
|
-
specification_version:
|
150
|
+
specification_version: 4
|
145
151
|
summary: Gherkin extension for RSpec
|
146
152
|
test_files:
|
147
153
|
- spec/builder_spec.rb
|