gherkin 5.0.0 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/gherkin/gherkin-languages.json +50 -4
- data/lib/gherkin/pickles/compiler.rb +3 -0
- metadata +10 -177
- data/.rsync +0 -6
- data/.travis.yml +0 -20
- data/CONTRIBUTING.md +0 -23
- data/Gemfile +0 -2
- data/Makefile +0 -62
- data/Rakefile +0 -24
- data/berp/CommandLine.dll +0 -0
- data/berp/RazorEngine.dll +0 -0
- data/berp/RazorEngine.pdb +0 -0
- data/berp/System.Web.Razor.dll +0 -0
- data/berp/berp.exe +0 -0
- data/berp/berp.pdb +0 -0
- data/bin/gherkin-generate-tokens +0 -13
- data/gherkin-ruby.razor +0 -218
- data/gherkin.berp +0 -37
- data/gherkin.gemspec +0 -27
- data/testdata/bad/inconsistent_cell_count.feature +0 -14
- data/testdata/bad/inconsistent_cell_count.feature.errors.ndjson +0 -2
- data/testdata/bad/invalid_language.feature +0 -6
- data/testdata/bad/invalid_language.feature.errors.ndjson +0 -1
- data/testdata/bad/multiple_parser_errors.feature +0 -9
- data/testdata/bad/multiple_parser_errors.feature.errors.ndjson +0 -2
- data/testdata/bad/not_gherkin.feature +0 -2
- data/testdata/bad/not_gherkin.feature.errors.ndjson +0 -1
- data/testdata/bad/single_parser_error.feature +0 -7
- data/testdata/bad/single_parser_error.feature.errors.ndjson +0 -1
- data/testdata/bad/unexpected_eof.feature +0 -6
- data/testdata/bad/unexpected_eof.feature.errors.ndjson +0 -1
- data/testdata/good/background.feature +0 -8
- data/testdata/good/background.feature.ast.ndjson +0 -1
- data/testdata/good/background.feature.pickles.ndjson +0 -1
- data/testdata/good/background.feature.source.ndjson +0 -1
- data/testdata/good/background.feature.tokens +0 -9
- data/testdata/good/datatables.feature +0 -18
- data/testdata/good/datatables.feature.ast.ndjson +0 -1
- data/testdata/good/datatables.feature.pickles.ndjson +0 -1
- data/testdata/good/datatables.feature.source.ndjson +0 -1
- data/testdata/good/datatables.feature.tokens +0 -19
- data/testdata/good/descriptions.feature +0 -52
- data/testdata/good/descriptions.feature.ast.ndjson +0 -1
- data/testdata/good/descriptions.feature.pickles.ndjson +0 -8
- data/testdata/good/descriptions.feature.source.ndjson +0 -1
- data/testdata/good/descriptions.feature.tokens +0 -53
- data/testdata/good/docstrings.feature +0 -43
- data/testdata/good/docstrings.feature.ast.ndjson +0 -1
- data/testdata/good/docstrings.feature.pickles.ndjson +0 -1
- data/testdata/good/docstrings.feature.source.ndjson +0 -1
- data/testdata/good/docstrings.feature.tokens +0 -44
- data/testdata/good/empty.feature +0 -0
- data/testdata/good/empty.feature.ast.ndjson +0 -1
- data/testdata/good/empty.feature.pickles.ndjson +0 -0
- data/testdata/good/empty.feature.source.ndjson +0 -1
- data/testdata/good/empty.feature.tokens +0 -1
- data/testdata/good/escaped_pipes.feature +0 -11
- data/testdata/good/escaped_pipes.feature.ast.ndjson +0 -1
- data/testdata/good/escaped_pipes.feature.pickles.ndjson +0 -1
- data/testdata/good/escaped_pipes.feature.source.ndjson +0 -1
- data/testdata/good/escaped_pipes.feature.tokens +0 -14
- data/testdata/good/example_token_multiple.feature +0 -8
- data/testdata/good/example_token_multiple.feature.ast.ndjson +0 -1
- data/testdata/good/example_token_multiple.feature.pickles.ndjson +0 -1
- data/testdata/good/example_token_multiple.feature.source.ndjson +0 -1
- data/testdata/good/example_token_multiple.feature.tokens +0 -9
- data/testdata/good/example_tokens_everywhere.feature +0 -14
- data/testdata/good/example_tokens_everywhere.feature.ast.ndjson +0 -1
- data/testdata/good/example_tokens_everywhere.feature.pickles.ndjson +0 -2
- data/testdata/good/example_tokens_everywhere.feature.source.ndjson +0 -1
- data/testdata/good/example_tokens_everywhere.feature.tokens +0 -15
- data/testdata/good/i18n_emoji.feature +0 -5
- data/testdata/good/i18n_emoji.feature.ast.ndjson +0 -1
- data/testdata/good/i18n_emoji.feature.pickles.ndjson +0 -1
- data/testdata/good/i18n_emoji.feature.source.ndjson +0 -1
- data/testdata/good/i18n_emoji.feature.tokens +0 -6
- data/testdata/good/i18n_fr.feature +0 -63
- data/testdata/good/i18n_fr.feature.ast.ndjson +0 -1
- data/testdata/good/i18n_fr.feature.pickles.ndjson +0 -11
- data/testdata/good/i18n_fr.feature.source.ndjson +0 -1
- data/testdata/good/i18n_fr.feature.tokens +0 -64
- data/testdata/good/i18n_no.feature +0 -7
- data/testdata/good/i18n_no.feature.ast.ndjson +0 -1
- data/testdata/good/i18n_no.feature.pickles.ndjson +0 -1
- data/testdata/good/i18n_no.feature.source.ndjson +0 -1
- data/testdata/good/i18n_no.feature.tokens +0 -8
- data/testdata/good/incomplete_background_1.feature +0 -6
- data/testdata/good/incomplete_background_1.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_background_1.feature.pickles.ndjson +0 -1
- data/testdata/good/incomplete_background_1.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_background_1.feature.tokens +0 -7
- data/testdata/good/incomplete_background_2.feature +0 -7
- data/testdata/good/incomplete_background_2.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_background_2.feature.pickles.ndjson +0 -1
- data/testdata/good/incomplete_background_2.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_background_2.feature.tokens +0 -8
- data/testdata/good/incomplete_feature_1.feature +0 -2
- data/testdata/good/incomplete_feature_1.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_feature_1.feature.pickles.ndjson +0 -0
- data/testdata/good/incomplete_feature_1.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_feature_1.feature.tokens +0 -3
- data/testdata/good/incomplete_feature_2.feature +0 -1
- data/testdata/good/incomplete_feature_2.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_feature_2.feature.pickles.ndjson +0 -0
- data/testdata/good/incomplete_feature_2.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_feature_2.feature.tokens +0 -2
- data/testdata/good/incomplete_feature_3.feature +0 -1
- data/testdata/good/incomplete_feature_3.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_feature_3.feature.pickles.ndjson +0 -0
- data/testdata/good/incomplete_feature_3.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_feature_3.feature.tokens +0 -2
- data/testdata/good/incomplete_scenario.feature +0 -6
- data/testdata/good/incomplete_scenario.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_scenario.feature.pickles.ndjson +0 -1
- data/testdata/good/incomplete_scenario.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_scenario.feature.tokens +0 -7
- data/testdata/good/incomplete_scenario_outline.feature +0 -24
- data/testdata/good/incomplete_scenario_outline.feature.ast.ndjson +0 -1
- data/testdata/good/incomplete_scenario_outline.feature.pickles.ndjson +0 -1
- data/testdata/good/incomplete_scenario_outline.feature.source.ndjson +0 -1
- data/testdata/good/incomplete_scenario_outline.feature.tokens +0 -25
- data/testdata/good/language.feature +0 -6
- data/testdata/good/language.feature.ast.ndjson +0 -1
- data/testdata/good/language.feature.pickles.ndjson +0 -1
- data/testdata/good/language.feature.source.ndjson +0 -1
- data/testdata/good/language.feature.tokens +0 -7
- data/testdata/good/minimal.feature +0 -4
- data/testdata/good/minimal.feature.ast.ndjson +0 -1
- data/testdata/good/minimal.feature.pickles.ndjson +0 -1
- data/testdata/good/minimal.feature.source.ndjson +0 -1
- data/testdata/good/minimal.feature.tokens +0 -5
- data/testdata/good/readme_example.feature +0 -18
- data/testdata/good/readme_example.feature.ast.ndjson +0 -1
- data/testdata/good/readme_example.feature.pickles.ndjson +0 -2
- data/testdata/good/readme_example.feature.source.ndjson +0 -1
- data/testdata/good/readme_example.feature.tokens +0 -19
- data/testdata/good/scenario_outline.feature +0 -8
- data/testdata/good/scenario_outline.feature.ast.ndjson +0 -1
- data/testdata/good/scenario_outline.feature.pickles.ndjson +0 -1
- data/testdata/good/scenario_outline.feature.source.ndjson +0 -1
- data/testdata/good/scenario_outline.feature.tokens +0 -9
- data/testdata/good/scenario_outline_no_newline.feature +0 -8
- data/testdata/good/scenario_outline_no_newline.feature.ast.ndjson +0 -1
- data/testdata/good/scenario_outline_no_newline.feature.pickles.ndjson +0 -1
- data/testdata/good/scenario_outline_no_newline.feature.source.ndjson +0 -1
- data/testdata/good/scenario_outline_no_newline.feature.tokens +0 -9
- data/testdata/good/scenario_outlines_with_tags.feature +0 -18
- data/testdata/good/scenario_outlines_with_tags.feature.ast.ndjson +0 -1
- data/testdata/good/scenario_outlines_with_tags.feature.pickles.ndjson +0 -2
- data/testdata/good/scenario_outlines_with_tags.feature.source.ndjson +0 -1
- data/testdata/good/scenario_outlines_with_tags.feature.tokens +0 -19
- data/testdata/good/several_examples.feature +0 -17
- data/testdata/good/several_examples.feature.ast.ndjson +0 -1
- data/testdata/good/several_examples.feature.pickles.ndjson +0 -3
- data/testdata/good/several_examples.feature.source.ndjson +0 -1
- data/testdata/good/several_examples.feature.tokens +0 -18
- data/testdata/good/spaces_in_language.feature +0 -2
- data/testdata/good/spaces_in_language.feature.ast.ndjson +0 -1
- data/testdata/good/spaces_in_language.feature.pickles.ndjson +0 -0
- data/testdata/good/spaces_in_language.feature.source.ndjson +0 -1
- data/testdata/good/spaces_in_language.feature.tokens +0 -3
- data/testdata/good/tagged_feature_with_scenario_outline.feature +0 -10
- data/testdata/good/tagged_feature_with_scenario_outline.feature.ast.ndjson +0 -1
- data/testdata/good/tagged_feature_with_scenario_outline.feature.pickles.ndjson +0 -2
- data/testdata/good/tagged_feature_with_scenario_outline.feature.source.ndjson +0 -1
- data/testdata/good/tagged_feature_with_scenario_outline.feature.tokens +0 -11
- data/testdata/good/tags.feature +0 -25
- data/testdata/good/tags.feature.ast.ndjson +0 -1
- data/testdata/good/tags.feature.pickles.ndjson +0 -3
- data/testdata/good/tags.feature.source.ndjson +0 -1
- data/testdata/good/tags.feature.tokens +0 -26
data/Rakefile
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'rubygems'
|
3
|
-
require 'bundler'
|
4
|
-
Bundler::GemHelper.install_tasks
|
5
|
-
|
6
|
-
$:.unshift File.expand_path("../lib", __FILE__)
|
7
|
-
|
8
|
-
require "rspec/core/rake_task"
|
9
|
-
RSpec::Core::RakeTask.new(:spec) do |t|
|
10
|
-
t.ruby_opts = %w[-r./spec/coverage -w]
|
11
|
-
t.rspec_opts = %w[--color]
|
12
|
-
end
|
13
|
-
|
14
|
-
require_relative 'spec/capture_warnings'
|
15
|
-
include CaptureWarnings
|
16
|
-
namespace :spec do
|
17
|
-
task :warnings do
|
18
|
-
report_warnings do
|
19
|
-
Rake::Task['spec'].invoke
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
task default: ['spec:warnings']
|
data/berp/CommandLine.dll
DELETED
Binary file
|
data/berp/RazorEngine.dll
DELETED
Binary file
|
data/berp/RazorEngine.pdb
DELETED
Binary file
|
data/berp/System.Web.Razor.dll
DELETED
Binary file
|
data/berp/berp.exe
DELETED
Binary file
|
data/berp/berp.pdb
DELETED
Binary file
|
data/bin/gherkin-generate-tokens
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$VERBOSE=nil # Shut up JRuby warnings on Travis
|
3
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),"../lib"))
|
4
|
-
require 'gherkin/parser'
|
5
|
-
require 'gherkin/token_formatter_builder'
|
6
|
-
|
7
|
-
parser = Gherkin::Parser.new(Gherkin::TokenFormatterBuilder.new)
|
8
|
-
files = ARGV
|
9
|
-
files.each do |file|
|
10
|
-
File.open(file, 'r:UTF-8') do |io|
|
11
|
-
print parser.parse(io)
|
12
|
-
end
|
13
|
-
end
|
data/gherkin-ruby.razor
DELETED
@@ -1,218 +0,0 @@
|
|
1
|
-
@using Berp;
|
2
|
-
@helper CallProduction(ProductionRule production)
|
3
|
-
{
|
4
|
-
switch(production.Type)
|
5
|
-
{
|
6
|
-
case ProductionRuleType.Start:
|
7
|
-
@: start_rule(context, :@production.RuleName);
|
8
|
-
break;
|
9
|
-
case ProductionRuleType.End:
|
10
|
-
@: end_rule(context, :@production.RuleName);
|
11
|
-
break;
|
12
|
-
case ProductionRuleType.Process:
|
13
|
-
@: build(context, token);
|
14
|
-
break;
|
15
|
-
}
|
16
|
-
}
|
17
|
-
@helper HandleParserError(IEnumerable<string> expectedTokens, State state)
|
18
|
-
{<text>
|
19
|
-
state_comment = "State: @state.Id - @Raw(state.Comment)"
|
20
|
-
token.detach
|
21
|
-
expected_tokens = ["@Raw(string.Join("\", \"", expectedTokens))"]
|
22
|
-
error = token.eof? ? UnexpectedEOFException.new(token, expected_tokens, state_comment) : UnexpectedTokenException.new(token, expected_tokens, state_comment)
|
23
|
-
raise error if (stop_at_first_error)
|
24
|
-
add_error(context, error)
|
25
|
-
return @state.Id</text>}
|
26
|
-
@helper MatchToken(TokenType tokenType)
|
27
|
-
{<text>match_@(tokenType)(context, token)</text>}
|
28
|
-
# This file is generated. Do not edit! Edit gherkin-ruby.razor instead.
|
29
|
-
require 'gherkin/ast_builder'
|
30
|
-
require 'gherkin/token_matcher'
|
31
|
-
require 'gherkin/token_scanner'
|
32
|
-
require 'gherkin/errors'
|
33
|
-
|
34
|
-
module Gherkin
|
35
|
-
|
36
|
-
RULE_TYPE = [
|
37
|
-
:None,
|
38
|
-
@foreach(var rule in Model.RuleSet.Where(r => !r.TempRule))
|
39
|
-
{<text> :@rule.Name.Replace("#", "_"), # @rule.ToString(true)
|
40
|
-
</text>}
|
41
|
-
]
|
42
|
-
|
43
|
-
class ParserContext
|
44
|
-
attr_reader :token_scanner, :token_matcher, :token_queue, :errors
|
45
|
-
|
46
|
-
def initialize(token_scanner, token_matcher, token_queue, errors)
|
47
|
-
@@token_scanner = token_scanner
|
48
|
-
@@token_matcher = token_matcher
|
49
|
-
@@token_queue = token_queue
|
50
|
-
@@errors = errors
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class @Model.ParserClassName
|
55
|
-
attr_accessor :stop_at_first_error
|
56
|
-
|
57
|
-
def initialize(ast_builder=AstBuilder.new)
|
58
|
-
@@ast_builder = ast_builder
|
59
|
-
end
|
60
|
-
|
61
|
-
def parse(token_scanner, token_matcher=TokenMatcher.new)
|
62
|
-
token_scanner = token_scanner.is_a?(TokenScanner) ? token_scanner : TokenScanner.new(token_scanner)
|
63
|
-
|
64
|
-
@@ast_builder.reset
|
65
|
-
token_matcher.reset
|
66
|
-
context = ParserContext.new(
|
67
|
-
token_scanner,
|
68
|
-
token_matcher,
|
69
|
-
[],
|
70
|
-
[]
|
71
|
-
)
|
72
|
-
|
73
|
-
start_rule(context, :@Model.RuleSet.StartRule.Name);
|
74
|
-
state = 0
|
75
|
-
token = nil
|
76
|
-
begin
|
77
|
-
token = read_token(context)
|
78
|
-
state = match_token(state, token, context)
|
79
|
-
end until(token.eof?)
|
80
|
-
|
81
|
-
end_rule(context, :@Model.RuleSet.StartRule.Name)
|
82
|
-
|
83
|
-
raise CompositeParserException.new(context.errors) if context.errors.any?
|
84
|
-
|
85
|
-
get_result()
|
86
|
-
end
|
87
|
-
|
88
|
-
def build(context, token)
|
89
|
-
handle_ast_error(context) do
|
90
|
-
@@ast_builder.build(token)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def add_error(context, error)
|
95
|
-
context.errors.push(error)
|
96
|
-
raise CompositeParserException, context.errors if context.errors.length > 10
|
97
|
-
end
|
98
|
-
|
99
|
-
def start_rule(context, rule_type)
|
100
|
-
handle_ast_error(context) do
|
101
|
-
@@ast_builder.start_rule(rule_type)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def end_rule(context, rule_type)
|
106
|
-
handle_ast_error(context) do
|
107
|
-
@@ast_builder.end_rule(rule_type)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def get_result()
|
112
|
-
@@ast_builder.get_result
|
113
|
-
end
|
114
|
-
|
115
|
-
def read_token(context)
|
116
|
-
context.token_queue.any? ? context.token_queue.shift : context.token_scanner.read
|
117
|
-
end
|
118
|
-
|
119
|
-
@foreach(var rule in Model.RuleSet.TokenRules)
|
120
|
-
{<text>
|
121
|
-
def match_@(rule.Name.Replace("#", ""))( context, token)
|
122
|
-
@if (rule.Name != "#EOF")
|
123
|
-
{
|
124
|
-
@:return false if token.eof?
|
125
|
-
}
|
126
|
-
return handle_external_error(context, false) do
|
127
|
-
context.token_matcher.match_@(rule.Name.Replace("#", ""))(token)
|
128
|
-
end
|
129
|
-
end</text>
|
130
|
-
}
|
131
|
-
|
132
|
-
def match_token(state, token, context)
|
133
|
-
case state
|
134
|
-
@foreach(var state in Model.States.Values.Where(s => !s.IsEndState))
|
135
|
-
{
|
136
|
-
@:when @state.Id
|
137
|
-
@:match_token_at_@(state.Id)(token, context)
|
138
|
-
}
|
139
|
-
else
|
140
|
-
raise InvalidOperationException, "Unknown state: #{state}"
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
@foreach(var state in Model.States.Values.Where(s => !s.IsEndState))
|
145
|
-
{<text>
|
146
|
-
# @Raw(state.Comment)
|
147
|
-
def match_token_at_@(state.Id)(token, context)
|
148
|
-
@foreach(var transition in state.Transitions)
|
149
|
-
{
|
150
|
-
@:if @MatchToken(transition.TokenType)
|
151
|
-
if (transition.LookAheadHint != null)
|
152
|
-
{
|
153
|
-
@:if lookahead_@(transition.LookAheadHint.Id)(context, token)
|
154
|
-
}
|
155
|
-
foreach(var production in transition.Productions)
|
156
|
-
{
|
157
|
-
@CallProduction(production)
|
158
|
-
}
|
159
|
-
@:return @transition.TargetState
|
160
|
-
if (transition.LookAheadHint != null)
|
161
|
-
{
|
162
|
-
@:end
|
163
|
-
}
|
164
|
-
@:end
|
165
|
-
}
|
166
|
-
@HandleParserError(state.Transitions.Select(t => "#" + t.TokenType.ToString()).Distinct(), state)
|
167
|
-
end</text>
|
168
|
-
}
|
169
|
-
|
170
|
-
@foreach(var lookAheadHint in Model.RuleSet.LookAheadHints)
|
171
|
-
{
|
172
|
-
<text>
|
173
|
-
def lookahead_@(lookAheadHint.Id)(context, currentToken)
|
174
|
-
currentToken.detach
|
175
|
-
token = nil
|
176
|
-
queue = []
|
177
|
-
match = false
|
178
|
-
loop do
|
179
|
-
token = read_token(context)
|
180
|
-
token.detach
|
181
|
-
queue.push(token)
|
182
|
-
|
183
|
-
if (false @foreach(var tokenType in lookAheadHint.ExpectedTokens) {<text>|| @MatchToken(tokenType)</text>})
|
184
|
-
match = true
|
185
|
-
break
|
186
|
-
end
|
187
|
-
|
188
|
-
break unless (false @foreach(var tokenType in lookAheadHint.Skip) {<text>|| @MatchToken(tokenType)</text>})
|
189
|
-
end
|
190
|
-
|
191
|
-
context.token_queue.concat(queue)
|
192
|
-
|
193
|
-
return match
|
194
|
-
end
|
195
|
-
</text>
|
196
|
-
}
|
197
|
-
|
198
|
-
private
|
199
|
-
|
200
|
-
def handle_ast_error(context, &action)
|
201
|
-
handle_external_error(context, true, &action)
|
202
|
-
end
|
203
|
-
|
204
|
-
def handle_external_error(context, default_value, &action)
|
205
|
-
return action.call if stop_at_first_error
|
206
|
-
|
207
|
-
begin
|
208
|
-
return action.call
|
209
|
-
rescue CompositeParserException => e
|
210
|
-
e.errors.each { |error| add_error(context, error) }
|
211
|
-
rescue ParserException => e
|
212
|
-
add_error(context, e)
|
213
|
-
end
|
214
|
-
default_value
|
215
|
-
end
|
216
|
-
|
217
|
-
end
|
218
|
-
end
|
data/gherkin.berp
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
[
|
2
|
-
Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#BackgroundLine,#ScenarioLine,#ScenarioOutlineLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language
|
3
|
-
IgnoredTokens -> #Comment,#Empty
|
4
|
-
ClassName -> Parser
|
5
|
-
Namespace -> Gherkin
|
6
|
-
]
|
7
|
-
|
8
|
-
GherkinDocument! := Feature?
|
9
|
-
Feature! := Feature_Header Background? Scenario_Definition*
|
10
|
-
Feature_Header! := #Language? Tags? #FeatureLine Description_Helper
|
11
|
-
|
12
|
-
Background! := #BackgroundLine Description_Helper Step*
|
13
|
-
|
14
|
-
// we could avoid defining Scenario_Definition, but that would require regular look-aheads, so worse performance
|
15
|
-
Scenario_Definition! := Tags? (Scenario | ScenarioOutline)
|
16
|
-
|
17
|
-
Scenario! := #ScenarioLine Description_Helper Step*
|
18
|
-
|
19
|
-
ScenarioOutline! := #ScenarioOutlineLine Description_Helper Step* Examples_Definition*
|
20
|
-
// after the first "Examples" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario)
|
21
|
-
// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead
|
22
|
-
Examples_Definition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples
|
23
|
-
Examples! := #ExamplesLine Description_Helper Examples_Table?
|
24
|
-
Examples_Table! := #TableRow #TableRow*
|
25
|
-
|
26
|
-
Step! := #StepLine Step_Arg?
|
27
|
-
Step_Arg := (DataTable | DocString)
|
28
|
-
|
29
|
-
DataTable! := #TableRow+
|
30
|
-
DocString! := #DocStringSeparator #Other* #DocStringSeparator
|
31
|
-
|
32
|
-
Tags! := #TagLine+
|
33
|
-
|
34
|
-
// we need to explicitly mention comment, to avoid merging it into the description line's #Other token
|
35
|
-
// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder
|
36
|
-
Description_Helper := #Empty* Description? #Comment*
|
37
|
-
Description! := #Other+
|
data/gherkin.gemspec
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
Gem::Specification.new do |s|
|
3
|
-
s.name = 'gherkin'
|
4
|
-
s.version = '5.0.0'
|
5
|
-
s.authors = ["Gáspár Nagy", "Aslak Hellesøy", "Steve Tooke"]
|
6
|
-
s.description = 'Gherkin parser'
|
7
|
-
s.summary = "gherkin-#{s.version}"
|
8
|
-
s.email = 'cukes@googlegroups.com'
|
9
|
-
s.homepage = "https://github.com/cucumber/gherkin-ruby"
|
10
|
-
s.platform = Gem::Platform::RUBY
|
11
|
-
s.license = "MIT"
|
12
|
-
s.required_ruby_version = ">= 1.9.3"
|
13
|
-
|
14
|
-
s.add_development_dependency 'bundler'
|
15
|
-
s.add_development_dependency 'rake', '~> 10.5'
|
16
|
-
s.add_development_dependency 'rspec', '~> 3.5'
|
17
|
-
|
18
|
-
# For coverage reports
|
19
|
-
s.add_development_dependency 'coveralls'
|
20
|
-
|
21
|
-
s.executables = ["gherkin-ruby"]
|
22
|
-
s.rubygems_version = ">= 1.6.1"
|
23
|
-
s.files = `git ls-files`.split("\n").reject {|path| path =~ /\.gitignore$/ }
|
24
|
-
s.test_files = `git ls-files -- spec/*`.split("\n")
|
25
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
26
|
-
s.require_path = "lib"
|
27
|
-
end
|
@@ -1,2 +0,0 @@
|
|
1
|
-
{"data":"(6:7): inconsistent cell count within the table","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":7,"line":6},"uri":"testdata/bad/inconsistent_cell_count.feature"},"type":"attachment"}
|
2
|
-
{"data":"(14:5): inconsistent cell count within the table","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":5,"line":14},"uri":"testdata/bad/inconsistent_cell_count.feature"},"type":"attachment"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"data":"(1:1): Language not supported: no-such","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":1},"uri":"testdata/bad/invalid_language.feature"},"type":"attachment"}
|
@@ -1,2 +0,0 @@
|
|
1
|
-
{"data":"(2:1): expected: #EOF, #Language, #TagLine, #FeatureLine, #Comment, #Empty, got 'invalid line here'","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":2},"uri":"testdata/bad/multiple_parser_errors.feature"},"type":"attachment"}
|
2
|
-
{"data":"(9:1): expected: #EOF, #TableRow, #DocStringSeparator, #StepLine, #TagLine, #ScenarioLine, #ScenarioOutlineLine, #Comment, #Empty, got 'another invalid line here'","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":9},"uri":"testdata/bad/multiple_parser_errors.feature"},"type":"attachment"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"data":"(1:1): expected: #EOF, #Language, #TagLine, #FeatureLine, #Comment, #Empty, got 'not gherkin'","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":1},"uri":"testdata/bad/not_gherkin.feature"},"type":"attachment"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"data":"(2:1): expected: #EOF, #Language, #TagLine, #FeatureLine, #Comment, #Empty, got 'invalid line here'","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":1,"line":2},"uri":"testdata/bad/single_parser_error.feature"},"type":"attachment"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"data":"(7:0): unexpected end of file, expected: #TagLine, #ScenarioLine, #ScenarioOutlineLine, #Comment, #Empty","media":{"encoding":"utf-8","type":"text/x.cucumber.stacktrace+plain"},"source":{"start":{"column":0,"line":7},"uri":"testdata/bad/unexpected_eof.feature"},"type":"attachment"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"document":{"comments":[],"feature":{"children":[{"keyword":"Background","location":{"column":3,"line":3},"name":"a simple background","steps":[{"keyword":"Given ","location":{"column":5,"line":4},"text":"the minimalism inside a background","type":"Step"}],"type":"Background"},{"keyword":"Scenario","location":{"column":3,"line":7},"name":"minimalistic","steps":[{"keyword":"Given ","location":{"column":5,"line":8},"text":"the minimalism","type":"Step"}],"tags":[],"type":"Scenario"}],"keyword":"Feature","language":"en","location":{"column":1,"line":1},"name":"Background","tags":[],"type":"Feature"},"type":"GherkinDocument"},"type":"gherkin-document","uri":"testdata/good/background.feature"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"pickle":{"language":"en","locations":[{"column":3,"line":7}],"name":"minimalistic","steps":[{"arguments":[],"locations":[{"column":11,"line":4}],"text":"the minimalism inside a background"},{"arguments":[],"locations":[{"column":11,"line":8}],"text":"the minimalism"}],"tags":[]},"type":"pickle","uri":"testdata/good/background.feature"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"data":"Feature: Background\n\n Background: a simple background\n Given the minimalism inside a background\n\n\n Scenario: minimalistic\n Given the minimalism\n","media":{"encoding":"utf-8","type":"text/x.cucumber.gherkin+plain"},"type":"source","uri":"testdata/good/background.feature"}
|
@@ -1,9 +0,0 @@
|
|
1
|
-
(1:1)FeatureLine:Feature/Background/
|
2
|
-
(2:1)Empty://
|
3
|
-
(3:3)BackgroundLine:Background/a simple background/
|
4
|
-
(4:5)StepLine:Given /the minimalism inside a background/
|
5
|
-
(5:1)Empty://
|
6
|
-
(6:1)Empty://
|
7
|
-
(7:3)ScenarioLine:Scenario/minimalistic/
|
8
|
-
(8:5)StepLine:Given /the minimalism/
|
9
|
-
EOF
|
@@ -1,18 +0,0 @@
|
|
1
|
-
Feature: DataTables
|
2
|
-
|
3
|
-
Scenario: minimalistic
|
4
|
-
Given a simple data table
|
5
|
-
| foo | bar |
|
6
|
-
| boz | boo |
|
7
|
-
And a data table with a single cell
|
8
|
-
| foo |
|
9
|
-
And a data table with different fromatting
|
10
|
-
| foo|bar| boz |
|
11
|
-
And a data table with an empty cell
|
12
|
-
|foo||boz|
|
13
|
-
And a data table with comments and newlines inside
|
14
|
-
| foo | bar |
|
15
|
-
|
16
|
-
| boz | boo |
|
17
|
-
# this is a comment
|
18
|
-
| boz2 | boo2 |
|