gherkin-ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use --create 1.9.3@gherkin-ruby
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  env:
2
- - RBXOPT=-X19 JRUBY_OPTS="--1.9"
2
+ - RBXOPT=-X19
3
3
  rvm:
4
4
  - 1.9.2
5
5
  - 1.9.3
6
6
  - ruby-head
7
7
  - rbx-head
8
- - jruby
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ task :regenerate do
15
15
 
16
16
  if has_rex && has_racc
17
17
  `rex lib/gherkin/parser/gherkin.rex -o lib/gherkin/parser/lexer.rb`
18
- `racc lib/gherkin/parser/gherkin.y -o lib/gherkin/parser/parser.rb`
18
+ `racc #{'--debug' if ENV['DEBUG_RACC']} lib/gherkin/parser/gherkin.y -o lib/gherkin/parser/parser.rb`
19
19
  else
20
20
  puts "You need both Rexical and Racc to do that. Install them by doing:"
21
21
  puts
data/Readme.md CHANGED
@@ -1,6 +1,8 @@
1
- # gherkin-ruby
1
+ # gherkin-ruby [![Build Status](https://secure.travis-ci.org/codegram/gherkin-ruby.png)](http://travis-ci.org/codegram/gherkin-ruby) [![Dependency Status](https://gemnasium.com/codegram/gherkin-ruby.png)](http://gemnasium.com/codegram/gherkin-ruby)
2
2
  Gherkin-ruby is a pure Ruby implementation of a [Gherkin](http://github.com/cucumber/gherkin) parser.
3
3
 
4
+ Tested with MRI 1.9.2, 1.9.3, ruby-head and Rubinius head.
5
+
4
6
  ## Why this one over the official, fast, Ragel-based Gherkin parser?
5
7
 
6
8
  * Less than 200 LOC.
data/gherkin-ruby.gemspec CHANGED
@@ -7,15 +7,15 @@ Gem::Specification.new do |s|
7
7
  s.version = Gherkin::VERSION
8
8
  s.authors = ["Marc Divins", "Josep M. Bach"]
9
9
  s.email = ["marcdivc@gmail.com", "josep.m.bach@gmail.com"]
10
- s.homepage = "http://github.com/codegram/gherkin"
11
- s.summary = %q{Gherkin-ruby is a Gherkin parser in pure Ruby using Parslet}
12
- s.description = %q{Gherkin-ruby is a Gherkin parser in pure Ruby using Parslet}
10
+ s.homepage = "http://github.com/codegram/gherkin-ruby"
11
+ s.summary = %q{Gherkin-ruby is a Gherkin parser in pure Ruby using Rexical and Racc}
12
+ s.description = %q{Gherkin-ruby is a Gherkin parser in pure Ruby using Rexical and Racc}
13
13
 
14
14
  s.rubyforge_project = "gherkin-ruby"
15
15
 
16
16
  s.add_runtime_dependency 'rexical'
17
- s.add_runtime_dependency 'racc'
18
17
  s.add_development_dependency 'minitest'
18
+ s.add_development_dependency 'racc'
19
19
 
20
20
  s.files = `git ls-files`.split("\n")
21
21
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
data/lib/gherkin/ast.rb CHANGED
@@ -14,14 +14,15 @@ module Gherkin
14
14
  end
15
15
 
16
16
  class Feature < Node
17
- attr_reader :name, :background, :scenarios
18
- attr_writer :background, :scenarios
17
+ attr_reader :name, :background, :scenarios, :tags
18
+ attr_writer :background, :scenarios, :tags
19
19
 
20
20
  include Enumerable
21
21
 
22
- def initialize(name, scenarios=[], background=nil)
22
+ def initialize(name, scenarios=[], tags=[], background=nil)
23
23
  @name = name
24
24
  @background = background
25
+ @tags = tags
25
26
  @scenarios = scenarios
26
27
  end
27
28
 
@@ -19,7 +19,7 @@ rule
19
19
  Scenario: { [:SCENARIO, text[0..-2]] }
20
20
 
21
21
  # Tags
22
- @\w+ { [:TAG, text[1..-1]] }
22
+ @(\w|-)+ { [:TAG, text[1..-1]] }
23
23
 
24
24
  # Step keywords
25
25
  Given { [:GIVEN, text] }
@@ -16,6 +16,9 @@ rule
16
16
  |
17
17
  Feature
18
18
  Scenarios { result = val[0]; result.scenarios = val[1] }
19
+ | FeatureTags Feature { result = val[1]; result.tags = val[0] }
20
+ | FeatureTags Feature
21
+ Scenarios { result = val[1]; result.scenarios = val[2]; result.tags = val[0] }
19
22
  ;
20
23
 
21
24
  Newline:
@@ -23,6 +26,10 @@ rule
23
26
  | Newline NEWLINE
24
27
  ;
25
28
 
29
+ FeatureTags:
30
+ Tags { result = val[0] }
31
+ | Newline Tags { result = val[1] }
32
+
26
33
  Feature:
27
34
  FeatureHeader { result = val[0] }
28
35
  | FeatureHeader
@@ -56,8 +63,9 @@ rule
56
63
  ;
57
64
 
58
65
  Steps:
59
- Step Newline { result = [val[0]] }
60
- | Steps Step Newline { result = val[0] << val[1] }
66
+ Step { result = [val[0]] }
67
+ | Step Newline { result = [val[0]] }
68
+ | Step Newline Steps { val[2].unshift(val[0]); result = val[2] }
61
69
  ;
62
70
 
63
71
  Step:
@@ -71,7 +79,6 @@ rule
71
79
  Scenarios:
72
80
  Scenario { result = [val[0]] }
73
81
  | Scenarios Scenario { result = val[0] << val[1] }
74
- | Scenarios Newline Scenario { result = val[0] << val[2] }
75
82
  ;
76
83
 
77
84
  Scenario:
@@ -96,5 +103,6 @@ end
96
103
  ---- inner
97
104
 
98
105
  def parse(input)
106
+ @yydebug = true if ENV['DEBUG_RACC']
99
107
  scan_str(input)
100
108
  end
@@ -77,7 +77,7 @@ class Gherkin::Parser < Racc::Parser
77
77
  when (text = @ss.scan(/Scenario:/))
78
78
  action { [:SCENARIO, text[0..-2]] }
79
79
 
80
- when (text = @ss.scan(/@\w+/))
80
+ when (text = @ss.scan(/@(\w|-)+/))
81
81
  action { [:TAG, text[1..-1]] }
82
82
 
83
83
  when (text = @ss.scan(/Given/))
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.4.7
3
+ # This file is automatically generated by Racc 1.4.8
4
4
  # from Racc grammer file "".
5
5
  #
6
6
 
@@ -12,108 +12,113 @@ require 'racc/parser.rb'
12
12
  module Gherkin
13
13
  class Parser < Racc::Parser
14
14
 
15
- module_eval(<<'...end gherkin.y/module_eval...', 'gherkin.y', 97)
15
+ module_eval(<<'...end gherkin.y/module_eval...', 'gherkin.y', 104)
16
16
 
17
17
  def parse(input)
18
+ @yydebug = true if ENV['DEBUG_RACC']
18
19
  scan_str(input)
19
20
  end
20
21
  ...end gherkin.y/module_eval...
21
22
  ##### State transition tables begin ###
22
23
 
23
24
  racc_action_table = [
24
- 14, 3, 14, 15, 14, 26, 14, 11, 13, 3,
25
- 38, 31, 32, 33, 34, 35, 14, 14, 11, 13,
26
- 41, 31, 32, 33, 34, 35, 31, 32, 33, 34,
27
- 35, 31, 32, 33, 34, 35, 31, 32, 33, 34,
28
- 35, 3, 3, 7, 11, 13, 31, 32, 33, 34,
29
- 35, 3, 3, 3, 18, 3, 44, 14, 45, 20,
30
- 21, 48, 3, 14, 3, 14, 27, 3, 14, 14,
31
- 8, 24 ]
25
+ 18, 18, 20, 4, 26, 10, 18, 21, 14, 10,
26
+ 43, 36, 37, 38, 39, 40, 18, 18, 14, 10,
27
+ 45, 36, 37, 38, 39, 40, 18, 14, 10, 4,
28
+ 9, 36, 37, 38, 39, 40, 36, 37, 38, 39,
29
+ 40, 4, 9, 14, 10, 10, 18, 20, 32, 24,
30
+ 21, 4, 4, 29, 21, 4, 47, 18, 48, 4,
31
+ 27, 51, 11, 4, 18, 4, 18, 4 ]
32
32
 
33
33
  racc_action_check = [
34
- 19, 12, 4, 4, 22, 12, 51, 22, 22, 38,
35
- 19, 51, 51, 51, 51, 51, 40, 25, 2, 2,
36
- 25, 40, 40, 40, 40, 40, 47, 47, 47, 47,
37
- 47, 52, 52, 52, 52, 52, 17, 17, 17, 17,
38
- 17, 9, 0, 0, 9, 9, 28, 28, 28, 28,
39
- 28, 6, 24, 18, 5, 29, 30, 36, 37, 7,
40
- 8, 41, 42, 43, 45, 46, 15, 48, 49, 50,
41
- 1, 11 ]
34
+ 25, 5, 5, 15, 9, 5, 54, 15, 31, 31,
35
+ 25, 54, 54, 54, 54, 54, 44, 30, 12, 12,
36
+ 30, 44, 44, 44, 44, 44, 46, 2, 2, 3,
37
+ 3, 46, 46, 46, 46, 46, 23, 23, 23, 23,
38
+ 23, 0, 0, 16, 16, 0, 17, 17, 20, 7,
39
+ 6, 8, 29, 14, 19, 34, 35, 41, 42, 43,
40
+ 11, 45, 1, 48, 49, 51, 53, 24 ]
42
41
 
43
42
  racc_action_pointer = [
44
- 40, 70, 13, nil, 0, 50, 49, 47, 60, 39,
45
- nil, 59, -1, nil, nil, 54, nil, 29, 51, -2,
46
- nil, nil, 2, nil, 50, 15, nil, nil, 39, 53,
47
- 44, nil, nil, nil, nil, nil, 55, 46, 7, nil,
48
- 14, 49, 60, 61, nil, 62, 63, 19, 65, 66,
49
- 67, 4, 24 ]
43
+ 39, 62, 22, 27, nil, -1, 44, 45, 49, -8,
44
+ nil, 60, 13, nil, 41, 1, 38, 44, nil, 48,
45
+ 36, nil, nil, 29, 65, -2, nil, nil, nil, 50,
46
+ 15, 3, nil, nil, 53, 44, nil, nil, nil, nil,
47
+ nil, 55, 46, 57, 14, 49, 24, nil, 61, 62,
48
+ nil, 63, nil, 64, 4, nil ]
50
49
 
51
50
  racc_action_default = [
52
- -31, -31, -1, -3, -31, -5, -7, -31, -31, -2,
53
- -24, -31, -31, -29, -4, -31, -6, -31, -31, -8,
54
- -10, 53, -31, -25, -31, -31, -30, -11, -14, -31,
55
- -31, -19, -20, -21, -22, -23, -15, -9, -31, -26,
56
- -31, -31, -31, -16, -18, -31, -12, -27, -31, -17,
57
- -13, -31, -28 ]
51
+ -35, -35, -1, -35, -5, -35, -7, -9, -11, -35,
52
+ -33, -35, -2, -29, -35, -35, -3, -35, -6, -8,
53
+ -35, -34, -10, -35, -35, -12, -14, 56, -30, -35,
54
+ -35, -4, -15, -18, -20, -35, -24, -25, -26, -27,
55
+ -28, -19, -13, -35, -35, -35, -21, -23, -35, -16,
56
+ -31, -35, -22, -17, -35, -32 ]
58
57
 
59
58
  racc_goto_table = [
60
- 4, 10, 28, 42, 6, 16, 19, 5, 23, 22,
61
- 37, 17, 25, 9, 2, 1, nil, nil, 36, nil,
62
- nil, 39, 42, nil, 40, 47, nil, 42, nil, 43,
63
- nil, nil, nil, nil, nil, nil, 52, nil, 46, nil,
64
- nil, nil, 49, nil, nil, 50, nil, nil, 51 ]
59
+ 5, 28, 33, 17, 12, 6, 2, 23, 25, 16,
60
+ 19, 42, 22, 3, 1, 30, nil, nil, 31, nil,
61
+ 28, nil, nil, 50, 41, 52, nil, nil, nil, 44,
62
+ nil, nil, nil, 55, 46, nil, nil, nil, nil, nil,
63
+ nil, nil, nil, 49, nil, nil, nil, nil, 53, nil,
64
+ nil, 54 ]
65
65
 
66
66
  racc_goto_check = [
67
- 4, 13, 10, 11, 7, 6, 4, 5, 13, 4,
68
- 8, 9, 4, 3, 2, 1, nil, nil, 4, nil,
69
- nil, 13, 11, nil, 4, 10, nil, 11, nil, 4,
70
- nil, nil, nil, nil, nil, nil, 10, nil, 4, nil,
71
- nil, nil, 4, nil, nil, 4, nil, nil, 4 ]
67
+ 5, 15, 12, 5, 3, 6, 2, 11, 5, 2,
68
+ 6, 10, 8, 4, 1, 5, nil, nil, 3, nil,
69
+ 15, nil, nil, 12, 5, 12, nil, nil, nil, 5,
70
+ nil, nil, nil, 12, 5, nil, nil, nil, nil, nil,
71
+ nil, nil, nil, 5, nil, nil, nil, nil, 5, nil,
72
+ nil, 5 ]
72
73
 
73
74
  racc_goto_pointer = [
74
- nil, 15, 14, 11, 0, 7, 0, 4, -9, 6,
75
- -15, -25, nil, -1, nil ]
75
+ nil, 14, 6, 2, 13, 0, 5, nil, 5, nil,
76
+ -14, 0, -21, nil, nil, -11 ]
76
77
 
77
78
  racc_goto_default = [
78
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
79
- nil, 29, 30, nil, 12 ]
79
+ nil, nil, nil, nil, nil, nil, 15, 7, nil, 8,
80
+ nil, nil, nil, 34, 35, 13 ]
80
81
 
81
82
  racc_reduce_table = [
82
83
  0, 0, :racc_error,
83
84
  1, 14, :_reduce_1,
84
85
  2, 14, :_reduce_2,
85
- 1, 17, :_reduce_none,
86
- 2, 17, :_reduce_none,
87
- 1, 15, :_reduce_5,
88
- 2, 15, :_reduce_6,
89
- 1, 18, :_reduce_7,
90
- 2, 18, :_reduce_8,
91
- 3, 18, :_reduce_9,
92
- 2, 20, :_reduce_10,
93
- 3, 20, :_reduce_11,
94
- 2, 21, :_reduce_none,
95
- 3, 21, :_reduce_none,
96
- 2, 19, :_reduce_14,
97
- 2, 22, :_reduce_15,
98
- 2, 23, :_reduce_16,
99
- 3, 23, :_reduce_17,
100
- 2, 24, :_reduce_18,
101
- 1, 25, :_reduce_none,
102
- 1, 25, :_reduce_none,
103
- 1, 25, :_reduce_none,
104
- 1, 25, :_reduce_none,
105
- 1, 25, :_reduce_none,
106
- 1, 16, :_reduce_24,
107
- 2, 16, :_reduce_25,
108
- 3, 16, :_reduce_26,
109
- 4, 26, :_reduce_27,
110
- 6, 26, :_reduce_28,
111
- 1, 27, :_reduce_29,
112
- 2, 27, :_reduce_30 ]
113
-
114
- racc_reduce_n = 31
115
-
116
- racc_shift_n = 53
86
+ 2, 14, :_reduce_3,
87
+ 3, 14, :_reduce_4,
88
+ 1, 18, :_reduce_none,
89
+ 2, 18, :_reduce_none,
90
+ 1, 17, :_reduce_7,
91
+ 2, 17, :_reduce_8,
92
+ 1, 15, :_reduce_9,
93
+ 2, 15, :_reduce_10,
94
+ 1, 20, :_reduce_11,
95
+ 2, 20, :_reduce_12,
96
+ 3, 20, :_reduce_13,
97
+ 2, 22, :_reduce_14,
98
+ 3, 22, :_reduce_15,
99
+ 2, 23, :_reduce_none,
100
+ 3, 23, :_reduce_none,
101
+ 2, 21, :_reduce_18,
102
+ 2, 24, :_reduce_19,
103
+ 1, 25, :_reduce_20,
104
+ 2, 25, :_reduce_21,
105
+ 3, 25, :_reduce_22,
106
+ 2, 26, :_reduce_23,
107
+ 1, 27, :_reduce_none,
108
+ 1, 27, :_reduce_none,
109
+ 1, 27, :_reduce_none,
110
+ 1, 27, :_reduce_none,
111
+ 1, 27, :_reduce_none,
112
+ 1, 16, :_reduce_29,
113
+ 2, 16, :_reduce_30,
114
+ 4, 28, :_reduce_31,
115
+ 6, 28, :_reduce_32,
116
+ 1, 19, :_reduce_33,
117
+ 2, 19, :_reduce_34 ]
118
+
119
+ racc_reduce_n = 35
120
+
121
+ racc_shift_n = 56
117
122
 
118
123
  racc_token_table = {
119
124
  false => 0,
@@ -168,7 +173,9 @@ Racc_token_to_s_table = [
168
173
  "Root",
169
174
  "Feature",
170
175
  "Scenarios",
176
+ "FeatureTags",
171
177
  "Newline",
178
+ "Tags",
172
179
  "FeatureHeader",
173
180
  "Background",
174
181
  "FeatureName",
@@ -177,8 +184,7 @@ Racc_token_to_s_table = [
177
184
  "Steps",
178
185
  "Step",
179
186
  "Keyword",
180
- "Scenario",
181
- "Tags" ]
187
+ "Scenario" ]
182
188
 
183
189
  Racc_debug_parser = false
184
190
 
@@ -200,152 +206,180 @@ module_eval(<<'.,.,', 'gherkin.y', 17)
200
206
  end
201
207
  .,.,
202
208
 
203
- # reduce 3 omitted
209
+ module_eval(<<'.,.,', 'gherkin.y', 18)
210
+ def _reduce_3(val, _values, result)
211
+ result = val[1]; result.tags = val[0]
212
+ result
213
+ end
214
+ .,.,
215
+
216
+ module_eval(<<'.,.,', 'gherkin.y', 20)
217
+ def _reduce_4(val, _values, result)
218
+ result = val[1]; result.scenarios = val[2]; result.tags = val[0]
219
+ result
220
+ end
221
+ .,.,
222
+
223
+ # reduce 5 omitted
224
+
225
+ # reduce 6 omitted
226
+
227
+ module_eval(<<'.,.,', 'gherkin.y', 29)
228
+ def _reduce_7(val, _values, result)
229
+ result = val[0]
230
+ result
231
+ end
232
+ .,.,
204
233
 
205
- # reduce 4 omitted
234
+ module_eval(<<'.,.,', 'gherkin.y', 30)
235
+ def _reduce_8(val, _values, result)
236
+ result = val[1]
237
+ result
238
+ end
239
+ .,.,
206
240
 
207
- module_eval(<<'.,.,', 'gherkin.y', 26)
208
- def _reduce_5(val, _values, result)
241
+ module_eval(<<'.,.,', 'gherkin.y', 33)
242
+ def _reduce_9(val, _values, result)
209
243
  result = val[0]
210
244
  result
211
245
  end
212
246
  .,.,
213
247
 
214
- module_eval(<<'.,.,', 'gherkin.y', 28)
215
- def _reduce_6(val, _values, result)
248
+ module_eval(<<'.,.,', 'gherkin.y', 35)
249
+ def _reduce_10(val, _values, result)
216
250
  result = val[0]; result.background = val[1]
217
251
  result
218
252
  end
219
253
  .,.,
220
254
 
221
- module_eval(<<'.,.,', 'gherkin.y', 32)
222
- def _reduce_7(val, _values, result)
255
+ module_eval(<<'.,.,', 'gherkin.y', 39)
256
+ def _reduce_11(val, _values, result)
223
257
  result = val[0]
224
258
  result
225
259
  end
226
260
  .,.,
227
261
 
228
- module_eval(<<'.,.,', 'gherkin.y', 33)
229
- def _reduce_8(val, _values, result)
262
+ module_eval(<<'.,.,', 'gherkin.y', 40)
263
+ def _reduce_12(val, _values, result)
230
264
  result = val[0]
231
265
  result
232
266
  end
233
267
  .,.,
234
268
 
235
- module_eval(<<'.,.,', 'gherkin.y', 35)
236
- def _reduce_9(val, _values, result)
269
+ module_eval(<<'.,.,', 'gherkin.y', 42)
270
+ def _reduce_13(val, _values, result)
237
271
  result = val[0]
238
272
  result
239
273
  end
240
274
  .,.,
241
275
 
242
- module_eval(<<'.,.,', 'gherkin.y', 39)
243
- def _reduce_10(val, _values, result)
276
+ module_eval(<<'.,.,', 'gherkin.y', 46)
277
+ def _reduce_14(val, _values, result)
244
278
  result = AST::Feature.new(val[1]); result.pos(filename, lineno)
245
279
  result
246
280
  end
247
281
  .,.,
248
282
 
249
- module_eval(<<'.,.,', 'gherkin.y', 40)
250
- def _reduce_11(val, _values, result)
283
+ module_eval(<<'.,.,', 'gherkin.y', 47)
284
+ def _reduce_15(val, _values, result)
251
285
  result = AST::Feature.new(val[2]); result.pos(filename, lineno)
252
286
  result
253
287
  end
254
288
  .,.,
255
289
 
256
- # reduce 12 omitted
290
+ # reduce 16 omitted
257
291
 
258
- # reduce 13 omitted
292
+ # reduce 17 omitted
259
293
 
260
- module_eval(<<'.,.,', 'gherkin.y', 50)
261
- def _reduce_14(val, _values, result)
294
+ module_eval(<<'.,.,', 'gherkin.y', 57)
295
+ def _reduce_18(val, _values, result)
262
296
  result = val[0]; result.steps = val[1]
263
297
  result
264
298
  end
265
299
  .,.,
266
300
 
267
- module_eval(<<'.,.,', 'gherkin.y', 54)
268
- def _reduce_15(val, _values, result)
301
+ module_eval(<<'.,.,', 'gherkin.y', 61)
302
+ def _reduce_19(val, _values, result)
269
303
  result = AST::Background.new; result.pos(filename, lineno)
270
304
  result
271
305
  end
272
306
  .,.,
273
307
 
274
- module_eval(<<'.,.,', 'gherkin.y', 58)
275
- def _reduce_16(val, _values, result)
308
+ module_eval(<<'.,.,', 'gherkin.y', 65)
309
+ def _reduce_20(val, _values, result)
276
310
  result = [val[0]]
277
311
  result
278
312
  end
279
313
  .,.,
280
314
 
281
- module_eval(<<'.,.,', 'gherkin.y', 59)
282
- def _reduce_17(val, _values, result)
283
- result = val[0] << val[1]
315
+ module_eval(<<'.,.,', 'gherkin.y', 66)
316
+ def _reduce_21(val, _values, result)
317
+ result = [val[0]]
284
318
  result
285
319
  end
286
320
  .,.,
287
321
 
288
- module_eval(<<'.,.,', 'gherkin.y', 63)
289
- def _reduce_18(val, _values, result)
322
+ module_eval(<<'.,.,', 'gherkin.y', 67)
323
+ def _reduce_22(val, _values, result)
324
+ val[2].unshift(val[0]); result = val[2]
325
+ result
326
+ end
327
+ .,.,
328
+
329
+ module_eval(<<'.,.,', 'gherkin.y', 71)
330
+ def _reduce_23(val, _values, result)
290
331
  result = AST::Step.new(val[1], val[0]); result.pos(filename, lineno)
291
332
  result
292
333
  end
293
334
  .,.,
294
335
 
295
- # reduce 19 omitted
336
+ # reduce 24 omitted
296
337
 
297
- # reduce 20 omitted
338
+ # reduce 25 omitted
298
339
 
299
- # reduce 21 omitted
340
+ # reduce 26 omitted
300
341
 
301
- # reduce 22 omitted
342
+ # reduce 27 omitted
302
343
 
303
- # reduce 23 omitted
344
+ # reduce 28 omitted
304
345
 
305
- module_eval(<<'.,.,', 'gherkin.y', 71)
306
- def _reduce_24(val, _values, result)
346
+ module_eval(<<'.,.,', 'gherkin.y', 79)
347
+ def _reduce_29(val, _values, result)
307
348
  result = [val[0]]
308
349
  result
309
350
  end
310
351
  .,.,
311
352
 
312
- module_eval(<<'.,.,', 'gherkin.y', 72)
313
- def _reduce_25(val, _values, result)
353
+ module_eval(<<'.,.,', 'gherkin.y', 80)
354
+ def _reduce_30(val, _values, result)
314
355
  result = val[0] << val[1]
315
356
  result
316
357
  end
317
358
  .,.,
318
359
 
319
- module_eval(<<'.,.,', 'gherkin.y', 73)
320
- def _reduce_26(val, _values, result)
321
- result = val[0] << val[2]
322
- result
323
- end
324
- .,.,
325
-
326
- module_eval(<<'.,.,', 'gherkin.y', 78)
327
- def _reduce_27(val, _values, result)
360
+ module_eval(<<'.,.,', 'gherkin.y', 85)
361
+ def _reduce_31(val, _values, result)
328
362
  result = AST::Scenario.new(val[1], val[3]); result.pos(filename, lineno - 1)
329
363
  result
330
364
  end
331
365
  .,.,
332
366
 
333
- module_eval(<<'.,.,', 'gherkin.y', 81)
334
- def _reduce_28(val, _values, result)
367
+ module_eval(<<'.,.,', 'gherkin.y', 88)
368
+ def _reduce_32(val, _values, result)
335
369
  result = AST::Scenario.new(val[3], val[5], val[0]); result.pos(filename, lineno - 2)
336
370
  result
337
371
  end
338
372
  .,.,
339
373
 
340
- module_eval(<<'.,.,', 'gherkin.y', 85)
341
- def _reduce_29(val, _values, result)
374
+ module_eval(<<'.,.,', 'gherkin.y', 92)
375
+ def _reduce_33(val, _values, result)
342
376
  result = [AST::Tag.new(val[0])]
343
377
  result
344
378
  end
345
379
  .,.,
346
380
 
347
- module_eval(<<'.,.,', 'gherkin.y', 86)
348
- def _reduce_30(val, _values, result)
381
+ module_eval(<<'.,.,', 'gherkin.y', 93)
382
+ def _reduce_34(val, _values, result)
349
383
  result = val[0] << AST::Tag.new(val[1])
350
384
  result
351
385
  end
@@ -1,3 +1,3 @@
1
1
  module Gherkin
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -42,39 +42,41 @@ module Gherkin
42
42
 
43
43
  describe Feature do
44
44
  it 'is Enumerable' do
45
+ tags = ['-foo', '-bar']
45
46
  background = ['foo', 'bar']
46
47
  elements = ['+foo', '+bar']
47
48
 
48
- instance = Feature.new("My feature", elements, background )
49
+ instance = Feature.new("My feature", elements, tags, background )
50
+ instance.tags.each.to_a.must_equal ['-foo', '-bar']
49
51
  instance.background.each.to_a.must_equal ['foo', 'bar']
50
52
  instance.each.to_a.must_equal ['+foo', '+bar']
51
53
  end
52
54
  end
53
55
 
54
56
  describe Scenario do
55
- let(:steps) do
56
- steps = [
57
+ before do
58
+ @steps = [
57
59
  OpenStruct.new(line: 4),
58
60
  OpenStruct.new(line: 5),
59
61
  ]
60
62
  end
61
63
 
62
64
  it 'is Enumerable' do
63
- instance = Scenario.new("Name", steps)
64
- instance.each.to_a.must_equal steps
65
+ instance = Scenario.new("Name", @steps)
66
+ instance.each.to_a.must_equal @steps
65
67
  end
66
68
 
67
69
  it 'has tags' do
68
70
  tags = ['javascript', 'wip']
69
71
 
70
- instance = Scenario.new("Name", steps, tags)
72
+ instance = Scenario.new("Name", @steps, tags)
71
73
  instance.tags.must_equal tags
72
74
  end
73
75
  end
74
76
 
75
77
  describe Background do
76
- let(:steps) do
77
- steps = [
78
+ before do
79
+ @steps = [
78
80
  OpenStruct.new(line: 4),
79
81
  OpenStruct.new(line: 5),
80
82
  ]
@@ -85,13 +87,13 @@ module Gherkin
85
87
  end
86
88
 
87
89
  it 'is Enumerable' do
88
- instance = Background.new(steps)
89
- instance.each.to_a.must_equal steps
90
+ instance = Background.new(@steps)
91
+ instance.each.to_a.must_equal @steps
90
92
  end
91
93
 
92
94
  describe 'when there are background steps' do
93
95
  it 'records line' do
94
- instance = Background.new(steps)
96
+ instance = Background.new(@steps)
95
97
  instance.pos("file", 3)
96
98
  instance.line.must_equal 3
97
99
  end
@@ -2,22 +2,24 @@ require 'test_helper'
2
2
 
3
3
  module Gherkin
4
4
  describe Parser do
5
- let(:lexer) { Parser.new }
5
+ before do
6
+ @lexer = Parser.new
7
+ end
6
8
 
7
9
  it 'ignores commments' do
8
- lexer.tokenize("# this is a comment").must_equal []
10
+ @lexer.tokenize("# this is a comment").must_equal []
9
11
  end
10
12
 
11
13
  it 'parses newlines' do
12
- lexer.tokenize("\n\n").must_equal [[:NEWLINE, "\n"], [:NEWLINE, "\n"]]
14
+ @lexer.tokenize("\n\n").must_equal [[:NEWLINE, "\n"], [:NEWLINE, "\n"]]
13
15
  end
14
16
 
15
17
  it 'parses text and strips it' do
16
- lexer.tokenize(" Arbitrary text ").must_equal [[:TEXT, "Arbitrary text"]]
18
+ @lexer.tokenize(" Arbitrary text ").must_equal [[:TEXT, "Arbitrary text"]]
17
19
  end
18
20
 
19
21
  it 'parses tags' do
20
- lexer.tokenize("@javascript @wip").must_equal [
22
+ @lexer.tokenize("@javascript @wip").must_equal [
21
23
  [:TAG, "javascript"],
22
24
  [:TAG, "wip"],
23
25
  ]
@@ -27,7 +29,7 @@ module Gherkin
27
29
  %w(Feature: Background: Scenario:).each do |keyword|
28
30
  it "parses #{keyword}:" do
29
31
  name = keyword[0..-2]
30
- lexer.tokenize(keyword).must_equal [[name.upcase.to_sym, name]]
32
+ @lexer.tokenize(keyword).must_equal [[name.upcase.to_sym, name]]
31
33
  end
32
34
  end
33
35
  end
@@ -35,7 +37,7 @@ module Gherkin
35
37
  describe 'Step keywords' do
36
38
  %w(Given When Then And But).each do |keyword|
37
39
  it "parses #{keyword}" do
38
- lexer.tokenize(keyword).must_equal [[keyword.upcase.to_sym, keyword]]
40
+ @lexer.tokenize(keyword).must_equal [[keyword.upcase.to_sym, keyword]]
39
41
  end
40
42
  end
41
43
  end
@@ -24,6 +24,24 @@ module Gherkin
24
24
  feature.name.must_equal "my feature"
25
25
  end
26
26
 
27
+ it 'parses feature with tags' do
28
+ feature = parse("""
29
+ @wip @with-dash
30
+ Feature: Do something
31
+ """)
32
+ feature.name.must_equal "Do something"
33
+ feature.tags.first.name.must_equal "wip"
34
+ feature.tags.last.name.must_equal "with-dash"
35
+ end
36
+
37
+ it 'parses feature with tagsi event without newline at start' do
38
+ feature = parse(
39
+ "@wip\nFeature: Do something"
40
+ )
41
+ feature.name.must_equal "Do something"
42
+ feature.tags.first.name.must_equal "wip"
43
+ end
44
+
27
45
  it 'parses feature with background' do
28
46
  feature = parse("""
29
47
  Feature: Do something
@@ -71,6 +89,23 @@ Feature: Do something
71
89
  last_scenario.steps.last.name.must_equal "something else"
72
90
  end
73
91
 
92
+ it 'parses feature with no ending newline' do
93
+ feature = parse(%(
94
+ Feature: Do something
95
+
96
+ Scenario: Foo bar baz
97
+ Given blah foo bar
98
+ Then something else))
99
+ scenarios = feature.scenarios
100
+ scenarios.size.must_equal 1
101
+
102
+ first_scenario = scenarios.first
103
+
104
+ first_scenario.name.must_equal "Foo bar baz"
105
+ first_scenario.steps.first.name.must_equal "blah foo bar"
106
+ first_scenario.steps.last.name.must_equal "something else"
107
+ end
108
+
74
109
  it 'parses feature with scenarios with tags' do
75
110
  feature = parse("""
76
111
  Feature: Do something
@@ -79,7 +114,7 @@ Feature: Do something
79
114
  Given blah foo bar
80
115
  Then something else
81
116
 
82
- @javascript @wip
117
+ @javascript @wip @with-vcr
83
118
  Scenario: Foo bar baz blah
84
119
  Given blah foo bar
85
120
  Then something else
@@ -88,8 +123,9 @@ Feature: Do something
88
123
 
89
124
  last_scenario = scenarios.last
90
125
 
91
- last_scenario.tags.first.name.must_equal "javascript"
92
- last_scenario.tags.last.name.must_equal "wip"
126
+ last_scenario.tags[0].name.must_equal "javascript"
127
+ last_scenario.tags[1].name.must_equal "wip"
128
+ last_scenario.tags[2].name.must_equal "with-vcr"
93
129
  end
94
130
  end
95
131
  end
metadata CHANGED
@@ -1,78 +1,75 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gherkin-ruby
3
- version: !ruby/object:Gem::Version
4
- hash: 1322991910812937300
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Marc Divins
14
9
  - Josep M. Bach
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2011-11-30 00:00:00 +01:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
13
+ date: 2012-05-21 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: rexical
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
26
18
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 2002549777813010636
31
- segments:
32
- - 0
33
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
34
23
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: racc
38
24
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
40
26
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 2002549777813010636
45
- segments:
46
- - 0
47
- version: "0"
48
- type: :runtime
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
51
32
  name: minitest
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
52
40
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
54
42
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- hash: 2002549777813010636
59
- segments:
60
- - 0
61
- version: "0"
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: racc
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
62
55
  type: :development
63
- version_requirements: *id003
64
- description: Gherkin-ruby is a Gherkin parser in pure Ruby using Parslet
65
- email:
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ description: Gherkin-ruby is a Gherkin parser in pure Ruby using Rexical and Racc
64
+ email:
66
65
  - marcdivc@gmail.com
67
66
  - josep.m.bach@gmail.com
68
67
  executables: []
69
-
70
68
  extensions: []
71
-
72
69
  extra_rdoc_files: []
73
-
74
- files:
70
+ files:
75
71
  - .gitignore
72
+ - .rvmrc
76
73
  - .travis.yml
77
74
  - Gemfile
78
75
  - Rakefile
@@ -91,41 +88,31 @@ files:
91
88
  - test/gherkin/parser/parser_test.rb
92
89
  - test/gherkin/parser_test.rb
93
90
  - test/test_helper.rb
94
- has_rdoc: true
95
- homepage: http://github.com/codegram/gherkin
91
+ homepage: http://github.com/codegram/gherkin-ruby
96
92
  licenses: []
97
-
98
93
  post_install_message:
99
94
  rdoc_options: []
100
-
101
- require_paths:
95
+ require_paths:
102
96
  - lib
103
- required_ruby_version: !ruby/object:Gem::Requirement
97
+ required_ruby_version: !ruby/object:Gem::Requirement
104
98
  none: false
105
- requirements:
106
- - - ">="
107
- - !ruby/object:Gem::Version
108
- hash: 2002549777813010636
109
- segments:
110
- - 0
111
- version: "0"
112
- required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
104
  none: false
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- hash: 2002549777813010636
118
- segments:
119
- - 0
120
- version: "0"
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
121
109
  requirements: []
122
-
123
110
  rubyforge_project: gherkin-ruby
124
- rubygems_version: 1.5.2
111
+ rubygems_version: 1.8.21
125
112
  signing_key:
126
113
  specification_version: 3
127
- summary: Gherkin-ruby is a Gherkin parser in pure Ruby using Parslet
128
- test_files:
114
+ summary: Gherkin-ruby is a Gherkin parser in pure Ruby using Rexical and Racc
115
+ test_files:
129
116
  - test/gherkin/ast_test.rb
130
117
  - test/gherkin/parser/lexer_test.rb
131
118
  - test/gherkin/parser/parser_test.rb