turnip 3.1.0 → 4.3.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 +4 -4
- data/.github/workflows/test.yml +23 -0
- data/CHANGELOG.md +90 -0
- data/Gemfile +2 -1
- data/README.md +14 -3
- data/examples/gherkin6_syntax.feature +25 -0
- data/examples/scenario_outline_scenario_name_substitution.feature +13 -0
- data/gemfiles/{Gemfile-rspec-3.7.x → Gemfile-rspec-3.10.x} +2 -1
- data/gemfiles/{Gemfile-rspec-3.6.x → Gemfile-rspec-3.9.x} +2 -1
- data/lib/turnip/builder.rb +9 -4
- data/lib/turnip/capybara.rb +2 -1
- data/lib/turnip/node/example.rb +2 -2
- data/lib/turnip/node/feature.rb +17 -37
- data/lib/turnip/node/rule.rb +32 -0
- data/lib/turnip/node/scenario_group_definition.rb +39 -0
- data/lib/turnip/node/scenario_outline.rb +8 -9
- data/lib/turnip/node/step.rb +5 -7
- data/lib/turnip/node/tag.rb +1 -1
- data/lib/turnip/placeholder.rb +5 -0
- data/lib/turnip/rspec.rb +16 -4
- data/lib/turnip/version.rb +1 -1
- data/spec/builder_spec.rb +12 -0
- data/spec/integration_spec.rb +1 -1
- data/spec/placeholder_spec.rb +17 -0
- data/spec/step_definition_spec.rb +2 -0
- data/turnip.gemspec +4 -4
- metadata +30 -12
- data/.travis.yml +0 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8a5b2f61d3782f307c76f247b14f6a814c9b23e756ed5a1ebdb2d5f1261454af
|
|
4
|
+
data.tar.gz: d4d5876e9b484995c2883448e4b302d68ec14094e52dde6d78c5b99232d801a1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8b433ce756fb3c6430c1544e9b94acf5a36ad5de1607ad71824961be0fa313907f2d05f1cb55102d424935a8f311cd99045c0d6bec039edb997f51418fab6b9d
|
|
7
|
+
data.tar.gz: c30109444ccc7b315b98db85a4f24bbd31082289d35a4a6930d8c657adcc278e6bd8d1420082d6061a8f61fe10cae461a8d6e56a6ea0347eb9917d9e110ab1ce
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
on: [push, pull_request]
|
|
3
|
+
jobs:
|
|
4
|
+
test:
|
|
5
|
+
strategy:
|
|
6
|
+
fail-fast: false
|
|
7
|
+
matrix:
|
|
8
|
+
ruby:
|
|
9
|
+
- '2.5'
|
|
10
|
+
- '2.6'
|
|
11
|
+
- '2.7'
|
|
12
|
+
- jruby
|
|
13
|
+
gemfiles:
|
|
14
|
+
- gemfiles/Gemfile-rspec-3.9.x
|
|
15
|
+
- gemfiles/Gemfile-rspec-3.10.x
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v2
|
|
19
|
+
- uses: ruby/setup-ruby@v1
|
|
20
|
+
with:
|
|
21
|
+
ruby-version: ${{ matrix.ruby }}
|
|
22
|
+
- run: bundle install --gemfile ${{ matrix.gemfiles }} --jobs 4 --retry 3
|
|
23
|
+
- run: bundle exec --gemfile ${{ matrix.gemfiles }} rake
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# CHANGE LOG
|
|
2
|
+
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
## [4.3.0] - 2021-05-16
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Support scenario name substitution [[GH-237](https://github.com/jnicklas/turnip/pull/237)]
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Support RSpec 3.9 and 3.10 (drop 3.7 and 3.8) [[GH-238](https://github.com/jnicklas/turnip/pull/238)]
|
|
14
|
+
- Replace TravisCI with GitHub Workflows [[GH-239](https://github.com/jnicklas/turnip/pull/239)]
|
|
15
|
+
|
|
16
|
+
## [4.2.0] - 2020-09-02
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Update gherkin version
|
|
21
|
+
- v11 [[GH-222](https://github.com/jnicklas/turnip/pull/222)]
|
|
22
|
+
- v12 [[GH-224](https://github.com/jnicklas/turnip/pull/224)]
|
|
23
|
+
- v14 [[GH-229](https://github.com/jnicklas/turnip/pull/229)]
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- Test against Ruby 2.7 [[GH-223](https://github.com/jnicklas/turnip/pull/223)]
|
|
28
|
+
- Drop support Ruby 2.3 and 2.4 [[GH-225](https://github.com/jnicklas/turnip/pull/225)]
|
|
29
|
+
- Update travis.yml [[GH-226](https://github.com/jnicklas/turnip/pull/226)]]
|
|
30
|
+
- Setup GitHub Actions [[GH-227](https://github.com/jnicklas/turnip/pull/227)]
|
|
31
|
+
- Suppress deprecation warning in Capybara 3.33.0 [[GH-232](https://github.com/jnicklas/turnip/pull/232)]
|
|
32
|
+
|
|
33
|
+
## [4.1.0] - 2020-03-02
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- Warn when replacing placeholders [[GH-219](https://github.com/jnicklas/turnip/pull/219))
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- Update gherkin version
|
|
42
|
+
- v8 [[GH-217](https://github.com/jnicklas/turnip/pull/217)]
|
|
43
|
+
- v9 [[GH-218](https://github.com/jnicklas/turnip/pull/218)]
|
|
44
|
+
- v10 [[GH-221](https://github.com/jnicklas/turnip/pull/221)]
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- Update README.md [[GH-216](https://github.com/jnicklas/turnip/pull/216)]
|
|
49
|
+
|
|
50
|
+
## [4.0.1] - 2019-04-22
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
- Add `required_ruby_version` [[GH-212](https://github.com/jnicklas/turnip/pull/212)]
|
|
55
|
+
- Add support Ruby 2.6 by upgrading Gherkin version [[GH-214](https://github.com/jnicklas/turnip/pull/214)]
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- Update README.md [[GH-211](https://github.com/jnicklas/turnip/pull/211)]
|
|
60
|
+
- Add homepage url to gemspec [[GH-209](https://github.com/jnicklas/turnip/pull/209)]
|
|
61
|
+
|
|
62
|
+
## [4.0.0] - 2019-02-28
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
- Use Gherkin 6.0 [[GH-206](https://github.com/jnicklas/turnip/pull/206)] [[GH-208](https://github.com/jnicklas/turnip/pull/208)]
|
|
67
|
+
- Support RSpec 3.7 and 3.8 (drop 3.6) [[GH-203](https://github.com/jnicklas/turnip/pull/203)]
|
|
68
|
+
- Drop support Ruby 2.2 [[GH-204](https://github.com/jnicklas/turnip/pull/204)]
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- Test against Ruby 2.6 (fail yet) [[GH-207](https://github.com/jnicklas/turnip/pull/207)]
|
|
73
|
+
|
|
74
|
+
## [3.1.0] - 2018-01-30
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
|
|
78
|
+
- Use Gherkin 5.0 [[GH-200](https://github.com/jnicklas/turnip/pull/200)]
|
|
79
|
+
- Support Ruby 2.5.0 [[GH-201](https://github.com/jnicklas/turnip/pull/201)]
|
|
80
|
+
- Drop support Ruby 2.1 [[GH-191](https://github.com/jnicklas/turnip/pull/191)]
|
|
81
|
+
- Support RSpec 3.7.0 and 3.6.0 [[GH-197](https://github.com/jnicklas/turnip/pull/197)]
|
|
82
|
+
|
|
83
|
+
## Fixed
|
|
84
|
+
|
|
85
|
+
- Add license to gemspec [[GH-193](https://github.com/jnicklas/turnip/pull/193)]
|
|
86
|
+
- Suppress warning [[GH-195](https://github.com/jnicklas/turnip/pull/195)]
|
|
87
|
+
|
|
88
|
+
## [3.0.0] - 2017-04-04
|
|
89
|
+
|
|
90
|
+
TBD (You can see https://github.com/jnicklas/turnip/releases for before this bersion)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://gitter.im/jnicklas/turnip?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+

|
|
6
6
|
[](https://codeclimate.com/github/jnicklas/turnip)
|
|
7
7
|
|
|
8
8
|
Turnip is a [Gherkin](https://github.com/cucumber/cucumber/wiki/Gherkin)
|
|
@@ -48,8 +48,8 @@ Please create a topic branch for every separate change you make.
|
|
|
48
48
|
|
|
49
49
|
### 1. Ruby
|
|
50
50
|
|
|
51
|
-
- Support Ruby 2.
|
|
52
|
-
- Does not support Ruby (or does not work) 2.
|
|
51
|
+
- Support Ruby 2.5 or higher
|
|
52
|
+
- Does not support Ruby (or does not work) 2.4.X or earlier
|
|
53
53
|
|
|
54
54
|
### 2. RSpec
|
|
55
55
|
|
|
@@ -425,6 +425,17 @@ step "there are the following monsters:" do |table|
|
|
|
425
425
|
end
|
|
426
426
|
```
|
|
427
427
|
|
|
428
|
+
or the equivalent:
|
|
429
|
+
|
|
430
|
+
``` ruby
|
|
431
|
+
step "there are the following monsters:" do |table|
|
|
432
|
+
@monsters = {}
|
|
433
|
+
table.rows.each do |(name, hp)|
|
|
434
|
+
@monsters[name] = hp.to_i
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
```
|
|
438
|
+
|
|
428
439
|
## Unimplemented steps
|
|
429
440
|
Turnip mark a scenario as pending when steps in the scenario is not implemented.
|
|
430
441
|
If you sets `raise_error_for_unimplemented_steps` as `true`, turnip will mark a scenario as fail.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Feature: Gherkin 6 syntax
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given there is a monster with 2 hitpoints
|
|
5
|
+
|
|
6
|
+
Scenario: Battle
|
|
7
|
+
When I attack it
|
|
8
|
+
Then the monster should be alive
|
|
9
|
+
When I attack it
|
|
10
|
+
Then it should die
|
|
11
|
+
|
|
12
|
+
Rule: Battle with preemptive attack
|
|
13
|
+
Background:
|
|
14
|
+
Given I attack the monster and do 1 points damage
|
|
15
|
+
|
|
16
|
+
Example: battle
|
|
17
|
+
When I attack it
|
|
18
|
+
Then it should die
|
|
19
|
+
|
|
20
|
+
Rule: Battle with preemptive critical attack
|
|
21
|
+
Background:
|
|
22
|
+
Given I attack the monster and do 2 points damage
|
|
23
|
+
|
|
24
|
+
Example: battle
|
|
25
|
+
Then it should die
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Feature: using scenario outlines
|
|
2
|
+
Scenario Outline: a monster introduced himself as <name>
|
|
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/lib/turnip/builder.rb
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
require "gherkin
|
|
1
|
+
require "gherkin"
|
|
2
2
|
require 'turnip/node/feature'
|
|
3
3
|
|
|
4
4
|
module Turnip
|
|
5
5
|
class Builder
|
|
6
6
|
def self.build(feature_file)
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
messages = Gherkin.from_paths(
|
|
8
|
+
[feature_file],
|
|
9
|
+
include_source: false,
|
|
10
|
+
include_gherkin_document: true,
|
|
11
|
+
include_pickles: false
|
|
12
|
+
)
|
|
13
|
+
result = messages.first&.gherkin_document&.to_hash
|
|
9
14
|
|
|
10
|
-
return nil
|
|
15
|
+
return nil if result.nil? || result[:feature].nil?
|
|
11
16
|
Node::Feature.new(result[:feature])
|
|
12
17
|
end
|
|
13
18
|
end
|
data/lib/turnip/capybara.rb
CHANGED
|
@@ -7,7 +7,8 @@ RSpec.configure do |config|
|
|
|
7
7
|
if self.class.include?(Capybara::DSL) and current_example.metadata[:turnip]
|
|
8
8
|
Capybara.current_driver = Capybara.javascript_driver if current_example.metadata.has_key?(:javascript)
|
|
9
9
|
current_example.metadata.each do |tag, value|
|
|
10
|
-
|
|
10
|
+
has_driver = Capybara::VERSION >= '3.33.0' ? !Capybara.drivers[tag].nil? : Capybara.drivers.has_key?(tag)
|
|
11
|
+
if has_driver
|
|
11
12
|
Capybara.current_driver = tag
|
|
12
13
|
end
|
|
13
14
|
end
|
data/lib/turnip/node/example.rb
CHANGED
|
@@ -42,7 +42,7 @@ module Turnip
|
|
|
42
42
|
# @return [Array]
|
|
43
43
|
#
|
|
44
44
|
def header
|
|
45
|
-
@header ||= @raw[:
|
|
45
|
+
@header ||= @raw[:table_header][:cells].map { |c| c[:value] }
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
#
|
|
@@ -56,7 +56,7 @@ module Turnip
|
|
|
56
56
|
# @return [Array]
|
|
57
57
|
#
|
|
58
58
|
def rows
|
|
59
|
-
@rows ||= @raw[:
|
|
59
|
+
@rows ||= @raw[:table_body].map do |row|
|
|
60
60
|
row[:cells].map { |c| c[:value] }
|
|
61
61
|
end
|
|
62
62
|
end
|
data/lib/turnip/node/feature.rb
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
require 'turnip/node/base'
|
|
2
2
|
require 'turnip/node/tag'
|
|
3
|
-
require 'turnip/node/
|
|
4
|
-
require 'turnip/node/
|
|
5
|
-
require 'turnip/node/background'
|
|
3
|
+
require 'turnip/node/scenario_group_definition'
|
|
4
|
+
require 'turnip/node/rule'
|
|
6
5
|
|
|
7
6
|
module Turnip
|
|
8
7
|
module Node
|
|
@@ -20,55 +19,36 @@ module Turnip
|
|
|
20
19
|
# children: [], # Array of Background, Scenario and Scenario Outline
|
|
21
20
|
# }
|
|
22
21
|
#
|
|
23
|
-
class Feature <
|
|
22
|
+
class Feature < ScenarioGroupDefinition
|
|
24
23
|
include HasTags
|
|
25
24
|
|
|
26
|
-
def name
|
|
27
|
-
@raw[:name]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
25
|
def language
|
|
31
26
|
@raw[:language]
|
|
32
27
|
end
|
|
33
28
|
|
|
34
|
-
def
|
|
35
|
-
@raw[:
|
|
36
|
-
|
|
29
|
+
def children
|
|
30
|
+
@children ||= @raw[:children].map do |child|
|
|
31
|
+
unless child[:background].nil?
|
|
32
|
+
next Background.new(child[:background])
|
|
33
|
+
end
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
unless child[:scenario].nil?
|
|
36
|
+
klass = child.dig(:scenario, :examples).nil? ? Scenario : ScenarioOutline
|
|
37
|
+
next klass.new(child[:scenario])
|
|
38
|
+
end
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
case c[:type]
|
|
45
|
-
when :Background
|
|
46
|
-
Background.new(c)
|
|
47
|
-
when :Scenario
|
|
48
|
-
Scenario.new(c)
|
|
49
|
-
when :ScenarioOutline
|
|
50
|
-
ScenarioOutline.new(c)
|
|
40
|
+
unless child[:rule].nil?
|
|
41
|
+
next Rule.new(child[:rule])
|
|
51
42
|
end
|
|
52
43
|
end.compact
|
|
53
44
|
end
|
|
54
45
|
|
|
55
|
-
def
|
|
56
|
-
@
|
|
57
|
-
c.is_a?(
|
|
46
|
+
def rules
|
|
47
|
+
@rules ||= children.select do |c|
|
|
48
|
+
c.is_a?(Rule)
|
|
58
49
|
end
|
|
59
50
|
end
|
|
60
51
|
|
|
61
|
-
def scenarios
|
|
62
|
-
@scenarios ||= children.map do |c|
|
|
63
|
-
case c
|
|
64
|
-
when Scenario
|
|
65
|
-
c
|
|
66
|
-
when ScenarioOutline
|
|
67
|
-
c.to_scenarios
|
|
68
|
-
end
|
|
69
|
-
end.flatten.compact
|
|
70
|
-
end
|
|
71
|
-
|
|
72
52
|
def metadata_hash
|
|
73
53
|
super.merge(:type => Turnip.type, :turnip => true)
|
|
74
54
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'turnip/node/scenario_group_definition'
|
|
2
|
+
|
|
3
|
+
module Turnip
|
|
4
|
+
module Node
|
|
5
|
+
#
|
|
6
|
+
# @note Rule metadata generated by Gherkin
|
|
7
|
+
#
|
|
8
|
+
# {
|
|
9
|
+
# type: :Rule,
|
|
10
|
+
# location: { line: 10, column: 3 },
|
|
11
|
+
# keyword: 'Rule',
|
|
12
|
+
# name: 'Rule name',
|
|
13
|
+
# description: 'Rule description',
|
|
14
|
+
# children: [] # Array of Background, Scenario and Scenario Outline
|
|
15
|
+
# }
|
|
16
|
+
#
|
|
17
|
+
class Rule < ScenarioGroupDefinition
|
|
18
|
+
def children
|
|
19
|
+
@children ||= @raw[:children].map do |child|
|
|
20
|
+
unless child[:background].nil?
|
|
21
|
+
next Background.new(child[:background])
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
unless child[:scenario].nil?
|
|
25
|
+
klass = child.dig(:scenario, :examples).nil? ? Scenario : ScenarioOutline
|
|
26
|
+
next klass.new(child[:scenario])
|
|
27
|
+
end
|
|
28
|
+
end.compact
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'turnip/node/base'
|
|
2
|
+
require 'turnip/node/scenario'
|
|
3
|
+
require 'turnip/node/scenario_outline'
|
|
4
|
+
require 'turnip/node/background'
|
|
5
|
+
|
|
6
|
+
module Turnip
|
|
7
|
+
module Node
|
|
8
|
+
class ScenarioGroupDefinition < Base
|
|
9
|
+
def name
|
|
10
|
+
@raw[:name]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def keyword
|
|
14
|
+
@raw[:keyword]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def description
|
|
18
|
+
@raw[:description]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def backgrounds
|
|
22
|
+
@backgrounds ||= children.select do |c|
|
|
23
|
+
c.is_a?(Background)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def scenarios
|
|
28
|
+
@scenarios ||= children.map do |c|
|
|
29
|
+
case c
|
|
30
|
+
when Scenario
|
|
31
|
+
c
|
|
32
|
+
when ScenarioOutline
|
|
33
|
+
c.to_scenarios
|
|
34
|
+
end
|
|
35
|
+
end.flatten.compact
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -57,7 +57,7 @@ module Turnip
|
|
|
57
57
|
header = example.header
|
|
58
58
|
|
|
59
59
|
example.rows.map do |row|
|
|
60
|
-
metadata = convert_metadata_to_scenario
|
|
60
|
+
metadata = convert_metadata_to_scenario(header, row)
|
|
61
61
|
|
|
62
62
|
#
|
|
63
63
|
# Replace <placeholder> using Example values
|
|
@@ -65,13 +65,11 @@ module Turnip
|
|
|
65
65
|
metadata[:steps].each do |step|
|
|
66
66
|
step[:text] = substitute(step[:text], header, row)
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
when :
|
|
72
|
-
step[:
|
|
73
|
-
when :DataTable
|
|
74
|
-
step[:argument][:rows].map do |table_row|
|
|
68
|
+
case
|
|
69
|
+
when step[:doc_string]
|
|
70
|
+
step[:doc_string][:content] = substitute(step[:doc_string][:content], header, row)
|
|
71
|
+
when step[:data_table]
|
|
72
|
+
step[:data_table][:rows].map do |table_row|
|
|
75
73
|
table_row[:cells].map do |cell|
|
|
76
74
|
cell[:value] = substitute(cell[:value], header, row)
|
|
77
75
|
end
|
|
@@ -117,10 +115,11 @@ module Turnip
|
|
|
117
115
|
# @todo :keyword is not considered a language (en only)
|
|
118
116
|
# @return [Hash]
|
|
119
117
|
#
|
|
120
|
-
def convert_metadata_to_scenario()
|
|
118
|
+
def convert_metadata_to_scenario(header, row)
|
|
121
119
|
# deep copy
|
|
122
120
|
Marshal.load(Marshal.dump(raw)).tap do |new_raw|
|
|
123
121
|
new_raw.delete(:examples)
|
|
122
|
+
new_raw[:name] = substitute(new_raw[:name], header, row)
|
|
124
123
|
new_raw[:type] = :Scenario
|
|
125
124
|
new_raw[:keyword] = 'Scenario'
|
|
126
125
|
end
|
data/lib/turnip/node/step.rb
CHANGED
|
@@ -31,13 +31,11 @@ module Turnip
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def argument
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
when :
|
|
38
|
-
|
|
39
|
-
when :DataTable
|
|
40
|
-
data_table(@raw[:argument])
|
|
34
|
+
@argument ||= case
|
|
35
|
+
when @raw[:doc_string]
|
|
36
|
+
doc_string(@raw[:doc_string])
|
|
37
|
+
when @raw[:data_table]
|
|
38
|
+
data_table(@raw[:data_table])
|
|
41
39
|
end
|
|
42
40
|
end
|
|
43
41
|
|
data/lib/turnip/node/tag.rb
CHANGED
data/lib/turnip/placeholder.rb
CHANGED
|
@@ -4,6 +4,11 @@ module Turnip
|
|
|
4
4
|
|
|
5
5
|
class << self
|
|
6
6
|
def add(name, &block)
|
|
7
|
+
if placeholders.key?(name)
|
|
8
|
+
location = caller_locations.detect { |l| l.to_s !~ /lib\/turnip\/dsl\.rb/ }
|
|
9
|
+
warn "Placeholder :#{name} was replaced at #{location}."
|
|
10
|
+
end
|
|
11
|
+
|
|
7
12
|
placeholders[name] = Placeholder.new(name, &block)
|
|
8
13
|
end
|
|
9
14
|
|
data/lib/turnip/rspec.rb
CHANGED
|
@@ -70,14 +70,19 @@ module Turnip
|
|
|
70
70
|
|
|
71
71
|
instance_eval <<-EOS, feature_file, feature.line
|
|
72
72
|
context = ::RSpec.describe feature.name, feature.metadata_hash
|
|
73
|
-
|
|
73
|
+
run_scenario_group(context, feature, feature_file)
|
|
74
74
|
EOS
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
private
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
#
|
|
80
|
+
# @param [RSpec::ExampleGroups] context
|
|
81
|
+
# @param [Turnip::Node::Feature|Turnip::Node::Rule] group
|
|
82
|
+
# @param [String] filename
|
|
83
|
+
#
|
|
84
|
+
def run_scenario_group(context, group, filename)
|
|
85
|
+
background_steps = group.backgrounds.map(&:steps).flatten
|
|
81
86
|
|
|
82
87
|
context.before do
|
|
83
88
|
background_steps.each do |step|
|
|
@@ -85,7 +90,7 @@ module Turnip
|
|
|
85
90
|
end
|
|
86
91
|
end
|
|
87
92
|
|
|
88
|
-
|
|
93
|
+
group.scenarios.each do |scenario|
|
|
89
94
|
step_names = (background_steps + scenario.steps).map(&:to_s)
|
|
90
95
|
description = step_names.join(' -> ')
|
|
91
96
|
|
|
@@ -99,6 +104,13 @@ module Turnip
|
|
|
99
104
|
EOS
|
|
100
105
|
end
|
|
101
106
|
end
|
|
107
|
+
|
|
108
|
+
if group.is_a?(Turnip::Node::Feature)
|
|
109
|
+
group.rules.each do |rule|
|
|
110
|
+
rule_context = context.context(rule.name, { turnip: true })
|
|
111
|
+
run_scenario_group(rule_context, rule, filename)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
102
114
|
end
|
|
103
115
|
end
|
|
104
116
|
end
|
data/lib/turnip/version.rb
CHANGED
data/spec/builder_spec.rb
CHANGED
|
@@ -75,6 +75,18 @@ describe Turnip::Builder do
|
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
+
context "with example scenario name in scenario outlines" do
|
|
79
|
+
let(:feature_file) { File.expand_path('../examples/scenario_outline_scenario_name_substitution.feature', File.dirname(__FILE__)) }
|
|
80
|
+
|
|
81
|
+
it "replaces placeholders in scenario name" do
|
|
82
|
+
feature.scenarios.map(&:name).should eq([
|
|
83
|
+
"a monster introduced himself as John",
|
|
84
|
+
'a monster introduced himself as "John Smith"',
|
|
85
|
+
%(a monster introduced himself as "O'Flannahan")
|
|
86
|
+
])
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
78
90
|
context "with example tables in scenario outlines" do
|
|
79
91
|
let(:feature_file) { File.expand_path('../examples/scenario_outline_table_substitution.feature', File.dirname(__FILE__)) }
|
|
80
92
|
|
data/spec/integration_spec.rb
CHANGED
|
@@ -12,7 +12,7 @@ describe 'The CLI', :type => :integration do
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "prints out failures and successes" do
|
|
15
|
-
@result.should include('
|
|
15
|
+
@result.should include('45 examples, 4 failures, 5 pending')
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
it "includes features in backtraces" do
|
data/spec/placeholder_spec.rb
CHANGED
|
@@ -9,6 +9,8 @@ describe Turnip::Placeholder do
|
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
after { Turnip::Placeholder.send(:placeholders).clear }
|
|
13
|
+
|
|
12
14
|
it 'returns a regexp for the given placeholder' do
|
|
13
15
|
resolved = described_class.resolve(:test)
|
|
14
16
|
|
|
@@ -150,4 +152,19 @@ describe Turnip::Placeholder do
|
|
|
150
152
|
end
|
|
151
153
|
end
|
|
152
154
|
end
|
|
155
|
+
|
|
156
|
+
describe 'replacing placeholders' do
|
|
157
|
+
before do
|
|
158
|
+
described_class.add(:test) do
|
|
159
|
+
match(/foo/)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it 'issues a warning' do
|
|
164
|
+
expect(described_class).to receive(:warn).with(/Placeholder :test was replaced/)
|
|
165
|
+
described_class.add(:test) do
|
|
166
|
+
match(/bar/)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
153
170
|
end
|
data/turnip.gemspec
CHANGED
|
@@ -3,24 +3,24 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
|
3
3
|
require "turnip/version"
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
|
+
s.required_ruby_version = ">= 2.3"
|
|
6
7
|
s.name = "turnip"
|
|
7
8
|
s.version = Turnip::VERSION
|
|
8
9
|
s.authors = ["Jonas Nicklas"]
|
|
9
10
|
s.email = ["jonas.nicklas@gmail.com"]
|
|
10
|
-
s.homepage = ""
|
|
11
|
+
s.homepage = "https://github.com/jnicklas/turnip/"
|
|
11
12
|
s.license = "MIT"
|
|
12
13
|
s.summary = %q{Gherkin extension for RSpec}
|
|
13
14
|
s.description = %q{Provides the ability to define steps and run Gherkin files from with RSpec}
|
|
14
15
|
|
|
15
|
-
s.rubyforge_project = "turnip"
|
|
16
|
-
|
|
17
16
|
s.files = `git ls-files`.split("\n")
|
|
18
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
19
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
20
19
|
s.require_paths = ["lib"]
|
|
21
20
|
|
|
22
21
|
s.add_runtime_dependency "rspec", [">=3.0", "<4.0"]
|
|
23
|
-
s.add_runtime_dependency "gherkin", "~>
|
|
22
|
+
s.add_runtime_dependency "cucumber-gherkin", "~> 14.0"
|
|
24
23
|
s.add_development_dependency "rake"
|
|
25
24
|
s.add_development_dependency "pry"
|
|
25
|
+
s.add_development_dependency "pry-byebug"
|
|
26
26
|
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: 3.
|
|
4
|
+
version: 4.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jonas Nicklas
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-05-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|
|
@@ -31,19 +31,19 @@ dependencies:
|
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
32
|
version: '4.0'
|
|
33
33
|
- !ruby/object:Gem::Dependency
|
|
34
|
-
name: gherkin
|
|
34
|
+
name: cucumber-gherkin
|
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
39
|
+
version: '14.0'
|
|
40
40
|
type: :runtime
|
|
41
41
|
prerelease: false
|
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
46
|
+
version: '14.0'
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: rake
|
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -72,6 +72,20 @@ dependencies:
|
|
|
72
72
|
- - ">="
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
74
|
version: '0'
|
|
75
|
+
- !ruby/object:Gem::Dependency
|
|
76
|
+
name: pry-byebug
|
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0'
|
|
82
|
+
type: :development
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0'
|
|
75
89
|
description: Provides the ability to define steps and run Gherkin files from with
|
|
76
90
|
RSpec
|
|
77
91
|
email:
|
|
@@ -80,9 +94,10 @@ executables: []
|
|
|
80
94
|
extensions: []
|
|
81
95
|
extra_rdoc_files: []
|
|
82
96
|
files:
|
|
97
|
+
- ".github/workflows/test.yml"
|
|
83
98
|
- ".gitignore"
|
|
84
99
|
- ".rspec"
|
|
85
|
-
-
|
|
100
|
+
- CHANGELOG.md
|
|
86
101
|
- Gemfile
|
|
87
102
|
- README.md
|
|
88
103
|
- Rakefile
|
|
@@ -91,11 +106,13 @@ files:
|
|
|
91
106
|
- examples/backgrounds.feature
|
|
92
107
|
- examples/blank.feature
|
|
93
108
|
- examples/errors.feature
|
|
109
|
+
- examples/gherkin6_syntax.feature
|
|
94
110
|
- examples/interpolation.feature
|
|
95
111
|
- examples/multiline_string.feature
|
|
96
112
|
- examples/pending.feature
|
|
97
113
|
- examples/scenario_outline.feature
|
|
98
114
|
- examples/scenario_outline_multiline_string_substitution.feature
|
|
115
|
+
- examples/scenario_outline_scenario_name_substitution.feature
|
|
99
116
|
- examples/scenario_outline_table_substitution.feature
|
|
100
117
|
- examples/simple_feature.feature
|
|
101
118
|
- examples/step_calling.feature
|
|
@@ -114,8 +131,8 @@ files:
|
|
|
114
131
|
- examples/tags.feature
|
|
115
132
|
- examples/with_backticks.feature
|
|
116
133
|
- examples/with_comments.feature
|
|
117
|
-
- gemfiles/Gemfile-rspec-3.
|
|
118
|
-
- gemfiles/Gemfile-rspec-3.
|
|
134
|
+
- gemfiles/Gemfile-rspec-3.10.x
|
|
135
|
+
- gemfiles/Gemfile-rspec-3.9.x
|
|
119
136
|
- lib/turnip.rb
|
|
120
137
|
- lib/turnip/builder.rb
|
|
121
138
|
- lib/turnip/capybara.rb
|
|
@@ -127,8 +144,10 @@ files:
|
|
|
127
144
|
- lib/turnip/node/example.rb
|
|
128
145
|
- lib/turnip/node/feature.rb
|
|
129
146
|
- lib/turnip/node/location.rb
|
|
147
|
+
- lib/turnip/node/rule.rb
|
|
130
148
|
- lib/turnip/node/scenario.rb
|
|
131
149
|
- lib/turnip/node/scenario_definition.rb
|
|
150
|
+
- lib/turnip/node/scenario_group_definition.rb
|
|
132
151
|
- lib/turnip/node/scenario_outline.rb
|
|
133
152
|
- lib/turnip/node/step.rb
|
|
134
153
|
- lib/turnip/node/tag.rb
|
|
@@ -146,7 +165,7 @@ files:
|
|
|
146
165
|
- spec/step_definition_spec.rb
|
|
147
166
|
- spec/table_spec.rb
|
|
148
167
|
- turnip.gemspec
|
|
149
|
-
homepage:
|
|
168
|
+
homepage: https://github.com/jnicklas/turnip/
|
|
150
169
|
licenses:
|
|
151
170
|
- MIT
|
|
152
171
|
metadata: {}
|
|
@@ -158,15 +177,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
158
177
|
requirements:
|
|
159
178
|
- - ">="
|
|
160
179
|
- !ruby/object:Gem::Version
|
|
161
|
-
version: '
|
|
180
|
+
version: '2.3'
|
|
162
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
182
|
requirements:
|
|
164
183
|
- - ">="
|
|
165
184
|
- !ruby/object:Gem::Version
|
|
166
185
|
version: '0'
|
|
167
186
|
requirements: []
|
|
168
|
-
|
|
169
|
-
rubygems_version: 2.7.3
|
|
187
|
+
rubygems_version: 3.0.3
|
|
170
188
|
signing_key:
|
|
171
189
|
specification_version: 4
|
|
172
190
|
summary: Gherkin extension for RSpec
|
data/.travis.yml
DELETED