gherkin 0.0.3-universal-java-1.5 → 0.0.4-universal-java-1.5
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/.gitignore +2 -3
- data/README.rdoc +19 -0
- data/Rakefile +16 -15
- data/VERSION.yml +1 -1
- data/bin/gherkin +2 -2
- data/features/pretty_printer.feature +5 -2
- data/features/step_definitions/pretty_printer_steps.rb +6 -1
- data/gherkin.gemspec +16 -52
- data/lib/.gitignore +4 -2
- data/lib/gherkin/c_lexer.rb +3 -3
- data/lib/gherkin/core_ext/array.rb +5 -0
- data/lib/gherkin/lexer.rb +6 -5
- data/lib/gherkin/rb_lexer.rb +3 -2
- data/lib/gherkin/tools/pretty_printer.rb +10 -4
- data/nativegems.sh +5 -0
- data/ragel/lexer.c.rl.erb +28 -12
- data/ragel/lexer.java.rl.erb +5 -3
- data/ragel/lexer.rb.rl.erb +14 -15
- data/ragel/lexer_common.rl.erb +6 -6
- data/spec/gherkin/fixtures/1.feature +8 -0
- data/spec/gherkin/fixtures/complex.feature +2 -2
- data/spec/gherkin/shared/lexer_spec.rb +17 -4
- data/spec/gherkin/shared/py_string_spec.rb +12 -0
- data/tasks/bench.rake +28 -11
- data/tasks/compile.rake +70 -0
- data/tasks/ragel_task.rb +83 -0
- metadata +136 -165
- data/ext/gherkin_lexer/.gitignore +0 -6
- data/ext/gherkin_lexer/extconf.rb +0 -6
- data/tasks/ext.rake +0 -49
- data/tasks/ragel.rake +0 -94
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -17,6 +17,25 @@ rake spec cucumber
|
|
17
17
|
|
18
18
|
rake clobber
|
19
19
|
|
20
|
+
== Release process
|
21
|
+
|
22
|
+
Run just "rake" for each platform (1.8.6, 1.8.7, 1.9, jruby) to make sure all is green.
|
23
|
+
|
24
|
+
1) Bump version in the VERSION file
|
25
|
+
2) rake gemspec
|
26
|
+
3) Commit everything
|
27
|
+
4) rake release
|
28
|
+
5) ./nativegems.sh
|
29
|
+
6) gem push pkg/... (for each native gem)
|
30
|
+
|
31
|
+
TODO: Also build windows gem with dll using rake-compiler. MinGW gem can be done on OS X/Linux, but
|
32
|
+
the one for the old Ruby one-click installers must be built with Visual Studio/nmake.
|
33
|
+
|
34
|
+
== Build windows gems on OS X
|
35
|
+
|
36
|
+
* http://www.copiousfreetime.org/articles/2008/10/12/building-gems-for-windows.html
|
37
|
+
* rake-compiler docs
|
38
|
+
|
20
39
|
== Notes
|
21
40
|
|
22
41
|
Ragel supports Ruby, but it's much slower than C. The ruby target will be used for development.
|
data/Rakefile
CHANGED
@@ -4,9 +4,6 @@ require 'rubygems'
|
|
4
4
|
require 'rake'
|
5
5
|
require 'rake/clean'
|
6
6
|
|
7
|
-
JRUBY = defined?(JRUBY_VERSION)
|
8
|
-
WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
|
9
|
-
|
10
7
|
begin
|
11
8
|
require 'jeweler'
|
12
9
|
Jeweler::Tasks.new do |gem|
|
@@ -18,22 +15,26 @@ begin
|
|
18
15
|
gem.authors = ["Mike Sassak", "Gregory Hnatiuk", "Aslak Hellesøy"]
|
19
16
|
gem.executables = ["gherkin"]
|
20
17
|
gem.add_development_dependency "rspec", "1.2.9"
|
21
|
-
gem.add_development_dependency "cucumber"
|
18
|
+
gem.add_development_dependency "cucumber", "0.4.4"
|
19
|
+
gem.add_development_dependency "rake-compiler", "0.6.0" unless defined?(JRUBY_VERSION)
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if(JRUBY)
|
27
|
-
gem.platform = Gem::Platform::CURRENT
|
21
|
+
case ENV['PLATFORM']
|
22
|
+
when 'universal-java-1.5'
|
23
|
+
gem.platform = 'universal-java-1.5'
|
28
24
|
gem.files += FileList['lib/gherkin.jar']
|
29
25
|
gem.extensions = []
|
30
|
-
|
31
|
-
gem.platform =
|
32
|
-
gem.files += FileList['lib
|
26
|
+
when 'i386-mswin32'
|
27
|
+
gem.platform = 'i386-mswin32'
|
28
|
+
gem.files += FileList['lib/*.so']
|
29
|
+
gem.extensions = []
|
30
|
+
when 'i386-mingw32'
|
31
|
+
gem.platform = 'i386-mingw32'
|
32
|
+
gem.files += FileList['lib/*.so']
|
33
33
|
gem.extensions = []
|
34
34
|
else
|
35
|
-
gem.files += FileList['
|
36
|
-
gem.
|
35
|
+
gem.files += FileList['lib/gherkin/rb_lexer/*.rb']
|
36
|
+
gem.files += FileList['ext/**/*.c']
|
37
|
+
gem.extensions = FileList['ext/**/extconf.rb']
|
37
38
|
end
|
38
39
|
|
39
40
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
@@ -45,4 +46,4 @@ end
|
|
45
46
|
|
46
47
|
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
47
48
|
|
48
|
-
task :default => [:spec, :cucumber]
|
49
|
+
task :default => [:jar, :compile, :spec, :cucumber]
|
data/VERSION.yml
CHANGED
data/bin/gherkin
CHANGED
@@ -6,5 +6,5 @@ require 'gherkin/tools/pretty_printer'
|
|
6
6
|
|
7
7
|
listener = Gherkin::Tools::PrettyPrinter.new(STDOUT)
|
8
8
|
parser = Gherkin::Parser.new(listener, true) # We could skip the parser here, if we don't want to verify well-formedness
|
9
|
-
lexer = Gherkin::
|
10
|
-
lexer.scan(IO.read(ARGV[0]))
|
9
|
+
lexer = Gherkin::I18nLexer.new(parser)
|
10
|
+
lexer.scan(IO.read(ARGV[0]))
|
@@ -6,6 +6,9 @@ Feature: Pretty printer
|
|
6
6
|
Given I have Cucumber's home dir defined in CUCUMBER_HOME
|
7
7
|
When I find all of the .feature files
|
8
8
|
And I parse the prettified representation of each of them
|
9
|
-
# Of course, we don't really want
|
9
|
+
# Of course, we don't really want any errors. The last
|
10
|
+
# two files that were not identical are written to p1.feature
|
11
|
+
# and p2.feature. Do a diff -u p1.feature p2.feature
|
12
|
+
#
|
10
13
|
Then the following files should have errors:
|
11
|
-
| Path
|
14
|
+
| Path | Error |
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'stringio'
|
2
|
+
require 'gherkin'
|
2
3
|
require 'gherkin/tools/pretty_printer'
|
3
4
|
|
4
5
|
module PrettyPlease
|
@@ -27,12 +28,16 @@ end
|
|
27
28
|
When /^I parse the prettified representation of each of them$/ do
|
28
29
|
@errors = [['Path', 'Error']]
|
29
30
|
@features.each do |feature|
|
31
|
+
pretty1 = nil
|
32
|
+
pretty2 = nil
|
30
33
|
begin
|
34
|
+
# announce "========== #{feature}:"
|
31
35
|
pretty1 = pretty(IO.read(feature))
|
32
36
|
pretty2 = pretty(pretty1)
|
33
|
-
|
34
37
|
pretty2.should == pretty1
|
35
38
|
rescue Spec::Expectations::ExpectationNotMetError => e
|
39
|
+
File.open("p1.feature", "w") {|io| io.write(pretty1)}
|
40
|
+
File.open("p2.feature", "w") {|io| io.write(pretty2)}
|
36
41
|
announce "========== #{feature}:"
|
37
42
|
if(e.message =~ /(@@.*)/m)
|
38
43
|
announce $1
|
data/gherkin.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{gherkin}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
9
9
|
s.platform = %q{universal-java-1.5}
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.authors = ["Mike Sassak", "Gregory Hnatiuk", "Aslak Helles\303\270y"]
|
13
|
-
s.date = %q{2009-11-
|
13
|
+
s.date = %q{2009-11-28}
|
14
14
|
s.default_executable = %q{gherkin}
|
15
15
|
s.description = %q{A fast Gherkin lexer in Ragel}
|
16
16
|
s.email = %q{cukes@googlegroups.com}
|
@@ -27,8 +27,6 @@ Gem::Specification.new do |s|
|
|
27
27
|
"VERSION.yml",
|
28
28
|
"bin/gherkin",
|
29
29
|
"cucumber.yml",
|
30
|
-
"ext/gherkin_lexer/.gitignore",
|
31
|
-
"ext/gherkin_lexer/extconf.rb",
|
32
30
|
"features/feature_parser.feature",
|
33
31
|
"features/native_lexer.feature",
|
34
32
|
"features/parser_with_native_lexer.feature",
|
@@ -53,6 +51,7 @@ Gem::Specification.new do |s|
|
|
53
51
|
"lib/gherkin.jar",
|
54
52
|
"lib/gherkin.rb",
|
55
53
|
"lib/gherkin/c_lexer.rb",
|
54
|
+
"lib/gherkin/core_ext/array.rb",
|
56
55
|
"lib/gherkin/i18n.yml",
|
57
56
|
"lib/gherkin/i18n_lexer.rb",
|
58
57
|
"lib/gherkin/java_lexer.rb",
|
@@ -64,54 +63,16 @@ Gem::Specification.new do |s|
|
|
64
63
|
"lib/gherkin/rb_lexer.rb",
|
65
64
|
"lib/gherkin/rb_lexer/.gitignore",
|
66
65
|
"lib/gherkin/rb_lexer/README.rdoc",
|
67
|
-
"lib/gherkin/rb_lexer/ar.rb",
|
68
|
-
"lib/gherkin/rb_lexer/bg.rb",
|
69
|
-
"lib/gherkin/rb_lexer/cat.rb",
|
70
|
-
"lib/gherkin/rb_lexer/cs.rb",
|
71
|
-
"lib/gherkin/rb_lexer/cy.rb",
|
72
|
-
"lib/gherkin/rb_lexer/da.rb",
|
73
|
-
"lib/gherkin/rb_lexer/de.rb",
|
74
|
-
"lib/gherkin/rb_lexer/en-au.rb",
|
75
|
-
"lib/gherkin/rb_lexer/en-lol.rb",
|
76
|
-
"lib/gherkin/rb_lexer/en-tx.rb",
|
77
|
-
"lib/gherkin/rb_lexer/en.rb",
|
78
|
-
"lib/gherkin/rb_lexer/es.rb",
|
79
|
-
"lib/gherkin/rb_lexer/et.rb",
|
80
|
-
"lib/gherkin/rb_lexer/fi.rb",
|
81
|
-
"lib/gherkin/rb_lexer/fr.rb",
|
82
|
-
"lib/gherkin/rb_lexer/he.rb",
|
83
|
-
"lib/gherkin/rb_lexer/hr.rb",
|
84
|
-
"lib/gherkin/rb_lexer/hu.rb",
|
85
|
-
"lib/gherkin/rb_lexer/id.rb",
|
86
|
-
"lib/gherkin/rb_lexer/it.rb",
|
87
|
-
"lib/gherkin/rb_lexer/ja.rb",
|
88
|
-
"lib/gherkin/rb_lexer/ko.rb",
|
89
|
-
"lib/gherkin/rb_lexer/lt.rb",
|
90
|
-
"lib/gherkin/rb_lexer/lv.rb",
|
91
|
-
"lib/gherkin/rb_lexer/nl.rb",
|
92
|
-
"lib/gherkin/rb_lexer/no.rb",
|
93
|
-
"lib/gherkin/rb_lexer/pl.rb",
|
94
|
-
"lib/gherkin/rb_lexer/pt.rb",
|
95
|
-
"lib/gherkin/rb_lexer/ro.rb",
|
96
|
-
"lib/gherkin/rb_lexer/ro2.rb",
|
97
|
-
"lib/gherkin/rb_lexer/ru.rb",
|
98
|
-
"lib/gherkin/rb_lexer/se.rb",
|
99
|
-
"lib/gherkin/rb_lexer/sk.rb",
|
100
|
-
"lib/gherkin/rb_lexer/sr-Latn.rb",
|
101
|
-
"lib/gherkin/rb_lexer/sr.rb",
|
102
|
-
"lib/gherkin/rb_lexer/tr.rb",
|
103
|
-
"lib/gherkin/rb_lexer/uz.rb",
|
104
|
-
"lib/gherkin/rb_lexer/vi.rb",
|
105
|
-
"lib/gherkin/rb_lexer/zh-CN.rb",
|
106
|
-
"lib/gherkin/rb_lexer/zh-TW.rb",
|
107
66
|
"lib/gherkin/rb_parser.rb",
|
108
67
|
"lib/gherkin/tools/pretty_printer.rb",
|
68
|
+
"nativegems.sh",
|
109
69
|
"ragel/i18n/.gitignore",
|
110
70
|
"ragel/lexer.c.rl.erb",
|
111
71
|
"ragel/lexer.java.rl.erb",
|
112
72
|
"ragel/lexer.rb.rl.erb",
|
113
73
|
"ragel/lexer_common.rl.erb",
|
114
74
|
"spec/gherkin/c_lexer_spec.rb",
|
75
|
+
"spec/gherkin/fixtures/1.feature",
|
115
76
|
"spec/gherkin/fixtures/complex.feature",
|
116
77
|
"spec/gherkin/fixtures/i18n_fr.feature",
|
117
78
|
"spec/gherkin/fixtures/i18n_no.feature",
|
@@ -133,9 +94,9 @@ Gem::Specification.new do |s|
|
|
133
94
|
"tasks/bench/feature_builder.rb",
|
134
95
|
"tasks/bench/generated/.gitignore",
|
135
96
|
"tasks/bench/null_listener.rb",
|
97
|
+
"tasks/compile.rake",
|
136
98
|
"tasks/cucumber.rake",
|
137
|
-
"tasks/
|
138
|
-
"tasks/ragel.rake",
|
99
|
+
"tasks/ragel_task.rb",
|
139
100
|
"tasks/rdoc.rake",
|
140
101
|
"tasks/rspec.rake"
|
141
102
|
]
|
@@ -145,8 +106,7 @@ Gem::Specification.new do |s|
|
|
145
106
|
s.rubygems_version = %q{1.3.5}
|
146
107
|
s.summary = %q{Fast Gherkin lexer}
|
147
108
|
s.test_files = [
|
148
|
-
"spec/
|
149
|
-
"spec/gherkin/c_lexer_spec.rb",
|
109
|
+
"spec/gherkin/c_lexer_spec.rb",
|
150
110
|
"spec/gherkin/i18n_spec.rb",
|
151
111
|
"spec/gherkin/java_lexer_spec.rb",
|
152
112
|
"spec/gherkin/parser_spec.rb",
|
@@ -155,7 +115,8 @@ Gem::Specification.new do |s|
|
|
155
115
|
"spec/gherkin/shared/lexer_spec.rb",
|
156
116
|
"spec/gherkin/shared/py_string_spec.rb",
|
157
117
|
"spec/gherkin/shared/table_spec.rb",
|
158
|
-
"spec/gherkin/shared/tags_spec.rb"
|
118
|
+
"spec/gherkin/shared/tags_spec.rb",
|
119
|
+
"spec/spec_helper.rb"
|
159
120
|
]
|
160
121
|
|
161
122
|
if s.respond_to? :specification_version then
|
@@ -164,14 +125,17 @@ Gem::Specification.new do |s|
|
|
164
125
|
|
165
126
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
166
127
|
s.add_development_dependency(%q<rspec>, ["= 1.2.9"])
|
167
|
-
s.add_development_dependency(%q<cucumber>, ["
|
128
|
+
s.add_development_dependency(%q<cucumber>, ["= 0.4.4"])
|
129
|
+
s.add_development_dependency(%q<rake-compiler>, ["= 0.6.0"])
|
168
130
|
else
|
169
131
|
s.add_dependency(%q<rspec>, ["= 1.2.9"])
|
170
|
-
s.add_dependency(%q<cucumber>, ["
|
132
|
+
s.add_dependency(%q<cucumber>, ["= 0.4.4"])
|
133
|
+
s.add_dependency(%q<rake-compiler>, ["= 0.6.0"])
|
171
134
|
end
|
172
135
|
else
|
173
136
|
s.add_dependency(%q<rspec>, ["= 1.2.9"])
|
174
|
-
s.add_dependency(%q<cucumber>, ["
|
137
|
+
s.add_dependency(%q<cucumber>, ["= 0.4.4"])
|
138
|
+
s.add_dependency(%q<rake-compiler>, ["= 0.6.0"])
|
175
139
|
end
|
176
140
|
end
|
177
141
|
|
data/lib/.gitignore
CHANGED
data/lib/gherkin/c_lexer.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'gherkin_lexer'
|
2
|
-
|
3
1
|
module Gherkin
|
4
2
|
module CLexer
|
5
3
|
def self.[](i18n_language)
|
6
|
-
|
4
|
+
name = i18n_language.gsub(/[\s-]/, '')
|
5
|
+
require "gherkin_lexer_#{name}"
|
6
|
+
i18n_lexer_class_name = name.capitalize
|
7
7
|
const_get(i18n_lexer_class_name)
|
8
8
|
end
|
9
9
|
end
|
data/lib/gherkin/lexer.rb
CHANGED
@@ -6,20 +6,21 @@ module Gherkin
|
|
6
6
|
class << self
|
7
7
|
def [](i18n_lang)
|
8
8
|
begin
|
9
|
+
# Uncomment the line below (during development) to force use of Ruby lexer
|
10
|
+
# return rb[i18n_lang]
|
11
|
+
|
9
12
|
if defined?(JRUBY_VERSION)
|
10
13
|
java[i18n_lang]
|
11
14
|
else
|
12
15
|
begin
|
13
16
|
c[i18n_lang]
|
14
|
-
rescue NameError => e
|
17
|
+
rescue NameError, LoadError => e
|
15
18
|
warn("WARNING: #{e.message}. Reverting to Ruby lexer")
|
16
19
|
rb[i18n_lang]
|
17
|
-
rescue LoadError
|
18
|
-
rb[i18n_lang]
|
19
20
|
end
|
20
21
|
end
|
21
|
-
rescue LoadError
|
22
|
-
raise I18nLexerNotFound, "No lexer was found for #{i18n_lang}. Supported languages are listed in gherkin/i18n.yml."
|
22
|
+
rescue LoadError => e
|
23
|
+
raise I18nLexerNotFound, "No lexer was found for #{i18n_lang} (#{e.message}). Supported languages are listed in gherkin/i18n.yml."
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
data/lib/gherkin/rb_lexer.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Gherkin
|
2
2
|
module RbLexer
|
3
3
|
def self.[](i18n_language)
|
4
|
-
|
5
|
-
|
4
|
+
name = i18n_language.gsub(/[\s-]/, '')
|
5
|
+
require "gherkin/rb_lexer/#{name}"
|
6
|
+
i18n_lexer_class_name = name.capitalize
|
6
7
|
const_get(i18n_lexer_class_name)
|
7
8
|
end
|
8
9
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
module Gherkin
|
2
3
|
module Tools
|
3
4
|
class PrettyPrinter
|
@@ -53,9 +54,7 @@ module Gherkin
|
|
53
54
|
end
|
54
55
|
|
55
56
|
def py_string(string, line)
|
56
|
-
@io.puts ' """
|
57
|
-
@io.puts string.gsub(/^/, ' ')
|
58
|
-
@io.puts ' """'
|
57
|
+
@io.puts " \"\"\"\n" + string.gsub(START, ' ') + "\n \"\"\""
|
59
58
|
end
|
60
59
|
|
61
60
|
def syntax_error(state, event, legal_events, line)
|
@@ -63,10 +62,17 @@ module Gherkin
|
|
63
62
|
end
|
64
63
|
|
65
64
|
private
|
65
|
+
if(RUBY_VERSION =~ /^1\.9/)
|
66
|
+
START = /#{"^".encode('UTF-8')}/
|
67
|
+
NL = Regexp.new("\n".encode('UTF-8'))
|
68
|
+
else
|
69
|
+
START = /^/
|
70
|
+
NL = /\n/n
|
71
|
+
end
|
66
72
|
|
67
73
|
def indent(string, indentation)
|
68
74
|
indent = ""
|
69
|
-
string.split(
|
75
|
+
string.split(NL).map do |l|
|
70
76
|
s = "#{indent}#{l}"
|
71
77
|
indent = indentation
|
72
78
|
s
|
data/nativegems.sh
ADDED
data/ragel/lexer.c.rl.erb
CHANGED
@@ -5,6 +5,19 @@
|
|
5
5
|
#include <stddef.h>
|
6
6
|
#endif
|
7
7
|
|
8
|
+
#ifdef HAVE_RUBY_RE_H
|
9
|
+
#include <ruby/re.h>
|
10
|
+
#endif
|
11
|
+
|
12
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
13
|
+
#include <ruby/encoding.h>
|
14
|
+
#define ENCODED_STR_NEW(ptr, len) \
|
15
|
+
rb_enc_str_new(ptr, len, rb_utf8_encoding());
|
16
|
+
#else
|
17
|
+
#define ENCODED_STR_NEW(ptr, len) \
|
18
|
+
rb_str_new(ptr, len);
|
19
|
+
#endif
|
20
|
+
|
8
21
|
#ifndef RSTRING_PTR
|
9
22
|
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
10
23
|
#endif
|
@@ -115,10 +128,12 @@ static VALUE rb_eGherkinLexerError;
|
|
115
128
|
|
116
129
|
action store_comment_content {
|
117
130
|
STORE_ATTR(comment)
|
131
|
+
lexer->mark = 0;
|
118
132
|
}
|
119
133
|
|
120
134
|
action store_tag_content {
|
121
135
|
STORE_ATTR(tag)
|
136
|
+
lexer->mark = 0;
|
122
137
|
}
|
123
138
|
|
124
139
|
action inc_line_number {
|
@@ -160,7 +175,7 @@ static VALUE rb_eGherkinLexerError;
|
|
160
175
|
|
161
176
|
action store_cell_content {
|
162
177
|
VALUE con = Qnil;
|
163
|
-
con =
|
178
|
+
con = ENCODED_STR_NEW(PTR_TO(content_start), LEN(content_start, p));
|
164
179
|
rb_funcall(con, rb_intern("strip!"), 0);
|
165
180
|
|
166
181
|
rb_ary_push(current_row, con);
|
@@ -217,7 +232,7 @@ static VALUE rb_eGherkinLexerError;
|
|
217
232
|
}
|
218
233
|
}
|
219
234
|
|
220
|
-
include lexer_common "lexer_common.<%=
|
235
|
+
include lexer_common "lexer_common.<%= @i18n %>.rl";
|
221
236
|
|
222
237
|
}%%
|
223
238
|
|
@@ -251,8 +266,8 @@ store_kw_con(VALUE listener, const char * event_name,
|
|
251
266
|
int current_line)
|
252
267
|
{
|
253
268
|
VALUE con = Qnil, kw = Qnil;
|
254
|
-
kw =
|
255
|
-
con =
|
269
|
+
kw = ENCODED_STR_NEW(keyword_at, keyword_length);
|
270
|
+
con = ENCODED_STR_NEW(at, length);
|
256
271
|
con = multiline_strip(con);
|
257
272
|
rb_funcall(con, rb_intern("strip!"), 0);
|
258
273
|
rb_funcall(kw, rb_intern("strip!"), 0);
|
@@ -264,7 +279,7 @@ store_attr(VALUE listener, const char * attr_type,
|
|
264
279
|
const char * at, size_t length,
|
265
280
|
int line)
|
266
281
|
{
|
267
|
-
VALUE val =
|
282
|
+
VALUE val = ENCODED_STR_NEW(at, length);
|
268
283
|
rb_funcall(listener, rb_intern(attr_type), 2, val, INT2FIX(line));
|
269
284
|
}
|
270
285
|
|
@@ -274,8 +289,8 @@ store_pystring_content(VALUE listener,
|
|
274
289
|
const char *at, size_t length,
|
275
290
|
int current_line)
|
276
291
|
{
|
277
|
-
VALUE con =
|
278
|
-
// Gherkin will crash gracefully if the string representation of start_col pushes the pattern past
|
292
|
+
VALUE con = ENCODED_STR_NEW(at, length);
|
293
|
+
// Gherkin will crash gracefully if the string representation of start_col pushes the pattern past 32 characters
|
279
294
|
char pat[32];
|
280
295
|
snprintf(pat, 32, "^ {0,%d}", start_col);
|
281
296
|
VALUE re = rb_reg_regcomp(rb_str_new2(pat));
|
@@ -331,9 +346,10 @@ static VALUE CLexer_scan(VALUE self, VALUE input)
|
|
331
346
|
lexer_state *lexer = NULL;
|
332
347
|
DATA_GET(self, lexer_state, lexer);
|
333
348
|
|
334
|
-
|
335
|
-
|
336
|
-
|
349
|
+
VALUE input_copy = rb_str_dup(input);
|
350
|
+
rb_str_append(input_copy, rb_str_new2("\n%_FEATURE_END_%"));
|
351
|
+
char *data = RSTRING_PTR(input_copy);
|
352
|
+
long len = RSTRING_LEN(input_copy);
|
337
353
|
|
338
354
|
if (len == 0) {
|
339
355
|
rb_raise(rb_eGherkinLexerError, "No content to lex.");
|
@@ -371,14 +387,14 @@ static VALUE CLexer_scan(VALUE self, VALUE input)
|
|
371
387
|
}
|
372
388
|
}
|
373
389
|
|
374
|
-
void
|
390
|
+
void Init_gherkin_lexer_<%= @i18n %>()
|
375
391
|
{
|
376
392
|
mGherkin = rb_define_module("Gherkin");
|
377
393
|
mLexer = rb_const_get(mGherkin, rb_intern("Lexer"));
|
378
394
|
rb_eGherkinLexerError = rb_const_get(mLexer, rb_intern("LexingError"));
|
379
395
|
|
380
396
|
mCLexer = rb_define_module_under(mGherkin, "CLexer");
|
381
|
-
cI18nLexer = rb_define_class_under(mCLexer, "
|
397
|
+
cI18nLexer = rb_define_class_under(mCLexer, "<%= @i18n.capitalize %>", rb_cObject);
|
382
398
|
rb_define_alloc_func(cI18nLexer, CLexer_alloc);
|
383
399
|
rb_define_method(cI18nLexer, "initialize", CLexer_init, 1);
|
384
400
|
rb_define_method(cI18nLexer, "scan", CLexer_scan, 1);
|