gherkin 1.0.1-i386-mingw32 → 1.0.2-i386-mingw32
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/.mailmap +2 -0
- data/History.txt +9 -0
- data/README.rdoc +14 -43
- data/Rakefile +13 -17
- data/VERSION.yml +1 -1
- data/bin/gherkin +2 -7
- data/features/feature_parser.feature +36 -36
- data/features/native_lexer.feature +2 -2
- data/features/parser_with_native_lexer.feature +32 -32
- data/features/pretty_printer.feature +4 -4
- data/features/step_definitions/pretty_printer_steps.rb +2 -2
- data/features/steps_parser.feature +5 -5
- data/gherkin.gemspec +28 -16
- data/java/src/gherkin/FixJava.java +4 -4
- data/lib/gherkin/cli/main.rb +34 -0
- data/lib/gherkin/i18n.rb +8 -1
- data/lib/gherkin/i18n.yml +201 -201
- data/lib/gherkin/i18n_lexer.rb +8 -8
- data/lib/gherkin/lexer.rb +2 -1
- data/lib/gherkin/tools.rb +8 -0
- data/lib/gherkin/tools/files.rb +30 -0
- data/lib/gherkin/tools/{pretty_printer.rb → pretty_listener.rb} +5 -4
- data/lib/gherkin/tools/reformat.rb +19 -0
- data/lib/gherkin/tools/stats.rb +21 -0
- data/lib/gherkin/tools/stats_listener.rb +50 -0
- data/nativegems.sh +1 -1
- data/ragel/lexer.java.rl.erb +58 -58
- data/spec/gherkin/i18n_lexer_spec.rb +22 -0
- data/tasks/bench.rake +0 -7
- data/tasks/compile.rake +4 -4
- metadata +30 -12
- data/bin/gherkin-purdy +0 -16
data/lib/gherkin/i18n_lexer.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
require 'gherkin/lexer'
|
2
|
+
require 'gherkin/i18n'
|
2
3
|
|
3
4
|
module Gherkin
|
4
5
|
# The main entry point to lexing Gherkin source.
|
5
6
|
class I18nLexer
|
6
7
|
LANGUAGE_PATTERN = /language\s*:\s*(.*)/ #:nodoc:
|
7
8
|
|
9
|
+
attr_reader :language
|
10
|
+
|
8
11
|
def initialize(parser)
|
9
12
|
@parser = parser
|
10
13
|
end
|
11
14
|
|
12
15
|
def scan(source)
|
13
|
-
|
14
|
-
delegate = Lexer[
|
16
|
+
@language = lang(source)
|
17
|
+
delegate = Lexer[@language.key].new(@parser)
|
15
18
|
delegate.scan(source)
|
16
19
|
end
|
17
20
|
|
@@ -19,11 +22,8 @@ module Gherkin
|
|
19
22
|
|
20
23
|
def lang(source)
|
21
24
|
line_one = source.split(/\n/)[0]
|
22
|
-
|
23
|
-
|
24
|
-
else
|
25
|
-
nil
|
26
|
-
end
|
25
|
+
match = LANGUAGE_PATTERN.match(line_one)
|
26
|
+
I18n.get(match ? match[1] : 'en')
|
27
27
|
end
|
28
28
|
end
|
29
|
-
end
|
29
|
+
end
|
data/lib/gherkin/lexer.rb
CHANGED
@@ -15,7 +15,8 @@ module Gherkin
|
|
15
15
|
begin
|
16
16
|
c[i18n_lang]
|
17
17
|
rescue NameError, LoadError => e
|
18
|
-
warn("WARNING: #{e.message}. Reverting to Ruby lexer")
|
18
|
+
warn("WARNING: #{e.message}. Reverting to Ruby lexer.") unless defined?(@warned)
|
19
|
+
@warned = true
|
19
20
|
rb[i18n_lang]
|
20
21
|
end
|
21
22
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'gherkin'
|
2
|
+
|
3
|
+
module Gherkin
|
4
|
+
module Tools
|
5
|
+
# Base class for file based operations
|
6
|
+
class Files
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
def initialize(paths)
|
10
|
+
raise "Please specify one or more paths" if paths.empty?
|
11
|
+
@paths = paths
|
12
|
+
end
|
13
|
+
|
14
|
+
def each(&proc)
|
15
|
+
globs = @paths.map do |path|
|
16
|
+
raise "#{path} does not exist" unless File.exist?(path)
|
17
|
+
File.directory?(path) ? File.join(path, '**', '*.feature') : path
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir[*globs].uniq.sort.each(&proc)
|
21
|
+
end
|
22
|
+
|
23
|
+
def scan(file, listener)
|
24
|
+
parser = Parser.new(listener, true)
|
25
|
+
lexer = I18nLexer.new(parser)
|
26
|
+
lexer.scan(IO.read(file))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Gherkin
|
3
3
|
module Tools
|
4
|
-
class
|
4
|
+
class PrettyListener
|
5
5
|
def initialize(io)
|
6
6
|
@io = io
|
7
|
+
@tags = nil
|
7
8
|
end
|
8
9
|
|
9
10
|
def tag(name, line)
|
@@ -38,7 +39,7 @@ module Gherkin
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def examples(keyword, name, line)
|
41
|
-
@io.puts "\n
|
42
|
+
@io.puts "\n #{keyword}: #{indent(name, ' ')}"
|
42
43
|
end
|
43
44
|
|
44
45
|
def step(keyword, name, line)
|
@@ -48,8 +49,8 @@ module Gherkin
|
|
48
49
|
def table(rows, line)
|
49
50
|
rows = rows.to_a.map {|row| row.to_a} if defined?(JRUBY_VERSION) # Convert ArrayList
|
50
51
|
max_lengths = rows.transpose.map { |col| col.map { |cell| cell.unpack("U*").length }.max }.flatten
|
51
|
-
rows.each do |
|
52
|
-
@io.puts ' | ' +
|
52
|
+
rows.each do |table_line|
|
53
|
+
@io.puts ' | ' + table_line.zip(max_lengths).map { |cell, max_length| cell + ' ' * (max_length-cell.unpack("U*").length) }.join(' | ') + ' |'
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'gherkin/tools/files'
|
3
|
+
require 'gherkin/tools/pretty_listener'
|
4
|
+
|
5
|
+
module Gherkin
|
6
|
+
module Tools
|
7
|
+
class Reformat < Files
|
8
|
+
def run
|
9
|
+
each do |file|
|
10
|
+
purdy = StringIO.new
|
11
|
+
listener = PrettyListener.new(purdy)
|
12
|
+
scan(file, listener)
|
13
|
+
purdy.rewind
|
14
|
+
File.open(file, 'w') {|io| io.write(purdy.read)}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'gherkin'
|
2
|
+
require 'gherkin/tools/files'
|
3
|
+
require 'gherkin/tools/stats_listener'
|
4
|
+
|
5
|
+
module Gherkin
|
6
|
+
module Tools
|
7
|
+
class Stats < Files
|
8
|
+
def run
|
9
|
+
listener = StatsListener.new
|
10
|
+
each do |f|
|
11
|
+
parser = Gherkin::Parser.new(listener, true)
|
12
|
+
lexer = Gherkin::I18nLexer.new(parser)
|
13
|
+
lexer.scan(IO.read(f))
|
14
|
+
end
|
15
|
+
puts "Features: #{listener.features}"
|
16
|
+
puts "Scenarios: #{listener.scenarios}"
|
17
|
+
puts "Steps: #{listener.steps}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Gherkin
|
3
|
+
module Tools
|
4
|
+
class StatsListener
|
5
|
+
attr_reader :features, :scenarios, :steps
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@features = 0
|
9
|
+
@scenarios = 0
|
10
|
+
@steps = 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def tag(name, line)
|
14
|
+
end
|
15
|
+
|
16
|
+
def comment(content, line)
|
17
|
+
end
|
18
|
+
|
19
|
+
def feature(keyword, name, line)
|
20
|
+
@features += 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def background(keyword, name, line)
|
24
|
+
end
|
25
|
+
|
26
|
+
def scenario(keyword, name, line)
|
27
|
+
@scenarios += 1
|
28
|
+
end
|
29
|
+
|
30
|
+
def scenario_outline(keyword, name, line)
|
31
|
+
end
|
32
|
+
|
33
|
+
def examples(keyword, name, line)
|
34
|
+
end
|
35
|
+
|
36
|
+
def step(keyword, name, line)
|
37
|
+
@steps += 1
|
38
|
+
end
|
39
|
+
|
40
|
+
def table(rows, line)
|
41
|
+
end
|
42
|
+
|
43
|
+
def py_string(string, line)
|
44
|
+
end
|
45
|
+
|
46
|
+
def syntax_error(state, event, legal_events, line)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/nativegems.sh
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/bin/sh
|
2
2
|
# Builds gems for all supported platforms
|
3
|
-
rake gemspec build PLATFORM=
|
3
|
+
rake gemspec build PLATFORM=java
|
4
4
|
rake cross compile gemspec build PLATFORM=i386-mswin32 RUBY_CC_VERSION=1.8.6
|
5
5
|
rake gemspec build PLATFORM=i386-mingw32 RUBY_CC_VERSION=1.8.6
|
data/ragel/lexer.java.rl.erb
CHANGED
@@ -139,62 +139,62 @@ public class <%= @i18n.sanitized_key.capitalize %> implements Lexer {
|
|
139
139
|
include lexer_common "lexer_common.<%= @i18n.sanitized_key %>.rl";
|
140
140
|
}%%
|
141
141
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
142
|
+
private final Listener listener;
|
143
|
+
|
144
|
+
public <%= @i18n.sanitized_key.capitalize %>(Listener listener) {
|
145
|
+
this.listener = listener;
|
146
|
+
}
|
147
|
+
|
148
|
+
%% write data noerror;
|
149
|
+
|
150
|
+
public void scan(CharSequence inputSequence) {
|
151
|
+
String input = inputSequence.toString() + "\n%_FEATURE_END_%";
|
152
|
+
byte[] data = input.getBytes();
|
153
|
+
int cs, p = 0, pe = data.length;
|
154
|
+
int eof = pe;
|
155
|
+
|
156
|
+
int lineNumber = 1;
|
157
|
+
int lastNewline = 0;
|
158
|
+
|
159
|
+
int contentStart = -1;
|
160
|
+
int currentLine = -1;
|
161
|
+
int startCol = -1;
|
162
|
+
int nextKeywordStart = -1;
|
163
|
+
int keywordStart = -1;
|
164
|
+
String keyword = null;
|
165
|
+
List<List<String>> rows = null;
|
166
|
+
List<String> currentRow = null;
|
167
|
+
|
168
|
+
%% write init;
|
169
|
+
%% write exec;
|
170
|
+
}
|
171
|
+
|
172
|
+
private String keywordContent(byte[] data, int p, int eof, int nextKeywordStart, int contentStart) {
|
173
|
+
int endPoint = (nextKeywordStart == -1 || (p == eof)) ? p : nextKeywordStart;
|
174
|
+
return substring(data, contentStart, endPoint);
|
175
|
+
}
|
176
|
+
|
177
|
+
private String multilineStrip(String text) {
|
178
|
+
StringBuffer result = new StringBuffer();
|
179
|
+
for(String s : text.split("\n")) {
|
180
|
+
result.append(s.trim()).append("\n");
|
181
|
+
}
|
182
|
+
return result.toString().trim();
|
183
|
+
}
|
184
|
+
|
185
|
+
private String unindent(int startCol, String text) {
|
186
|
+
return Pattern.compile("^ {0," + startCol + "}", Pattern.MULTILINE).matcher(text).replaceAll("");
|
187
|
+
}
|
188
|
+
|
189
|
+
private String currentLineContent(byte[] data, int lastNewline) {
|
190
|
+
return substring(data, lastNewline, data.length).trim();
|
191
|
+
}
|
192
|
+
|
193
|
+
private String substring(byte[] data, int start, int end) {
|
194
|
+
try {
|
195
|
+
return new String(data, start, end-start, "utf-8");
|
196
|
+
} catch(java.io.UnsupportedEncodingException e) {
|
197
|
+
throw new RuntimeException("Internal error", e);
|
198
|
+
}
|
199
|
+
}
|
200
200
|
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
3
|
+
|
4
|
+
module Gherkin
|
5
|
+
describe I18nLexer do
|
6
|
+
before do
|
7
|
+
@lexer = I18nLexer.new(SexpRecorder.new)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should store the i18n language of the last scanned feature" do
|
11
|
+
@lexer.scan("# language: fr\n")
|
12
|
+
@lexer.language.key.should == "fr"
|
13
|
+
@lexer.scan("# language: no\n")
|
14
|
+
@lexer.language.key.should == "no"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should use English i18n by default" do
|
18
|
+
@lexer.scan("Feature: foo\n")
|
19
|
+
@lexer.language.key.should == "en"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/tasks/bench.rake
CHANGED
@@ -179,13 +179,6 @@ namespace :bench do
|
|
179
179
|
benchmarker.report("native_gherkin_no_parser")
|
180
180
|
end
|
181
181
|
|
182
|
-
desc "Show basic statistics about the features in tasks/bench/generated"
|
183
|
-
task :stats do
|
184
|
-
["Feature", "Scenario", "Given"].each do |kw|
|
185
|
-
sh "grep #{kw} #{GENERATED_FEATURES}/* | wc -l"
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
182
|
desc "Remove all generated features in tasks/bench/generated"
|
190
183
|
task :clean do
|
191
184
|
rm_f FileList[GENERATED_FEATURES + "/**/*feature"]
|
data/tasks/compile.rake
CHANGED
@@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/ragel_task'
|
|
2
2
|
require 'gherkin/i18n'
|
3
3
|
|
4
4
|
CLEAN.include [
|
5
|
+
'pkg', 'tmp',
|
5
6
|
'**/*.{o,bundle,jar,so,obj,pdb,lib,def,exp,log}', 'ext',
|
6
7
|
'java/target',
|
7
8
|
'ragel/i18n/*.rl',
|
@@ -23,11 +24,12 @@ Gherkin::I18n.all.each do |i18n|
|
|
23
24
|
task :jar => rb.target
|
24
25
|
|
25
26
|
begin
|
27
|
+
unless defined?(JRUBY_VERSION)
|
26
28
|
require 'rake/extensiontask'
|
29
|
+
|
27
30
|
c = RagelTask.new('c', i18n)
|
28
31
|
|
29
32
|
extconf = "ext/gherkin_lexer_#{i18n.sanitized_key}/extconf.rb"
|
30
|
-
|
31
33
|
file extconf do
|
32
34
|
FileUtils.mkdir(File.dirname(extconf)) unless File.directory?(File.dirname(extconf))
|
33
35
|
File.open(extconf, "w") do |io|
|
@@ -48,9 +50,6 @@ EOF
|
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
|
-
task :compile => c.target
|
52
|
-
task :compile => rb.target
|
53
|
-
|
54
53
|
# The way tasks are defined with compile:xxx (but without namespace) in rake-compiler forces us
|
55
54
|
# to use these hacks for setting up dependencies. Ugly!
|
56
55
|
Rake::Task["compile:gherkin_lexer_#{i18n.sanitized_key}"].prerequisites.unshift(extconf)
|
@@ -60,6 +59,7 @@ EOF
|
|
60
59
|
Rake::Task["compile"].prerequisites.unshift(extconf)
|
61
60
|
Rake::Task["compile"].prerequisites.unshift(c.target)
|
62
61
|
Rake::Task["compile"].prerequisites.unshift(rb.target)
|
62
|
+
end
|
63
63
|
rescue LoadError
|
64
64
|
unless defined?($c_warned)
|
65
65
|
warn "WARNING: Rake::ExtensionTask not installed. Skipping C compilation."
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gherkin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: i386-mingw32
|
6
6
|
authors:
|
7
7
|
- Mike Sassak
|
@@ -11,16 +11,26 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-12-
|
14
|
+
date: 2009-12-30 00:00:00 +01:00
|
15
15
|
default_executable: gherkin
|
16
16
|
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: trollop
|
19
|
+
type: :runtime
|
20
|
+
version_requirement:
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: "1.15"
|
26
|
+
version:
|
17
27
|
- !ruby/object:Gem::Dependency
|
18
28
|
name: rspec
|
19
29
|
type: :development
|
20
30
|
version_requirement:
|
21
31
|
version_requirements: !ruby/object:Gem::Requirement
|
22
32
|
requirements:
|
23
|
-
- - "
|
33
|
+
- - ">="
|
24
34
|
- !ruby/object:Gem::Version
|
25
35
|
version: 1.2.9
|
26
36
|
version:
|
@@ -30,9 +40,9 @@ dependencies:
|
|
30
40
|
version_requirement:
|
31
41
|
version_requirements: !ruby/object:Gem::Requirement
|
32
42
|
requirements:
|
33
|
-
- - "
|
43
|
+
- - ">="
|
34
44
|
- !ruby/object:Gem::Version
|
35
|
-
version: 0.
|
45
|
+
version: 0.5.1
|
36
46
|
version:
|
37
47
|
- !ruby/object:Gem::Dependency
|
38
48
|
name: rake-compiler
|
@@ -40,15 +50,14 @@ dependencies:
|
|
40
50
|
version_requirement:
|
41
51
|
version_requirements: !ruby/object:Gem::Requirement
|
42
52
|
requirements:
|
43
|
-
- - "
|
53
|
+
- - ">="
|
44
54
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
55
|
+
version: 0.7.0
|
46
56
|
version:
|
47
|
-
description: A fast Gherkin lexer
|
57
|
+
description: A fast Gherkin lexer/parser based on the Ragel State Machine Compiler.
|
48
58
|
email: cukes@googlegroups.com
|
49
59
|
executables:
|
50
60
|
- gherkin
|
51
|
-
- gherkin-purdy
|
52
61
|
extensions: []
|
53
62
|
|
54
63
|
extra_rdoc_files:
|
@@ -56,12 +65,13 @@ extra_rdoc_files:
|
|
56
65
|
- README.rdoc
|
57
66
|
files:
|
58
67
|
- .gitignore
|
68
|
+
- .mailmap
|
69
|
+
- History.txt
|
59
70
|
- LICENSE
|
60
71
|
- README.rdoc
|
61
72
|
- Rakefile
|
62
73
|
- VERSION.yml
|
63
74
|
- bin/gherkin
|
64
|
-
- bin/gherkin-purdy
|
65
75
|
- cucumber.yml
|
66
76
|
- features/feature_parser.feature
|
67
77
|
- features/native_lexer.feature
|
@@ -86,6 +96,7 @@ files:
|
|
86
96
|
- lib/.gitignore
|
87
97
|
- lib/gherkin.rb
|
88
98
|
- lib/gherkin/c_lexer.rb
|
99
|
+
- lib/gherkin/cli/main.rb
|
89
100
|
- lib/gherkin/core_ext/array.rb
|
90
101
|
- lib/gherkin/i18n.rb
|
91
102
|
- lib/gherkin/i18n.yml
|
@@ -100,7 +111,12 @@ files:
|
|
100
111
|
- lib/gherkin/rb_lexer/.gitignore
|
101
112
|
- lib/gherkin/rb_lexer/README.rdoc
|
102
113
|
- lib/gherkin/rb_parser.rb
|
103
|
-
- lib/gherkin/tools
|
114
|
+
- lib/gherkin/tools.rb
|
115
|
+
- lib/gherkin/tools/files.rb
|
116
|
+
- lib/gherkin/tools/pretty_listener.rb
|
117
|
+
- lib/gherkin/tools/reformat.rb
|
118
|
+
- lib/gherkin/tools/stats.rb
|
119
|
+
- lib/gherkin/tools/stats_listener.rb
|
104
120
|
- lib/gherkin_lexer_ar.so
|
105
121
|
- lib/gherkin_lexer_bg.so
|
106
122
|
- lib/gherkin_lexer_cat.so
|
@@ -156,6 +172,7 @@ files:
|
|
156
172
|
- spec/gherkin/fixtures/simple.feature
|
157
173
|
- spec/gherkin/fixtures/simple_with_comments.feature
|
158
174
|
- spec/gherkin/fixtures/simple_with_tags.feature
|
175
|
+
- spec/gherkin/i18n_lexer_spec.rb
|
159
176
|
- spec/gherkin/i18n_spec.rb
|
160
177
|
- spec/gherkin/java_lexer_spec.rb
|
161
178
|
- spec/gherkin/parser_spec.rb
|
@@ -202,9 +219,10 @@ rubyforge_project:
|
|
202
219
|
rubygems_version: 1.3.5
|
203
220
|
signing_key:
|
204
221
|
specification_version: 3
|
205
|
-
summary: Fast Gherkin lexer
|
222
|
+
summary: Fast Gherkin lexer/parser
|
206
223
|
test_files:
|
207
224
|
- spec/gherkin/c_lexer_spec.rb
|
225
|
+
- spec/gherkin/i18n_lexer_spec.rb
|
208
226
|
- spec/gherkin/i18n_spec.rb
|
209
227
|
- spec/gherkin/java_lexer_spec.rb
|
210
228
|
- spec/gherkin/parser_spec.rb
|