gherkin 2.0.2-java → 2.1.0-java
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.
- data/History.txt +12 -0
- data/LICENSE +1 -1
- data/README.rdoc +2 -2
- data/Rakefile +2 -2
- data/VERSION.yml +2 -2
- data/features/json_formatter.feature +3 -41
- data/features/step_definitions/gherkin_steps.rb +5 -6
- data/features/step_definitions/json_formatter_steps.rb +3 -2
- data/features/step_definitions/json_lexer_steps.rb +5 -5
- data/features/step_definitions/pretty_formatter_steps.rb +9 -13
- data/features/support/env.rb +1 -1
- data/lib/gherkin/formatter/argument.rb +1 -0
- data/lib/gherkin/formatter/filter_formatter.rb +149 -0
- data/lib/gherkin/formatter/json_formatter.rb +35 -45
- data/lib/gherkin/formatter/line_filter.rb +26 -0
- data/lib/gherkin/formatter/model.rb +85 -0
- data/lib/gherkin/formatter/pretty_formatter.rb +36 -39
- data/lib/gherkin/formatter/regexp_filter.rb +17 -0
- data/lib/gherkin/formatter/tag_count_formatter.rb +44 -0
- data/lib/gherkin/i18n.rb +5 -5
- data/lib/gherkin/i18n.yml +13 -0
- data/lib/gherkin/i18n_lexer.rb +2 -2
- data/lib/gherkin/{json_lexer.rb → json_parser.rb} +17 -5
- data/lib/gherkin/{parser → listener}/event.rb +1 -1
- data/lib/gherkin/{parser → listener}/formatter_listener.rb +30 -23
- data/lib/gherkin/native/java.rb +9 -1
- data/lib/gherkin/parser/parser.rb +27 -14
- data/lib/gherkin/rubify.rb +5 -1
- data/lib/gherkin/tag_expression.rb +62 -0
- data/lib/gherkin/tools/files.rb +3 -4
- data/lib/gherkin/tools/reformat.rb +2 -2
- data/lib/gherkin/tools/stats.rb +3 -4
- data/lib/gherkin/tools/stats_listener.rb +1 -1
- data/ragel/lexer.c.rl.erb +2 -3
- data/ragel/lexer.java.rl.erb +1 -2
- data/ragel/lexer.rb.rl.erb +1 -2
- data/spec/gherkin/fixtures/complex_for_filtering.feature +60 -0
- data/spec/gherkin/fixtures/complex_with_tags.feature +61 -0
- data/spec/gherkin/fixtures/hantu_pisang.feature +35 -0
- data/spec/gherkin/formatter/filter_formatter_spec.rb +156 -0
- data/spec/gherkin/formatter/model_spec.rb +15 -0
- data/spec/gherkin/formatter/pretty_formatter_spec.rb +17 -16
- data/spec/gherkin/formatter/tag_count_formatter_spec.rb +31 -0
- data/spec/gherkin/i18n_lexer_spec.rb +3 -3
- data/spec/gherkin/i18n_spec.rb +2 -4
- data/spec/gherkin/{json_lexer_spec.rb → json_parser_spec.rb} +13 -8
- data/spec/gherkin/sexp_recorder.rb +10 -4
- data/spec/gherkin/shared/lexer_group.rb +0 -40
- data/spec/gherkin/shared/py_string_group.rb +0 -1
- data/spec/gherkin/shared/row_group.rb +1 -2
- data/spec/gherkin/tag_expression_spec.rb +137 -0
- data/spec/spec_helper.rb +5 -1
- data/tasks/bench.rake +5 -9
- metadata +29 -24
- data/lib/gherkin/parser/filter_listener.rb +0 -203
- data/lib/gherkin/parser/row.rb +0 -15
- data/lib/gherkin/parser/tag_expression.rb +0 -50
- data/spec/gherkin/parser/filter_listener_spec.rb +0 -397
- data/spec/gherkin/parser/formatter_listener_spec.rb +0 -134
- data/spec/gherkin/parser/parser_spec.rb +0 -50
- data/spec/gherkin/parser/tag_expression_spec.rb +0 -116
data/lib/gherkin/parser/row.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'gherkin/native'
|
2
|
-
|
3
|
-
module Gherkin
|
4
|
-
module Parser
|
5
|
-
class Row
|
6
|
-
native_impl('gherkin')
|
7
|
-
|
8
|
-
attr_reader :cells, :comments, :line
|
9
|
-
|
10
|
-
def initialize(cells, comments, line)
|
11
|
-
@cells, @comments, @line = cells, comments, line
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'gherkin/native'
|
2
|
-
|
3
|
-
module Gherkin
|
4
|
-
module Parser
|
5
|
-
class TagExpression
|
6
|
-
native_impl('gherkin')
|
7
|
-
|
8
|
-
attr_reader :limits
|
9
|
-
|
10
|
-
def initialize(tag_expressions)
|
11
|
-
@ands = []
|
12
|
-
@limits = {}
|
13
|
-
tag_expressions.each do |expr|
|
14
|
-
add(expr.strip.split(/\s*,\s*/))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def empty?
|
19
|
-
@ands.empty?
|
20
|
-
end
|
21
|
-
|
22
|
-
def eval(tags)
|
23
|
-
return true if @ands.flatten.empty?
|
24
|
-
vars = Hash[*tags.map{|tag| [tag, true]}.flatten]
|
25
|
-
!!Kernel.eval(ruby_expression)
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def add(tags)
|
31
|
-
negatives, positives = tags.partition{|tag| tag =~ /^~/}
|
32
|
-
positive_limits = Hash[*positives.map{|positive| tag, limit = positive.split(':'); [tag, limit ? limit.to_i : nil]}.flatten]
|
33
|
-
@limits.merge!(positive_limits)
|
34
|
-
@ands << (negatives + positive_limits.keys)
|
35
|
-
end
|
36
|
-
|
37
|
-
def ruby_expression
|
38
|
-
"(" + @ands.map do |ors|
|
39
|
-
ors.map do |tag|
|
40
|
-
if tag =~ /^~(.*)/
|
41
|
-
"!vars['#{$1}']"
|
42
|
-
else
|
43
|
-
"vars['#{tag}']"
|
44
|
-
end
|
45
|
-
end.join("||")
|
46
|
-
end.join(")&&(") + ")"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,397 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
require 'gherkin/parser/filter_listener'
|
4
|
-
require 'gherkin/parser/formatter_listener'
|
5
|
-
require 'gherkin/formatter/pretty_formatter'
|
6
|
-
require 'stringio'
|
7
|
-
|
8
|
-
module Gherkin
|
9
|
-
module Parser
|
10
|
-
describe FilterListener do
|
11
|
-
|
12
|
-
class LineListener
|
13
|
-
attr_reader :lines
|
14
|
-
|
15
|
-
def location(uri, offset)
|
16
|
-
end
|
17
|
-
|
18
|
-
def method_missing(*sexp_args)
|
19
|
-
@lines ||= []
|
20
|
-
raise "Hmm" if sexp_args == [:eof, []]
|
21
|
-
@lines << sexp_args[-1]
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def verify_filters(expected_lines, filters)
|
26
|
-
line_listener = LineListener.new
|
27
|
-
scan(line_listener, filters)
|
28
|
-
line_listener.lines.should == expected_lines
|
29
|
-
end
|
30
|
-
|
31
|
-
def verify_output(expected_output, filters)
|
32
|
-
io = StringIO.new
|
33
|
-
formatter = Gherkin::Formatter::PrettyFormatter.new(io, true)
|
34
|
-
listener = Gherkin::Parser::FormatterListener.new(formatter)
|
35
|
-
scan(listener, filters)
|
36
|
-
io.string.should == expected_output
|
37
|
-
end
|
38
|
-
|
39
|
-
def scan(listener, filters)
|
40
|
-
filter_listener = Gherkin::Parser::FilterListener.new(listener, filters)
|
41
|
-
parser = Gherkin::Parser::Parser.new(filter_listener, true, "root")
|
42
|
-
lexer = Gherkin::I18nLexer.new(parser, true)
|
43
|
-
lexer.scan(@input, "test.feature", 0)
|
44
|
-
end
|
45
|
-
|
46
|
-
context "Scenario" do
|
47
|
-
before do
|
48
|
-
@input = %{Feature: 1
|
49
|
-
Scenario: 2
|
50
|
-
Given 3
|
51
|
-
|
52
|
-
Scenario: 5
|
53
|
-
Given 6
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should not replay anything if no lines match" do
|
58
|
-
verify_filters([:eof], [90])
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should not replay anything if no names match" do
|
62
|
-
verify_filters([:eof], [/pudding/])
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should replay identically when there is no filter" do
|
66
|
-
verify_filters([1,2,3,5,6,:eof], [])
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should replay identically when line filter is feature line" do
|
70
|
-
verify_filters([1,2,3,5,6,:eof], [1])
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should match scenario line of first scenario" do
|
74
|
-
verify_filters([1,2,3,:eof], [2])
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should match name of first scenario" do
|
78
|
-
verify_filters([1,2,3,:eof], [/2/])
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should match step line of first scenario" do
|
82
|
-
verify_filters([1,2,3,:eof], [3])
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should match step line of second scenario" do
|
86
|
-
verify_filters([1,5,6,:eof], [6])
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should replay identically (except newlines) when the filter matches both scenarios" do
|
90
|
-
verify_filters([1,2,3,5,6,:eof], [3,6])
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
context "Scenario with py_string" do
|
95
|
-
before do
|
96
|
-
@input = %{Feature: 1
|
97
|
-
Scenario: 2
|
98
|
-
Given 3
|
99
|
-
"""
|
100
|
-
5
|
101
|
-
"""
|
102
|
-
|
103
|
-
Scenario: 8
|
104
|
-
Given 9
|
105
|
-
}
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should replay identically when there is no filter" do
|
109
|
-
verify_filters([1,2,3,4,8,9,:eof], {})
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should filter on py_string line" do
|
113
|
-
verify_filters([1,2,3,4,:eof], [4])
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
context "Scenario with Table and Comment and Tag" do
|
118
|
-
before do
|
119
|
-
@input = %{#language:en
|
120
|
-
Feature: 2
|
121
|
-
# 3
|
122
|
-
Scenario: 4
|
123
|
-
Given 5
|
124
|
-
When 6
|
125
|
-
|
126
|
-
@tag8
|
127
|
-
Scenario: 9
|
128
|
-
Given 10
|
129
|
-
When 11
|
130
|
-
| 12 | 12 |
|
131
|
-
| 13 | 13 |
|
132
|
-
}
|
133
|
-
end
|
134
|
-
|
135
|
-
it "should replay identically when there is no filter" do
|
136
|
-
verify_filters([1,2,3,4,5,6,8,9,10,11,12,13,:eof], [])
|
137
|
-
end
|
138
|
-
|
139
|
-
it "should match step line of first scenario" do
|
140
|
-
verify_filters([1,2,3,4,5,6,:eof], [5])
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should match scenario line of second scenario" do
|
144
|
-
verify_filters([1,2,8,9,10,11,12,13,:eof], [9])
|
145
|
-
end
|
146
|
-
|
147
|
-
it "should match tag of second scenario" do
|
148
|
-
verify_filters([1,2,8,9,10,11,12,13,:eof], ['@tag8'])
|
149
|
-
end
|
150
|
-
|
151
|
-
it "should return everything when a line is given in each scenario" do
|
152
|
-
verify_filters([1,2,3,4,5,6,8,9,10,11,12,13,:eof], [6,9])
|
153
|
-
end
|
154
|
-
|
155
|
-
it "should return a scenario when a line is given for its tag" do
|
156
|
-
verify_filters([1,2,8,9,10,11,12,13,:eof], [8])
|
157
|
-
end
|
158
|
-
|
159
|
-
it "should return a scenario when a line is given for its comment" do
|
160
|
-
verify_filters([1,2,3,4,5,6,:eof], [3])
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
context "Scenario with Background and Comment" do
|
165
|
-
before do
|
166
|
-
@input = %{#language:en
|
167
|
-
Feature: 2
|
168
|
-
# 3
|
169
|
-
Background: 4
|
170
|
-
Given 5
|
171
|
-
|
172
|
-
# 7
|
173
|
-
Scenario: 8
|
174
|
-
Given 9
|
175
|
-
When 10
|
176
|
-
|
177
|
-
Scenario: 12
|
178
|
-
Given 13
|
179
|
-
When 14
|
180
|
-
| 15 | 16 |
|
181
|
-
| 15 | 16 |
|
182
|
-
}
|
183
|
-
end
|
184
|
-
|
185
|
-
it "should replay identically when there is no filter" do
|
186
|
-
verify_filters([1,2,3,4,5,7,8,9,10,12,13,14,15,16,:eof], [])
|
187
|
-
end
|
188
|
-
|
189
|
-
it "should not replay any scenarios when filtering on the line of a background step" do
|
190
|
-
verify_filters([1,2,3,4,5,:eof], [5])
|
191
|
-
end
|
192
|
-
|
193
|
-
it "should not replay any scenarios when filtering on the line of the background" do
|
194
|
-
verify_filters([1,2,3,4,5,:eof], [4])
|
195
|
-
end
|
196
|
-
|
197
|
-
it "should replay the background on step line of first scenario" do
|
198
|
-
verify_filters([1,2,3,4,5,7,8,9,10,:eof], [9])
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
context "Scenario Outline" do
|
203
|
-
before do
|
204
|
-
@input = %{Feature: Fname
|
205
|
-
Fdesc
|
206
|
-
@tag3
|
207
|
-
Scenario Outline: 4
|
208
|
-
Given <foo> 5
|
209
|
-
When <bar> 6
|
210
|
-
|
211
|
-
@tag8
|
212
|
-
Examples: 9
|
213
|
-
| foo | bar |
|
214
|
-
| 11 | 11 |
|
215
|
-
| 12 | 12 |
|
216
|
-
| 13 | 13 |
|
217
|
-
| 14 | 14 |
|
218
|
-
| 15 | 15 |
|
219
|
-
|
220
|
-
@tag17
|
221
|
-
Examples: 18
|
222
|
-
| snip | snap |
|
223
|
-
| 20 | 20 |
|
224
|
-
| 21 | 21 |
|
225
|
-
|
226
|
-
Scenario: 23
|
227
|
-
Given 24
|
228
|
-
When 25
|
229
|
-
}
|
230
|
-
end
|
231
|
-
|
232
|
-
it "should match step line of first scenario outline" do
|
233
|
-
verify_filters([1,3,4,5,6,8,9,10,11,12,13,14,15,17,18,19,20,21,:eof], [6])
|
234
|
-
end
|
235
|
-
|
236
|
-
it "should match examples line of second scenario outline" do
|
237
|
-
verify_filters([1,3,4,5,6,17,18,19,20,21,:eof], [18])
|
238
|
-
end
|
239
|
-
|
240
|
-
it "should match examples name of second scenario outline" do
|
241
|
-
verify_filters([1,3,4,5,6,17,18,19,20,21,:eof], [/18/])
|
242
|
-
end
|
243
|
-
|
244
|
-
it "should match header row line of second scenario outline" do
|
245
|
-
verify_filters([1,3,4,5,6,17,18,19,20,21,:eof], [19])
|
246
|
-
end
|
247
|
-
|
248
|
-
it "should match an example row of first scenario outline" do
|
249
|
-
verify_filters([1,3,4,5,6,8,9,10,13,:eof], [13])
|
250
|
-
end
|
251
|
-
|
252
|
-
it "should match an example row of second scenario outline" do
|
253
|
-
verify_filters([1,3,4,5,6,17,18,19,20,:eof], [20])
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should match 2 example rows of first scenario outline" do
|
257
|
-
verify_filters([1,3,4,5,6,8,9,10,12,14,:eof], [12,14])
|
258
|
-
end
|
259
|
-
|
260
|
-
it "should replay itself properly" do
|
261
|
-
filtered = %{Feature: Fname
|
262
|
-
Fdesc
|
263
|
-
|
264
|
-
@tag3
|
265
|
-
Scenario Outline: 4
|
266
|
-
Given <foo> 5
|
267
|
-
When <bar> 6
|
268
|
-
|
269
|
-
@tag8
|
270
|
-
Examples: 9
|
271
|
-
| foo | bar |
|
272
|
-
| 12 | 12 |
|
273
|
-
| 14 | 14 |
|
274
|
-
}
|
275
|
-
|
276
|
-
verify_output(filtered, [12,14])
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
context "Scenarios with tags on both feature and scenarios" do
|
281
|
-
before do
|
282
|
-
# Lines with more than one tag per line will be repeated
|
283
|
-
@input = %{#language:en
|
284
|
-
@a @b
|
285
|
-
Feature: 3
|
286
|
-
@c @d
|
287
|
-
Scenario: 5
|
288
|
-
Given 6
|
289
|
-
|
290
|
-
@c @e
|
291
|
-
Scenario: 9
|
292
|
-
Given 10
|
293
|
-
|
294
|
-
Scenario: 12
|
295
|
-
Given 13
|
296
|
-
}
|
297
|
-
end
|
298
|
-
|
299
|
-
it "should match @d" do
|
300
|
-
verify_filters([1,2,2,3,4,4,5,6,:eof], ['@d'])
|
301
|
-
end
|
302
|
-
|
303
|
-
it "should match everything when feature tag matches" do
|
304
|
-
verify_filters([1,2,2,3,4,4,5,6,8,8,9,10,12,13,:eof], ['@a'])
|
305
|
-
end
|
306
|
-
|
307
|
-
it "should match @a && !@d" do
|
308
|
-
verify_filters([1,2,2,3,8,8,9,10,12,13,:eof], ['@a','~@d'])
|
309
|
-
end
|
310
|
-
|
311
|
-
it "should match @d || @e" do
|
312
|
-
verify_filters([1,2,2,3,4,4,5,6,8,8,9,10,:eof], ['@d,@e'])
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
context "Scenario Outlines with tags on examples" do
|
317
|
-
before do
|
318
|
-
# Lines with more than one tag per line will be repeated
|
319
|
-
@input = %{#language:en
|
320
|
-
@a @b
|
321
|
-
Feature: 3
|
322
|
-
@d
|
323
|
-
Scenario Outline: 5
|
324
|
-
Given 6
|
325
|
-
|
326
|
-
@c @e
|
327
|
-
Examples: 9
|
328
|
-
| foo | bar |
|
329
|
-
| 11 | 11 |
|
330
|
-
|
331
|
-
@d @f
|
332
|
-
Examples: 14
|
333
|
-
| foo | bar |
|
334
|
-
| 16 | 16 |
|
335
|
-
| 17 | 17 |
|
336
|
-
|
337
|
-
Scenario: 19
|
338
|
-
Given 20
|
339
|
-
}
|
340
|
-
end
|
341
|
-
|
342
|
-
it "should match @c" do
|
343
|
-
verify_filters([1,2,2,3,4,5,6,8,8,9,10,11,:eof], ['@c'])
|
344
|
-
end
|
345
|
-
|
346
|
-
it "should match @d" do
|
347
|
-
verify_filters([1,2,2,3,4,5,6,8,8,9,10,11,13,13,14,15,16,17,:eof], ['@d'])
|
348
|
-
end
|
349
|
-
|
350
|
-
it "should match @f" do
|
351
|
-
verify_filters([1,2,2,3,4,5,6,13,13,14,15,16,17,:eof], ['@f'])
|
352
|
-
end
|
353
|
-
|
354
|
-
it "should match @a and not @c" do
|
355
|
-
verify_filters([1,2,2,3,4,5,6,13,13,14,15,16,17,19,20,:eof], ['@a','~@c'])
|
356
|
-
end
|
357
|
-
|
358
|
-
it "should match @c or @d" do
|
359
|
-
verify_filters([1,2,2,3,4,5,6,8,8,9,10,11,13,13,14,15,16,17,:eof], ['@c,@d'])
|
360
|
-
end
|
361
|
-
|
362
|
-
it "should not match @m" do
|
363
|
-
verify_filters([:eof], ['@m'])
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
context "Background with PyString" do
|
368
|
-
before do
|
369
|
-
@input = %{#language:en
|
370
|
-
Feature: 2
|
371
|
-
Background: 3
|
372
|
-
Given 4
|
373
|
-
"""
|
374
|
-
6
|
375
|
-
"""
|
376
|
-
|
377
|
-
Scenario: 9
|
378
|
-
Given 10
|
379
|
-
"""
|
380
|
-
12
|
381
|
-
"""
|
382
|
-
|
383
|
-
Scenario: 15
|
384
|
-
Given 16
|
385
|
-
"""
|
386
|
-
18
|
387
|
-
"""
|
388
|
-
}
|
389
|
-
end
|
390
|
-
|
391
|
-
it "should replay itself properly" do
|
392
|
-
verify_filters([1,2,3,4,5,15,16,17,:eof], [15])
|
393
|
-
end
|
394
|
-
end
|
395
|
-
end
|
396
|
-
end
|
397
|
-
end
|