turnip 1.2.1 → 1.2.2
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 +4 -4
- data/README.md +53 -6
- data/examples/scenario_outline_multiline_string_substitution.feature +13 -0
- data/examples/steps/steps.rb +4 -0
- data/lib/turnip/builder.rb +11 -5
- data/lib/turnip/capybara.rb +6 -3
- data/lib/turnip/placeholder.rb +1 -1
- data/lib/turnip/rspec.rb +8 -2
- data/lib/turnip/step_definition.rb +1 -1
- data/lib/turnip/version.rb +1 -1
- data/spec/builder_spec.rb +38 -5
- data/spec/integration_spec.rb +3 -3
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdb367c9acc76b2fb0f4abbbedf8730ce97f3d33
|
4
|
+
data.tar.gz: 69314b7771dfcd5a645b4a41b01d1c99c84ae5e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ba3f6f9153835411c293efb95224f4e3a0a22e6f896a2df4ab52739c9ae66a661658c10e214a7a06bb6bb625c16c8bb4105739c93d0abcf8b2d3b63ea190e8b
|
7
|
+
data.tar.gz: 2305ebaeee98b1da8a8f599fc3a94c51c27487732e9af2d5762f56260cebf186665a38e1123249860f6330f8ca7865276d974d00c116bf33455c6be2ac20ce8b
|
data/README.md
CHANGED
@@ -1,18 +1,13 @@
|
|
1
1
|
# Turnip
|
2
2
|
|
3
3
|
[](http://travis-ci.org/jnicklas/turnip)
|
4
|
-
[](https://codeclimate.com/github/jnicklas/turnip)
|
5
5
|
|
6
6
|
Turnip is a [Gherkin](https://github.com/cucumber/cucumber/wiki/Gherkin)
|
7
7
|
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
|
-
|
16
11
|
## Installation
|
17
12
|
|
18
13
|
Install the gem
|
@@ -98,6 +93,30 @@ RSpec.configure { |c| c.include MonsterSteps }
|
|
98
93
|
Steps are implemented as regular Ruby methods under the hood, so you can
|
99
94
|
use Ruby's normal inheritance chain to mix and match steps.
|
100
95
|
|
96
|
+
### Before/After Hooks
|
97
|
+
|
98
|
+
Since Turnip runs atop RSpec, it can utilize RSpec's built-in before and after
|
99
|
+
hooks. To run a hook for all features, specify a global hook with `type` set
|
100
|
+
to `:feature`:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
config.before(:type => :feature) do
|
104
|
+
do_something
|
105
|
+
end
|
106
|
+
config.after(:type => :feature) do
|
107
|
+
do_something_else
|
108
|
+
end
|
109
|
+
```
|
110
|
+
|
111
|
+
You can also limit this to a tag by specifying the tag in the argument to
|
112
|
+
`before` or `after`:
|
113
|
+
|
114
|
+
```ruby
|
115
|
+
config.before(:some_tag => true) do
|
116
|
+
do_something
|
117
|
+
end
|
118
|
+
```
|
119
|
+
|
101
120
|
### Global steps
|
102
121
|
|
103
122
|
Turnip has a special module called `Turnip::Steps`, which is automatically
|
@@ -217,6 +236,14 @@ Before loading your `spec_helper`, Turnip also tries to load a file called
|
|
217
236
|
You might find it beneficial to load your steps from this file so that they
|
218
237
|
don't have to be loaded when you run your other tests.
|
219
238
|
|
239
|
+
If you use Turnip with [rspec-rails](https://github.com/rspec/rspec-rails) v3.x, most configuration written to `rails_helper.rb` but not `spec_helper.rb`. So you should write to `turnip_helper` like this:
|
240
|
+
|
241
|
+
```ruby
|
242
|
+
require 'rails_helper'
|
243
|
+
```
|
244
|
+
|
245
|
+
Then you can write configuration to `rails_helper` to load your steps.
|
246
|
+
|
220
247
|
### Calling steps from other steps
|
221
248
|
|
222
249
|
Since steps are Ruby methods you can call them like other Ruby methods.
|
@@ -333,6 +360,26 @@ step "there are the following monsters:" do |table|
|
|
333
360
|
end
|
334
361
|
```
|
335
362
|
|
363
|
+
## Substitution in Scenario Outlines
|
364
|
+
|
365
|
+
You would be able to use substitution that can be used to DocString and Table arguments in Scenario Outline like [Cucumber](http://cukes.info/step-definitions.html#substitution_in_scenario_outlines):
|
366
|
+
|
367
|
+
```cucumber
|
368
|
+
Scenario Outline: Email confirmation
|
369
|
+
Given I have a user account with my name "Jojo Binks"
|
370
|
+
When an Admin grants me <Role> rights
|
371
|
+
Then I should receive an email with the body:
|
372
|
+
"""
|
373
|
+
Dear Jojo Binks,
|
374
|
+
You have been granted <Role> rights. You are <details>. Please be responsible.
|
375
|
+
-The Admins
|
376
|
+
"""
|
377
|
+
Examples:
|
378
|
+
| Role | details |
|
379
|
+
| Manager | now able to manage your employee accounts |
|
380
|
+
| Admin | able to manage any user account on the system |
|
381
|
+
```
|
382
|
+
|
336
383
|
## Using with Capybara
|
337
384
|
|
338
385
|
Just require `turnip/capybara` in your `spec_helper`. You can now use the same
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: using scenario outlines
|
2
|
+
Scenario Outline: a simple outline
|
3
|
+
Given there is a monster called <name>
|
4
|
+
Then the monster introduced himself:
|
5
|
+
"""
|
6
|
+
Ahhhhhhh! i'm <name>!
|
7
|
+
"""
|
8
|
+
|
9
|
+
Examples:
|
10
|
+
| name |
|
11
|
+
| John |
|
12
|
+
| "John Smith" |
|
13
|
+
| "O'Flannahan" |
|
data/examples/steps/steps.rb
CHANGED
@@ -44,6 +44,10 @@ step "it should be nameless" do
|
|
44
44
|
@monster_name.should == ""
|
45
45
|
end
|
46
46
|
|
47
|
+
step "the monster introduced himself:" do |self_introduction|
|
48
|
+
self_introduction.should include @monster_name
|
49
|
+
end
|
50
|
+
|
47
51
|
step "there is a monster with :count hitpoints" do |count|
|
48
52
|
@monster = count
|
49
53
|
end
|
data/lib/turnip/builder.rb
CHANGED
@@ -87,10 +87,16 @@ module Turnip
|
|
87
87
|
scenario.steps = steps.map do |step|
|
88
88
|
new_description = substitute(step.description, headers, row)
|
89
89
|
new_extra_args = step.extra_args.map do |ea|
|
90
|
-
|
91
|
-
|
90
|
+
case ea
|
91
|
+
when String
|
92
|
+
substitute(ea, headers, row)
|
93
|
+
when Turnip::Table
|
94
|
+
Turnip::Table.new(ea.map {|t_row| t_row.map {|t_col| substitute(t_col, headers, row) } })
|
95
|
+
else
|
96
|
+
ea
|
97
|
+
end
|
92
98
|
end
|
93
|
-
Step.new(new_description, new_extra_args, step.line)
|
99
|
+
Step.new(new_description, new_extra_args, step.line, step.keyword)
|
94
100
|
end
|
95
101
|
end
|
96
102
|
end
|
@@ -103,7 +109,7 @@ module Turnip
|
|
103
109
|
end
|
104
110
|
end
|
105
111
|
|
106
|
-
class Step < Struct.new(:description, :extra_args, :line)
|
112
|
+
class Step < Struct.new(:description, :extra_args, :line, :keyword)
|
107
113
|
# 1.9.2 support hack
|
108
114
|
def split(*args)
|
109
115
|
self.to_s.split(*args)
|
@@ -160,7 +166,7 @@ module Turnip
|
|
160
166
|
table = Turnip::Table.new(step.rows.map(&:cells).map(&:to_a))
|
161
167
|
extra_args.push(table)
|
162
168
|
end
|
163
|
-
@current_step_context.steps << Step.new(step.name, extra_args, step.line)
|
169
|
+
@current_step_context.steps << Step.new(step.name, extra_args, step.line, step.keyword)
|
164
170
|
end
|
165
171
|
|
166
172
|
def uri(*)
|
data/lib/turnip/capybara.rb
CHANGED
@@ -2,9 +2,12 @@ require 'capybara/rspec'
|
|
2
2
|
|
3
3
|
RSpec.configure do |config|
|
4
4
|
config.before do
|
5
|
-
if
|
6
|
-
|
7
|
-
|
5
|
+
current_example = example if respond_to?(:example)
|
6
|
+
current_example ||= RSpec.current_example
|
7
|
+
|
8
|
+
if self.class.include?(Capybara::DSL) and current_example.metadata[:turnip]
|
9
|
+
Capybara.current_driver = Capybara.javascript_driver if current_example.metadata.has_key?(:javascript)
|
10
|
+
current_example.metadata.each do |tag, value|
|
8
11
|
if Capybara.drivers.has_key?(tag)
|
9
12
|
Capybara.current_driver = tag
|
10
13
|
end
|
data/lib/turnip/placeholder.rb
CHANGED
@@ -27,7 +27,7 @@ module Turnip
|
|
27
27
|
|
28
28
|
def default
|
29
29
|
@default ||= new(:default) do
|
30
|
-
match %r((?:"([^"]*)"|'([^']*)'|([
|
30
|
+
match %r((?:"([^"]*)"|'([^']*)'|([[:alnum:]_-]+))) do |first, second, third|
|
31
31
|
first or second or third
|
32
32
|
end
|
33
33
|
end
|
data/lib/turnip/rspec.rb
CHANGED
@@ -46,7 +46,13 @@ module Turnip
|
|
46
46
|
# This is kind of a hack, but it will make RSpec throw way nicer exceptions
|
47
47
|
example = Turnip::RSpec.fetch_current_example(self)
|
48
48
|
example.metadata[:line_number] = step.line
|
49
|
-
|
49
|
+
example.metadata[:location] = "#{example.metadata[:file_path]}:#{step.line}"
|
50
|
+
|
51
|
+
if ::RSpec::Version::STRING >= '2.99.0'
|
52
|
+
skip("No such step: '#{e}'")
|
53
|
+
else
|
54
|
+
pending("No such step: '#{e}'")
|
55
|
+
end
|
50
56
|
rescue StandardError => e
|
51
57
|
e.backtrace.push "#{feature_file}:#{step.line}:in `#{step.description}'"
|
52
58
|
raise e
|
@@ -65,7 +71,7 @@ module Turnip
|
|
65
71
|
|
66
72
|
def run(feature_file)
|
67
73
|
Turnip::Builder.build(feature_file).features.each do |feature|
|
68
|
-
describe feature.name, feature.metadata_hash do
|
74
|
+
::RSpec.describe feature.name, feature.metadata_hash do
|
69
75
|
before do
|
70
76
|
example = Turnip::RSpec.fetch_current_example(self)
|
71
77
|
# This is kind of a hack, but it will make RSpec throw way nicer exceptions
|
@@ -38,7 +38,7 @@ module Turnip
|
|
38
38
|
|
39
39
|
OPTIONAL_WORD_REGEXP = /(\\\s)?\\\(([^)]+)\\\)(\\\s)?/
|
40
40
|
PLACEHOLDER_REGEXP = /:([\w]+)/
|
41
|
-
ALTERNATIVE_WORD_REGEXP = /(
|
41
|
+
ALTERNATIVE_WORD_REGEXP = /([[:alpha:]]+)((\/[[:alpha:]]+)+)/
|
42
42
|
|
43
43
|
def compile_regexp
|
44
44
|
@placeholder_names = []
|
data/lib/turnip/version.rb
CHANGED
data/spec/builder_spec.rb
CHANGED
@@ -1,11 +1,32 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Turnip::Builder do
|
4
|
+
let(:builder) { Turnip::Builder.build(feature_file) }
|
5
|
+
let(:feature) { builder.features.first }
|
6
|
+
|
7
|
+
context 'simple scenarios' do
|
8
|
+
let(:feature_file) { File.expand_path('../examples/simple_feature.feature', File.dirname(__FILE__)) }
|
9
|
+
let(:steps) { feature.scenarios.first.steps }
|
10
|
+
|
11
|
+
it 'extracts step description' do
|
12
|
+
steps.map(&:description).should eq([
|
13
|
+
'there is a monster',
|
14
|
+
'I attack it',
|
15
|
+
'it should die'
|
16
|
+
])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'extracts step line' do
|
20
|
+
steps.map(&:line).should eq([3, 4, 5])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'extracts step keyword' do
|
24
|
+
steps.map(&:keyword).should eq(['Given ', 'When ', 'Then '])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
4
28
|
context "with scenario outlines" do
|
5
29
|
let(:feature_file) { File.expand_path('../examples/scenario_outline.feature', File.dirname(__FILE__)) }
|
6
|
-
let(:builder) { Turnip::Builder.build(feature_file) }
|
7
|
-
let(:feature) { builder.features.first }
|
8
|
-
|
9
30
|
|
10
31
|
it "extracts scenarios" do
|
11
32
|
feature.scenarios.map(&:name).should eq([
|
@@ -30,8 +51,6 @@ describe Turnip::Builder do
|
|
30
51
|
|
31
52
|
context "with example tables in scenario outlines" do
|
32
53
|
let(:feature_file) { File.expand_path('../examples/scenario_outline_table_substitution.feature', File.dirname(__FILE__)) }
|
33
|
-
let(:builder) { Turnip::Builder.build(feature_file) }
|
34
|
-
let(:feature) { builder.features.first }
|
35
54
|
|
36
55
|
it "replaces placeholders in tables in steps" do
|
37
56
|
feature.scenarios[0].steps.map(&:description).should eq([
|
@@ -44,6 +63,20 @@ describe Turnip::Builder do
|
|
44
63
|
table = feature.scenarios[1].steps[0].extra_args.find {|a| a.instance_of?(Turnip::Table)}
|
45
64
|
table.hashes[0]['hit_points'].should == '8'
|
46
65
|
end
|
66
|
+
end
|
47
67
|
|
68
|
+
context 'with example multiline in scenario outlines' do
|
69
|
+
let(:feature_file) { File.expand_path('../examples/scenario_outline_multiline_string_substitution.feature', File.dirname(__FILE__)) }
|
70
|
+
let(:steps) { feature.scenarios[1].steps }
|
71
|
+
|
72
|
+
it 'replaces placeholders in multiline in steps' do
|
73
|
+
steps.map(&:description).should eq([
|
74
|
+
'there is a monster called "John Smith"',
|
75
|
+
'the monster introduced himself:'
|
76
|
+
])
|
77
|
+
|
78
|
+
multiline = steps[1].extra_args.first
|
79
|
+
multiline.should eq %q(Ahhhhhhh! i'm "John Smith"!)
|
80
|
+
end
|
48
81
|
end
|
49
82
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'The CLI', :type => :integration do
|
4
4
|
before do
|
5
|
-
@result = %x(rspec -
|
5
|
+
@result = %x(rspec -fd examples/*.feature)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "shows the correct description" do
|
@@ -11,7 +11,7 @@ describe 'The CLI', :type => :integration do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "prints out failures and successes" do
|
14
|
-
@result.should include('
|
14
|
+
@result.should include('38 examples, 3 failures, 5 pending')
|
15
15
|
end
|
16
16
|
|
17
17
|
it "includes features in backtraces" do
|
@@ -30,7 +30,7 @@ describe 'The CLI', :type => :integration do
|
|
30
30
|
it 'conforms to line-number option' do
|
31
31
|
@result.should include('rspec ./examples/errors.feature:4')
|
32
32
|
@result.should include('rspec ./examples/errors.feature:6')
|
33
|
-
result_with_line_number = %x(rspec -
|
33
|
+
result_with_line_number = %x(rspec -fd ./examples/errors.feature:4)
|
34
34
|
result_with_line_number.should include('rspec ./examples/errors.feature:4')
|
35
35
|
result_with_line_number.should_not include('rspec ./examples/errors.feature:6')
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turnip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Nicklas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- examples/multiline_string.feature
|
95
95
|
- examples/pending.feature
|
96
96
|
- examples/scenario_outline.feature
|
97
|
+
- examples/scenario_outline_multiline_string_substitution.feature
|
97
98
|
- examples/scenario_outline_table_substitution.feature
|
98
99
|
- examples/simple_feature.feature
|
99
100
|
- examples/step_calling.feature
|
@@ -151,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
152
|
version: '0'
|
152
153
|
requirements: []
|
153
154
|
rubyforge_project: turnip
|
154
|
-
rubygems_version: 2.2.
|
155
|
+
rubygems_version: 2.2.2
|
155
156
|
signing_key:
|
156
157
|
specification_version: 4
|
157
158
|
summary: Gherkin extension for RSpec
|
@@ -164,4 +165,3 @@ test_files:
|
|
164
165
|
- spec/spec_helper.rb
|
165
166
|
- spec/step_definition_spec.rb
|
166
167
|
- spec/table_spec.rb
|
167
|
-
has_rdoc:
|