gherkin 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,12 @@
1
+ == 1.0.10 (2010-04-16)
2
+
3
+ === New Features
4
+ * Added Esperanto and added a Russian synonym for Feature. (Antono Vasiljev)
5
+ * Pure Java implementation of FilterListener and TagExpression (Mike Gaffney, Aslak Hellesøy)
6
+
7
+ === Changed Features
8
+ * TagExpression takes array args instead of varargs. (Aslak Hellesøy)
9
+
1
10
  == 1.0.9 (2010-04-12)
2
11
 
3
12
  === Bugfixes
@@ -30,7 +30,7 @@ E.g. in Bash, export RL_LANG="en,fr,no". This can be quite helpful when modifyin
30
30
 
31
31
  * Bump version in the VERSION.yml file and:
32
32
  ** java/pom.xml
33
- ** ikvm/Gherkin/Gherkin,csproj
33
+ ** ikvm/Gherkin/Gherkin.csproj
34
34
  * rake release:ALL
35
35
  * Announce on Cucumber list, IRC and Twitter.
36
36
 
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 0
3
- :patch: 9
3
+ :patch: 10
4
4
  :major: 1
@@ -35,6 +35,14 @@ module Gherkin
35
35
 
36
36
  unique_keywords.flatten.compact.sort.reverse.uniq.join('|').gsub(/\*/, '\*')
37
37
  end
38
+
39
+ def code_keywords
40
+ all.map{|i18n| i18n.code_keywords}.flatten.uniq.sort
41
+ end
42
+
43
+ def code_keyword_for(gherkin_keyword)
44
+ gherkin_keyword.gsub(/[\s',]/, '').strip
45
+ end
38
46
  end
39
47
 
40
48
  attr_reader :key
@@ -120,7 +128,7 @@ module Gherkin
120
128
 
121
129
  # Keywords that can be used in code
122
130
  def code_keywords
123
- result = gwt_keywords.map{|keyword| keyword.gsub(/[\s',]/, '').strip}
131
+ result = gwt_keywords.map{|keyword| self.class.code_keyword_for(keyword)}
124
132
  result.delete('*')
125
133
  result
126
134
  end
@@ -74,7 +74,7 @@
74
74
  scenario: Scenario
75
75
  scenario_outline: Scenario Amlinellol
76
76
  examples: Enghreifftiau
77
- given: "*|anrhegedig a"
77
+ given: "*|Anrhegedig a"
78
78
  when: "*|Pryd"
79
79
  then: "*|Yna"
80
80
  and: "*|A"
@@ -170,6 +170,19 @@
170
170
  then: "*|Then y'all"
171
171
  and: "*|And y'all"
172
172
  but: "*|But y'all"
173
+ "eo":
174
+ name: Esperanto
175
+ native: Esperanto
176
+ feature: Trajto
177
+ background: Fono
178
+ scenario: Scenaro
179
+ scenario_outline: Konturo de la scenaro
180
+ examples: Ekzemploj
181
+ given: "*|Donitaĵo"
182
+ when: "*|Se"
183
+ then: "*|Do"
184
+ and: "*|Kaj"
185
+ but: "*|Sed"
173
186
  "es":
174
187
  name: Spanish
175
188
  native: español
@@ -420,7 +433,7 @@
420
433
  "ru":
421
434
  name: Russian
422
435
  native: русский
423
- feature: Функционал
436
+ feature: Функционал|Фича
424
437
  background: Предыстория
425
438
  scenario: Сценарий
426
439
  scenario_outline: Структура сценария
@@ -7,13 +7,35 @@ class Class
7
7
  if defined?(JRUBY_VERSION)
8
8
  require jar
9
9
  class << self
10
- define_method(:new) do |*args|
10
+ def javaify(arg)
11
+ if Array === arg
12
+ arg.map{|a| javaify(a)}
13
+ else
14
+ case(arg)
15
+ when Regexp
16
+ java.util.regex.Pattern.compile(arg.source)
17
+ else
18
+ arg
19
+ end
20
+ end
21
+ end
22
+
23
+ def new(*args)
24
+ java_class.new(*javaify(args))
25
+ end
26
+
27
+ def ===(object)
28
+ super || object.java_kind_of?(java_class)
29
+ end
30
+
31
+ def java_class
11
32
  names = self.name.split('::')
12
33
  package = Java
13
34
  names[0..-2].each do |module_name|
14
35
  package = package.__send__(module_name.downcase)
15
36
  end
16
- package.__send__(names[-1]).new(*args)
37
+
38
+ package.__send__(names[-1])
17
39
  end
18
40
  end
19
41
  end
@@ -5,6 +5,9 @@ module Gherkin
5
5
  module Parser
6
6
  # This class filters events based on filter criteria.
7
7
  class FilterListener
8
+ require 'gherkin/java_impl'
9
+ java_impl('gherkin.jar')
10
+
8
11
  # Creates a new instance that replays events to +listener+, filtered by +filters+,
9
12
  # a Hash that can contain:
10
13
  #
@@ -138,7 +141,7 @@ module Gherkin
138
141
  when Regexp
139
142
  :name_match?
140
143
  when String
141
- TagExpression.new(*filters)
144
+ TagExpression.new(filters)
142
145
  end
143
146
  end
144
147
 
@@ -147,8 +150,7 @@ module Gherkin
147
150
  end
148
151
 
149
152
  def header_row_already_buffered?
150
- return false unless @examples_buffer.any?
151
- @examples_buffer[-1].event == :row
153
+ return @examples_buffer.any? && @examples_buffer[-1].event == :row
152
154
  end
153
155
 
154
156
  def filter_match?(*sexps)
@@ -157,8 +159,7 @@ module Gherkin
157
159
  end
158
160
 
159
161
  def tag_match?
160
- return false unless TagExpression === @filter_method
161
- @filter_method.eval(*current_tags)
162
+ return TagExpression === @filter_method && @filter_method.eval(current_tags)
162
163
  end
163
164
 
164
165
  def replay_buffers
@@ -1,9 +1,12 @@
1
1
  module Gherkin
2
2
  module Parser
3
3
  class TagExpression
4
+ require 'gherkin/java_impl'
5
+ java_impl('gherkin.jar')
6
+
4
7
  attr_reader :limits
5
8
 
6
- def initialize(*tag_expressions)
9
+ def initialize(tag_expressions)
7
10
  @ands = []
8
11
  @limits = {}
9
12
  tag_expressions.each do |expr|
@@ -15,7 +18,7 @@ module Gherkin
15
18
  @ands.empty?
16
19
  end
17
20
 
18
- def eval(*tags)
21
+ def eval(tags)
19
22
  return true if @ands.flatten.empty?
20
23
  vars = Hash[*tags.map{|tag| [tag, true]}.flatten]
21
24
  !!Kernel.eval(ruby_expression)
@@ -18,5 +18,9 @@ module Gherkin
18
18
  @lexer.scan("Feature: foo\n")
19
19
  @lexer.i18n_language.key.should == "en"
20
20
  end
21
+
22
+ it "should === its ruby class, even when the impl is Java" do
23
+ I18nLexer.should === I18nLexer.new(SexpRecorder.new, true)
24
+ end
21
25
  end
22
26
  end
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
 
4
4
  module Gherkin
5
5
  module Lexer
6
- describe "i18n parsing" do
6
+ describe I18n do
7
7
  before do
8
8
  @listener = Gherkin::SexpRecorder.new
9
9
  end
@@ -60,6 +60,14 @@ module Gherkin
60
60
  [:eof]
61
61
  ]
62
62
  end
63
+
64
+ describe 'keywords' do
65
+ it "should have code keywords without space, comma or apostrophe" do
66
+ ['Akkor', 'Etantdonné', 'Lorsque', '假設'].each do |code_keyword|
67
+ I18n.code_keywords.should include(code_keyword)
68
+ end
69
+ end
70
+ end
63
71
  end
64
72
  end
65
73
  end
@@ -31,8 +31,6 @@ module Gherkin
31
31
  end
32
32
 
33
33
  def scan(listener, filters)
34
- tag_expressions = filters.delete(:tag_expressions)
35
- filters[:tag_expression] = TagExpression.new(*tag_expressions) if tag_expressions
36
34
  filter_listener = FilterListener.new(listener, filters)
37
35
  parser = Gherkin::Parser::Parser.new(filter_listener, true, "root")
38
36
  lexer = Gherkin::I18nLexer.new(parser, true)
@@ -35,7 +35,7 @@ module Gherkin
35
35
  it "should be reusable for several feature files (native lexer: #{native})" do
36
36
  listener = mock('listener', :null_object => true)
37
37
  parser = Parser.new(listener, true)
38
- lexer = I18nLexer.new(parser, native)
38
+ lexer = Gherkin::I18nLexer.new(parser, native)
39
39
  feature = <<-EOF
40
40
  Feature: foo
41
41
  Scenario: bar
@@ -6,113 +6,109 @@ module Gherkin
6
6
  describe TagExpression do
7
7
  context "no tags" do
8
8
  before(:each) do
9
- @e = TagExpression.new
9
+ @e = TagExpression.new([])
10
10
  end
11
11
 
12
12
  it "should match @foo" do
13
- @e.eval('@foo').should == true
13
+ @e.eval(['@foo']).should == true
14
14
  end
15
15
 
16
16
  it "should match empty tags" do
17
- @e.eval().should == true
17
+ @e.eval([]).should == true
18
18
  end
19
19
  end
20
20
 
21
21
  context "@foo" do
22
22
  before(:each) do
23
- @e = TagExpression.new('@foo')
23
+ @e = TagExpression.new(['@foo'])
24
24
  end
25
25
 
26
26
  it "should match @foo" do
27
- @e.eval('@foo').should == true
27
+ @e.eval(['@foo']).should == true
28
28
  end
29
29
 
30
30
  it "should not match @bar" do
31
- @e.eval('@bar').should == false
31
+ @e.eval(['@bar']).should == false
32
+ end
33
+
34
+ it "should not match no tags" do
35
+ @e.eval([]).should == false
32
36
  end
33
37
  end
34
38
 
35
39
  context "!@foo" do
36
40
  before(:each) do
37
- @e = TagExpression.new('~@foo')
41
+ @e = TagExpression.new(['~@foo'])
38
42
  end
39
43
 
40
44
  it "should match @bar" do
41
- @e.eval('@bar').should == true
45
+ @e.eval(['@bar']).should == true
42
46
  end
43
47
 
44
48
  it "should not match @foo" do
45
- @e.eval('@foo').should == false
49
+ @e.eval(['@foo']).should == false
46
50
  end
47
51
  end
48
52
 
49
53
  context "@foo || @bar" do
50
54
  before(:each) do
51
- @e = TagExpression.new('@foo,@bar')
55
+ @e = TagExpression.new(['@foo,@bar'])
52
56
  end
53
57
 
54
58
  it "should match @foo" do
55
- @e.eval('@foo').should == true
59
+ @e.eval(['@foo']).should == true
56
60
  end
57
61
 
58
62
  it "should match @bar" do
59
- @e.eval('@bar').should == true
63
+ @e.eval(['@bar']).should == true
60
64
  end
61
65
 
62
66
  it "should not match @zap" do
63
- @e.eval('@zap').should == false
67
+ @e.eval(['@zap']).should == false
64
68
  end
65
69
  end
66
70
 
67
71
  context "(@foo || @bar) && !@zap" do
68
72
  before(:each) do
69
- @e = TagExpression.new('@foo,@bar', '~@zap')
73
+ @e = TagExpression.new(['@foo,@bar', '~@zap'])
70
74
  end
71
75
 
72
76
  it "should match @foo" do
73
- @e.eval('@foo').should == true
77
+ @e.eval(['@foo']).should == true
74
78
  end
75
79
 
76
80
  it "should not match @foo @zap" do
77
- @e.eval('@foo', '@zap').should == false
81
+ @e.eval(['@foo', '@zap']).should == false
78
82
  end
79
83
  end
80
84
 
81
85
  context "(@foo:3 || !@bar:4) && @zap:5" do
82
86
  before(:each) do
83
- @e = TagExpression.new('@foo:3,~@bar','@zap:5')
87
+ @e = TagExpression.new(['@foo:3,~@bar','@zap:5'])
84
88
  end
85
89
 
86
90
  it "should count tags for positive tags" do
87
- @e.limits.should == {'@foo' => 3, '@zap' => 5}
91
+ rubify_hash(@e.limits).should == {'@foo' => 3, '@zap' => 5}
88
92
  end
89
93
 
90
94
  it "should match @foo @zap" do
91
- @e.eval('@foo', '@zap').should == true
95
+ @e.eval(['@foo', '@zap']).should == true
92
96
  end
93
97
  end
94
98
 
95
99
  context "Parsing '@foo:3,~@bar', '@zap:5'" do
96
100
  before(:each) do
97
- @e = TagExpression.new(' @foo:3 , ~@bar ', ' @zap:5 ')
101
+ @e = TagExpression.new([' @foo:3 , ~@bar ', ' @zap:5 '])
98
102
  end
99
103
 
100
- it "should split and trim" do
101
- @e.__send__(:ruby_expression).should == "(!vars['@bar']||vars['@foo'])&&(vars['@zap'])"
104
+ unless defined?(JRUBY_VERSION)
105
+ it "should split and trim (ruby implementation detail)" do
106
+ @e.__send__(:ruby_expression).should == "(!vars['@bar']||vars['@foo'])&&(vars['@zap'])"
107
+ end
102
108
  end
103
109
 
104
110
  it "should have limits" do
105
- @e.limits.should == {"@zap"=>5, "@foo"=>3}
106
- end
107
- end
108
-
109
- context "Parsing ''" do
110
- before(:each) do
111
- @e = TagExpression.new('')
112
- end
113
-
114
- it "should ignore empty tags" do
115
- @e.eval("@foo").should == true
111
+ rubify_hash(@e.limits).should == {"@zap"=>5, "@foo"=>3}
116
112
  end
117
113
  end
118
114
  end
@@ -39,6 +39,16 @@ module GherkinSpecHelper
39
39
  def scan_file(file)
40
40
  @lexer.scan(File.new(File.dirname(__FILE__) + "/gherkin/fixtures/" + file).read)
41
41
  end
42
+
43
+ def rubify_hash(hash)
44
+ if defined?(JRUBY_VERSION)
45
+ h = {}
46
+ hash.keySet.each{|key| h[key] = hash[key]}
47
+ h
48
+ else
49
+ hash
50
+ end
51
+ end
42
52
  end
43
53
 
44
54
  Spec::Runner.configure do |c|
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 9
9
- version: 1.0.9
8
+ - 10
9
+ version: 1.0.10
10
10
  platform: ruby
11
11
  authors:
12
12
  - Mike Sassak
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-04-12 00:00:00 +02:00
19
+ date: 2010-04-16 00:00:00 +02:00
20
20
  default_executable: gherkin
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -78,49 +78,8 @@ description: A fast Gherkin lexer/parser based on the Ragel State Machine Compil
78
78
  email: cukes@googlegroups.com
79
79
  executables:
80
80
  - gherkin
81
- extensions:
82
- - ext/gherkin_lexer_ar/extconf.rb
83
- - ext/gherkin_lexer_bg/extconf.rb
84
- - ext/gherkin_lexer_ca/extconf.rb
85
- - ext/gherkin_lexer_cs/extconf.rb
86
- - ext/gherkin_lexer_cy_gb/extconf.rb
87
- - ext/gherkin_lexer_da/extconf.rb
88
- - ext/gherkin_lexer_de/extconf.rb
89
- - ext/gherkin_lexer_en/extconf.rb
90
- - ext/gherkin_lexer_en_au/extconf.rb
91
- - ext/gherkin_lexer_en_lol/extconf.rb
92
- - ext/gherkin_lexer_en_scouse/extconf.rb
93
- - ext/gherkin_lexer_en_tx/extconf.rb
94
- - ext/gherkin_lexer_es/extconf.rb
95
- - ext/gherkin_lexer_et/extconf.rb
96
- - ext/gherkin_lexer_fi/extconf.rb
97
- - ext/gherkin_lexer_fr/extconf.rb
98
- - ext/gherkin_lexer_he/extconf.rb
99
- - ext/gherkin_lexer_hr/extconf.rb
100
- - ext/gherkin_lexer_hu/extconf.rb
101
- - ext/gherkin_lexer_id/extconf.rb
102
- - ext/gherkin_lexer_it/extconf.rb
103
- - ext/gherkin_lexer_ja/extconf.rb
104
- - ext/gherkin_lexer_ko/extconf.rb
105
- - ext/gherkin_lexer_lt/extconf.rb
106
- - ext/gherkin_lexer_lv/extconf.rb
107
- - ext/gherkin_lexer_nl/extconf.rb
108
- - ext/gherkin_lexer_no/extconf.rb
109
- - ext/gherkin_lexer_pl/extconf.rb
110
- - ext/gherkin_lexer_pt/extconf.rb
111
- - ext/gherkin_lexer_ro/extconf.rb
112
- - ext/gherkin_lexer_ro_ro/extconf.rb
113
- - ext/gherkin_lexer_ru/extconf.rb
114
- - ext/gherkin_lexer_sk/extconf.rb
115
- - ext/gherkin_lexer_sr_cyrl/extconf.rb
116
- - ext/gherkin_lexer_sr_latn/extconf.rb
117
- - ext/gherkin_lexer_sv/extconf.rb
118
- - ext/gherkin_lexer_tr/extconf.rb
119
- - ext/gherkin_lexer_uk/extconf.rb
120
- - ext/gherkin_lexer_uz/extconf.rb
121
- - ext/gherkin_lexer_vi/extconf.rb
122
- - ext/gherkin_lexer_zh_cn/extconf.rb
123
- - ext/gherkin_lexer_zh_tw/extconf.rb
81
+ extensions: []
82
+
124
83
  extra_rdoc_files:
125
84
  - LICENSE
126
85
  - README.rdoc
@@ -135,48 +94,6 @@ files:
135
94
  - VERSION.yml
136
95
  - bin/gherkin
137
96
  - cucumber.yml
138
- - ext/gherkin_lexer_ar/gherkin_lexer_ar.c
139
- - ext/gherkin_lexer_bg/gherkin_lexer_bg.c
140
- - ext/gherkin_lexer_ca/gherkin_lexer_ca.c
141
- - ext/gherkin_lexer_cs/gherkin_lexer_cs.c
142
- - ext/gherkin_lexer_cy_gb/gherkin_lexer_cy_gb.c
143
- - ext/gherkin_lexer_da/gherkin_lexer_da.c
144
- - ext/gherkin_lexer_de/gherkin_lexer_de.c
145
- - ext/gherkin_lexer_en/gherkin_lexer_en.c
146
- - ext/gherkin_lexer_en_au/gherkin_lexer_en_au.c
147
- - ext/gherkin_lexer_en_lol/gherkin_lexer_en_lol.c
148
- - ext/gherkin_lexer_en_scouse/gherkin_lexer_en_scouse.c
149
- - ext/gherkin_lexer_en_tx/gherkin_lexer_en_tx.c
150
- - ext/gherkin_lexer_es/gherkin_lexer_es.c
151
- - ext/gherkin_lexer_et/gherkin_lexer_et.c
152
- - ext/gherkin_lexer_fi/gherkin_lexer_fi.c
153
- - ext/gherkin_lexer_fr/gherkin_lexer_fr.c
154
- - ext/gherkin_lexer_he/gherkin_lexer_he.c
155
- - ext/gherkin_lexer_hr/gherkin_lexer_hr.c
156
- - ext/gherkin_lexer_hu/gherkin_lexer_hu.c
157
- - ext/gherkin_lexer_id/gherkin_lexer_id.c
158
- - ext/gherkin_lexer_it/gherkin_lexer_it.c
159
- - ext/gherkin_lexer_ja/gherkin_lexer_ja.c
160
- - ext/gherkin_lexer_ko/gherkin_lexer_ko.c
161
- - ext/gherkin_lexer_lt/gherkin_lexer_lt.c
162
- - ext/gherkin_lexer_lv/gherkin_lexer_lv.c
163
- - ext/gherkin_lexer_nl/gherkin_lexer_nl.c
164
- - ext/gherkin_lexer_no/gherkin_lexer_no.c
165
- - ext/gherkin_lexer_pl/gherkin_lexer_pl.c
166
- - ext/gherkin_lexer_pt/gherkin_lexer_pt.c
167
- - ext/gherkin_lexer_ro/gherkin_lexer_ro.c
168
- - ext/gherkin_lexer_ro_ro/gherkin_lexer_ro_ro.c
169
- - ext/gherkin_lexer_ru/gherkin_lexer_ru.c
170
- - ext/gherkin_lexer_sk/gherkin_lexer_sk.c
171
- - ext/gherkin_lexer_sr_cyrl/gherkin_lexer_sr_cyrl.c
172
- - ext/gherkin_lexer_sr_latn/gherkin_lexer_sr_latn.c
173
- - ext/gherkin_lexer_sv/gherkin_lexer_sv.c
174
- - ext/gherkin_lexer_tr/gherkin_lexer_tr.c
175
- - ext/gherkin_lexer_uk/gherkin_lexer_uk.c
176
- - ext/gherkin_lexer_uz/gherkin_lexer_uz.c
177
- - ext/gherkin_lexer_vi/gherkin_lexer_vi.c
178
- - ext/gherkin_lexer_zh_cn/gherkin_lexer_zh_cn.c
179
- - ext/gherkin_lexer_zh_tw/gherkin_lexer_zh_tw.c
180
97
  - features/feature_parser.feature
181
98
  - features/native_lexer.feature
182
99
  - features/parser_with_native_lexer.feature
@@ -212,48 +129,6 @@ files:
212
129
  - lib/gherkin/rb_lexer.rb
213
130
  - lib/gherkin/rb_lexer/.gitignore
214
131
  - lib/gherkin/rb_lexer/README.rdoc
215
- - lib/gherkin/rb_lexer/ar.rb
216
- - lib/gherkin/rb_lexer/bg.rb
217
- - lib/gherkin/rb_lexer/ca.rb
218
- - lib/gherkin/rb_lexer/cs.rb
219
- - lib/gherkin/rb_lexer/cy_gb.rb
220
- - lib/gherkin/rb_lexer/da.rb
221
- - lib/gherkin/rb_lexer/de.rb
222
- - lib/gherkin/rb_lexer/en.rb
223
- - lib/gherkin/rb_lexer/en_au.rb
224
- - lib/gherkin/rb_lexer/en_lol.rb
225
- - lib/gherkin/rb_lexer/en_scouse.rb
226
- - lib/gherkin/rb_lexer/en_tx.rb
227
- - lib/gherkin/rb_lexer/es.rb
228
- - lib/gherkin/rb_lexer/et.rb
229
- - lib/gherkin/rb_lexer/fi.rb
230
- - lib/gherkin/rb_lexer/fr.rb
231
- - lib/gherkin/rb_lexer/he.rb
232
- - lib/gherkin/rb_lexer/hr.rb
233
- - lib/gherkin/rb_lexer/hu.rb
234
- - lib/gherkin/rb_lexer/id.rb
235
- - lib/gherkin/rb_lexer/it.rb
236
- - lib/gherkin/rb_lexer/ja.rb
237
- - lib/gherkin/rb_lexer/ko.rb
238
- - lib/gherkin/rb_lexer/lt.rb
239
- - lib/gherkin/rb_lexer/lv.rb
240
- - lib/gherkin/rb_lexer/nl.rb
241
- - lib/gherkin/rb_lexer/no.rb
242
- - lib/gherkin/rb_lexer/pl.rb
243
- - lib/gherkin/rb_lexer/pt.rb
244
- - lib/gherkin/rb_lexer/ro.rb
245
- - lib/gherkin/rb_lexer/ro_ro.rb
246
- - lib/gherkin/rb_lexer/ru.rb
247
- - lib/gherkin/rb_lexer/sk.rb
248
- - lib/gherkin/rb_lexer/sr_cyrl.rb
249
- - lib/gherkin/rb_lexer/sr_latn.rb
250
- - lib/gherkin/rb_lexer/sv.rb
251
- - lib/gherkin/rb_lexer/tr.rb
252
- - lib/gherkin/rb_lexer/uk.rb
253
- - lib/gherkin/rb_lexer/uz.rb
254
- - lib/gherkin/rb_lexer/vi.rb
255
- - lib/gherkin/rb_lexer/zh_cn.rb
256
- - lib/gherkin/rb_lexer/zh_tw.rb
257
132
  - lib/gherkin/tools.rb
258
133
  - lib/gherkin/tools/files.rb
259
134
  - lib/gherkin/tools/reformat.rb