gherkin 0.0.4-universal-java-1.5 → 1.0.0-universal-java-1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -19,9 +19,11 @@ rake clobber
19
19
 
20
20
  == Release process
21
21
 
22
- Run just "rake" for each platform (1.8.6, 1.8.7, 1.9, jruby) to make sure all is green.
22
+ Run just "rake clean spec cucumber" for each platform (1.8.6, 1.8.7, 1.9, jruby) to make sure all is green.
23
23
 
24
- 1) Bump version in the VERSION file
24
+ 1) rvm 1.8.7
25
+ 2) Bump version in the VERSION file
26
+ 3) rake clean jar compile
25
27
  2) rake gemspec
26
28
  3) Commit everything
27
29
  4) rake release
data/Rakefile CHANGED
@@ -46,4 +46,6 @@ end
46
46
 
47
47
  Dir['tasks/**/*.rake'].each { |rake| load rake }
48
48
 
49
- task :default => [:jar, :compile, :spec, :cucumber]
49
+ task :default => [:spec, :cucumber]
50
+ task :spec => defined?(JRUBY_VERSION) ? :jar : :compile
51
+ task :cucumber => defined?(JRUBY_VERSION) ? :jar : :compile
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 0
3
- :patch: 4
4
- :major: 0
3
+ :patch: 0
4
+ :major: 1
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{gherkin}
8
- s.version = "0.0.4"
8
+ s.version = "1.0.0"
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-28}
13
+ s.date = %q{2009-12-01}
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}
@@ -52,6 +52,7 @@ Gem::Specification.new do |s|
52
52
  "lib/gherkin.rb",
53
53
  "lib/gherkin/c_lexer.rb",
54
54
  "lib/gherkin/core_ext/array.rb",
55
+ "lib/gherkin/i18n.rb",
55
56
  "lib/gherkin/i18n.yml",
56
57
  "lib/gherkin/i18n_lexer.rb",
57
58
  "lib/gherkin/java_lexer.rb",
@@ -0,0 +1,80 @@
1
+ module Gherkin
2
+ class I18n
3
+ KEYWORD_KEYS = %w{name native feature background scenario scenario_outline examples given when then and but}
4
+ LANGUAGES = YAML.load_file(File.dirname(__FILE__) + '/i18n.yml')
5
+
6
+ class << self
7
+ # Used by code generators for other lexer tools like pygments lexer and textmate bundle
8
+ def all
9
+ LANGUAGES.keys.sort.map{|key| get(key)}
10
+ end
11
+
12
+ def get(key)
13
+ languages[key] ||= new(key)
14
+ end
15
+
16
+ def languages
17
+ @languages ||= {}
18
+ end
19
+ end
20
+
21
+ def initialize(key)
22
+ @key = key
23
+ @keywords = LANGUAGES[key]
24
+ raise "Language not supported: #{key.inspect}" if @key.nil?
25
+ @keywords['grammar_name'] = @keywords['name'].gsub(/\s/, '')
26
+ @parser = nil
27
+ end
28
+
29
+ def sanitized_key
30
+ @key.gsub(/[\s-]/, '')
31
+ end
32
+
33
+ def incomplete?
34
+ KEYWORD_KEYS.detect{|key| @keywords[key].nil?}
35
+ end
36
+
37
+ def feature_keywords
38
+ keywords('feature')
39
+ end
40
+
41
+ def scenario_keywords
42
+ keywords('scenario')
43
+ end
44
+
45
+ def scenario_outline_keywords
46
+ keywords('scenario_outline')
47
+ end
48
+
49
+ def background_keywords
50
+ keywords('background')
51
+ end
52
+
53
+ def examples_keywords
54
+ keywords('examples')
55
+ end
56
+
57
+ def but_keywords(space=true)
58
+ keywords('but', space)
59
+ end
60
+
61
+ def and_keywords(space=true)
62
+ keywords('and', space)
63
+ end
64
+
65
+ def step_keywords
66
+ %w{given when then and but}.map{|key| keywords(key, true)}.flatten.uniq
67
+ end
68
+
69
+ def keywords(key, space=false)
70
+ raise "No #{key} in #{@keywords.inspect}" if @keywords[key].nil?
71
+ @keywords[key].split('|').map{|kw| space ? keyword_space(kw) : kw}
72
+ end
73
+
74
+ private
75
+
76
+ def keyword_space(val)
77
+ (val + ' ').sub(/< $/,'')
78
+ end
79
+ end
80
+ end
@@ -7,6 +7,8 @@
7
7
 
8
8
  #ifdef HAVE_RUBY_RE_H
9
9
  #include <ruby/re.h>
10
+ #else
11
+ #include <re.h>
10
12
  #endif
11
13
 
12
14
  #ifdef HAVE_RUBY_ENCODING_H
@@ -232,7 +234,7 @@ static VALUE rb_eGherkinLexerError;
232
234
  }
233
235
  }
234
236
 
235
- include lexer_common "lexer_common.<%= @i18n %>.rl";
237
+ include lexer_common "lexer_common.<%= @i18n.sanitized_key %>.rl";
236
238
 
237
239
  }%%
238
240
 
@@ -350,7 +352,7 @@ static VALUE CLexer_scan(VALUE self, VALUE input)
350
352
  rb_str_append(input_copy, rb_str_new2("\n%_FEATURE_END_%"));
351
353
  char *data = RSTRING_PTR(input_copy);
352
354
  long len = RSTRING_LEN(input_copy);
353
-
355
+
354
356
  if (len == 0) {
355
357
  rb_raise(rb_eGherkinLexerError, "No content to lex.");
356
358
  } else {
@@ -387,14 +389,14 @@ static VALUE CLexer_scan(VALUE self, VALUE input)
387
389
  }
388
390
  }
389
391
 
390
- void Init_gherkin_lexer_<%= @i18n %>()
392
+ void Init_gherkin_lexer_<%= @i18n.sanitized_key %>()
391
393
  {
392
394
  mGherkin = rb_define_module("Gherkin");
393
395
  mLexer = rb_const_get(mGherkin, rb_intern("Lexer"));
394
396
  rb_eGherkinLexerError = rb_const_get(mLexer, rb_intern("LexingError"));
395
397
 
396
398
  mCLexer = rb_define_module_under(mGherkin, "CLexer");
397
- cI18nLexer = rb_define_class_under(mCLexer, "<%= @i18n.capitalize %>", rb_cObject);
399
+ cI18nLexer = rb_define_class_under(mCLexer, "<%= @i18n.sanitized_key.capitalize %>", rb_cObject);
398
400
  rb_define_alloc_func(cI18nLexer, CLexer_alloc);
399
401
  rb_define_method(cI18nLexer, "initialize", CLexer_init, 1);
400
402
  rb_define_method(cI18nLexer, "scan", CLexer_scan, 1);
@@ -7,7 +7,7 @@ import gherkin.Lexer;
7
7
  import gherkin.Listener;
8
8
  import gherkin.LexingError;
9
9
 
10
- public class <%= @i18n.capitalize %> implements Lexer {
10
+ public class <%= @i18n.sanitized_key.capitalize %> implements Lexer {
11
11
  %%{
12
12
  machine lexer;
13
13
  alphtype byte;
@@ -136,12 +136,12 @@ public class <%= @i18n.capitalize %> implements Lexer {
136
136
  }
137
137
  }
138
138
 
139
- include lexer_common "lexer_common.<%= @i18n %>.rl";
139
+ include lexer_common "lexer_common.<%= @i18n.sanitized_key %>.rl";
140
140
  }%%
141
141
 
142
142
  private final Listener listener;
143
143
 
144
- public <%= @i18n.capitalize %>(Listener listener) {
144
+ public <%= @i18n.sanitized_key.capitalize %>(Listener listener) {
145
145
  this.listener = listener;
146
146
  }
147
147
 
@@ -2,7 +2,7 @@ require 'gherkin/core_ext/array'
2
2
 
3
3
  module Gherkin
4
4
  module RbLexer
5
- class <%= @i18n.capitalize %> #:nodoc:
5
+ class <%= @i18n.sanitized_key.capitalize %> #:nodoc:
6
6
  %%{
7
7
  machine lexer;
8
8
 
@@ -129,7 +129,7 @@ module Gherkin
129
129
  end
130
130
  }
131
131
 
132
- include lexer_common "lexer_common.<%= @i18n %>.rl";
132
+ include lexer_common "lexer_common.<%= @i18n.sanitized_key %>.rl";
133
133
  }%%
134
134
 
135
135
  def initialize(listener)
@@ -2,12 +2,12 @@
2
2
  machine lexer_common;
3
3
 
4
4
  # Language specific
5
- I18N_Feature = <%= keywords['feature'] %> >start_keyword %end_keyword;
6
- I18N_Background = <%= keywords['background'] %> >start_keyword %end_keyword;
7
- I18N_ScenarioOutline = <%= keywords['scenario_outline'] %> >start_keyword %end_keyword;
8
- I18N_Scenario = <%= keywords['scenario'] %> >start_keyword %end_keyword;
9
- I18N_Step = (<%= keywords['given'] %> | <%= keywords['when'] %> | <%= keywords['and'] %> | <%= keywords['then'] %> | <%= keywords['but'] %>) >start_keyword %end_keyword;
10
- I18N_Examples = <%= keywords['examples'] %> >start_keyword %end_keyword;
5
+ I18N_Feature = (<%= ragel_list(@i18n.feature_keywords) %> ':') >start_keyword %end_keyword;
6
+ I18N_Background = (<%= ragel_list(@i18n.background_keywords) %> ':') >start_keyword %end_keyword;
7
+ I18N_ScenarioOutline = (<%= ragel_list(@i18n.scenario_outline_keywords) %> ':') >start_keyword %end_keyword;
8
+ I18N_Scenario = (<%= ragel_list(@i18n.scenario_keywords) %> ':') >start_keyword %end_keyword;
9
+ I18N_Step = <%= ragel_list(@i18n.step_keywords) %> >start_keyword %end_keyword;
10
+ I18N_Examples = (<%= ragel_list(@i18n.examples_keywords) %> ':') >start_keyword %end_keyword;
11
11
 
12
12
  EOF = '%_FEATURE_END_%'; # Explicit EOF added before scanning begins
13
13
  EOL = ('\r'? '\n') @inc_line_number @last_newline;
@@ -73,8 +73,8 @@ class Benchmarker
73
73
 
74
74
  def report_all
75
75
  Benchmark.bmbm do |x|
76
- x.report("c_gherkin:") { run_c_gherkin }
77
- x.report("c_gherkin_no_parser:") { run_c_gherkin_no_parser }
76
+ x.report("native_gherkin:") { run_native_gherkin }
77
+ x.report("native_gherkin_no_parser:") { run_native_gherkin_no_parser }
78
78
  x.report("rb_gherkin:") { run_rb_gherkin }
79
79
  x.report("cucumber:") { run_cucumber }
80
80
  x.report("tt:") { run_tt }
@@ -115,21 +115,21 @@ class Benchmarker
115
115
  end
116
116
  end
117
117
 
118
- def run_c_gherkin
118
+ def run_native_gherkin
119
119
  require 'gherkin'
120
120
  require 'null_listener'
121
121
  @features.each do |feature|
122
122
  parser = Gherkin::Parser.new(NullListener.new, true, "root")
123
- lexer = Gherkin::CLexer['en'].new(parser)
123
+ lexer = Gherkin::Lexer['en'].new(parser)
124
124
  lexer.scan(File.read(feature))
125
125
  end
126
126
  end
127
127
 
128
- def run_c_gherkin_no_parser
128
+ def run_native_gherkin_no_parser
129
129
  require 'gherkin'
130
130
  require 'null_listener'
131
131
  @features.each do |feature|
132
- lexer = Gherkin::CLexer['en'].new(NullListener.new)
132
+ lexer = Gherkin::Lexer['en'].new(NullListener.new)
133
133
  lexer.scan(File.read(feature))
134
134
  end
135
135
  end
@@ -167,16 +167,16 @@ namespace :bench do
167
167
  benchmarker.report("rb_gherkin")
168
168
  end
169
169
 
170
- desc "Benchmark the C Gherkin lexer+parser with the features in tasks/bench/generated"
171
- task :c_gherkin do
170
+ desc "Benchmark the ntive Gherkin lexer+parser with the features in tasks/bench/generated"
171
+ task :native_gherkin do
172
172
  benchmarker = Benchmarker.new
173
- benchmarker.report("c_gherkin")
173
+ benchmarker.report("native_gherkin")
174
174
  end
175
175
 
176
- desc "Benchmark the C Gherkin lexer (no parser) with the features in tasks/bench/generated"
177
- task :c_gherkin_no_parser do
176
+ desc "Benchmark the native Gherkin lexer (no parser) with the features in tasks/bench/generated"
177
+ task :native_gherkin_no_parser do
178
178
  benchmarker = Benchmarker.new
179
- benchmarker.report("c_gherkin_no_parser")
179
+ benchmarker.report("native_gherkin_no_parser")
180
180
  end
181
181
 
182
182
  desc "Show basic statistics about the features in tasks/bench/generated"
@@ -1,4 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/ragel_task'
2
+ require 'gherkin/i18n'
2
3
 
3
4
  CLEAN.include [
4
5
  '**/*.{o,bundle,jar,so,obj,pdb,lib,def,exp,log}', 'ext',
@@ -14,34 +15,33 @@ task :jar do
14
15
  sh("ant -f java/build.xml")
15
16
  end
16
17
 
17
- YAML.load_file(File.dirname(__FILE__) + '/../lib/gherkin/i18n.yml').each do |i18n, keywords|
18
- i18n = i18n.gsub(/[\s-]/, '')
19
-
20
- java = RagelTask.new('java', i18n, keywords)
21
- rb = RagelTask.new('rb', i18n, keywords)
18
+ Gherkin::I18n.all.each do |i18n|
19
+ java = RagelTask.new('java', i18n)
20
+ rb = RagelTask.new('rb', i18n)
22
21
 
23
22
  task :jar => java.target
24
23
  task :jar => rb.target
25
24
 
26
25
  begin
27
26
  require 'rake/extensiontask'
28
- c = RagelTask.new('c', i18n, keywords)
27
+ c = RagelTask.new('c', i18n)
29
28
 
30
- extconf = "ext/gherkin_lexer_#{i18n}/extconf.rb"
29
+ extconf = "ext/gherkin_lexer_#{i18n.sanitized_key}/extconf.rb"
31
30
 
32
31
  file extconf do
33
32
  FileUtils.mkdir(File.dirname(extconf)) unless File.directory?(File.dirname(extconf))
34
33
  File.open(extconf, "w") do |io|
35
34
  io.write(<<-EOF)
36
35
  require 'mkmf'
37
- dir_config("gherkin_lexer_#{i18n}")
36
+ $CFLAGS << ' -O0 -Wall -Werror'
37
+ dir_config("gherkin_lexer_#{i18n.sanitized_key}")
38
38
  have_library("c", "main")
39
- create_makefile("gherkin_lexer_#{i18n}")
39
+ create_makefile("gherkin_lexer_#{i18n.sanitized_key}")
40
40
  EOF
41
41
  end
42
42
  end
43
43
 
44
- Rake::ExtensionTask.new("gherkin_lexer_#{i18n}") do |ext|
44
+ Rake::ExtensionTask.new("gherkin_lexer_#{i18n.sanitized_key}") do |ext|
45
45
  if ENV['RUBY_CC_VERSION']
46
46
  ext.cross_compile = true
47
47
  ext.cross_platform = 'i386-mingw32'
@@ -53,9 +53,9 @@ EOF
53
53
 
54
54
  # The way tasks are defined with compile:xxx (but without namespace) in rake-compiler forces us
55
55
  # to use these hacks for setting up dependencies. Ugly!
56
- Rake::Task["compile:gherkin_lexer_#{i18n}"].prerequisites.unshift(extconf)
57
- Rake::Task["compile:gherkin_lexer_#{i18n}"].prerequisites.unshift(c.target)
58
- Rake::Task["compile:gherkin_lexer_#{i18n}"].prerequisites.unshift(rb.target)
56
+ Rake::Task["compile:gherkin_lexer_#{i18n.sanitized_key}"].prerequisites.unshift(extconf)
57
+ Rake::Task["compile:gherkin_lexer_#{i18n.sanitized_key}"].prerequisites.unshift(c.target)
58
+ Rake::Task["compile:gherkin_lexer_#{i18n.sanitized_key}"].prerequisites.unshift(rb.target)
59
59
 
60
60
  Rake::Task["compile"].prerequisites.unshift(extconf)
61
61
  Rake::Task["compile"].prerequisites.unshift(c.target)
@@ -4,10 +4,9 @@ require 'erb'
4
4
  class RagelTask
5
5
  RL_OUTPUT_DIR = File.dirname(__FILE__) + "/../ragel/i18n"
6
6
 
7
- def initialize(lang, i18n, keywords)
7
+ def initialize(lang, i18n)
8
8
  @lang = lang
9
9
  @i18n = i18n
10
- @keywords = keywords
11
10
  define_tasks
12
11
  end
13
12
 
@@ -18,27 +17,24 @@ class RagelTask
18
17
  end
19
18
 
20
19
  file lang_ragel => lang_erb do
21
- impl = ERB.new(IO.read(lang_erb)).result(binding)
22
- write(impl, lang_ragel)
20
+ write(ERB.new(IO.read(lang_erb)).result(binding), lang_ragel)
23
21
  end
24
22
 
25
23
  file common_ragel => common_erb do
26
- keywords = prep_keywords
27
- common = ERB.new(IO.read(common_erb)).result(binding)
28
- write(common, common_ragel)
24
+ write(ERB.new(IO.read(common_erb)).result(binding), common_ragel)
29
25
  end
30
26
  end
31
27
 
32
28
  def target
33
29
  {
34
- 'c' => "ext/gherkin_lexer_#{@i18n}/gherkin_lexer_#{@i18n}.c",
35
- 'java' => "java/src/gherkin/lexer/#{@i18n.capitalize}.java",
36
- 'rb' => "lib/gherkin/rb_lexer/#{@i18n}.rb"
30
+ 'c' => "ext/gherkin_lexer_#{@i18n.sanitized_key}/gherkin_lexer_#{@i18n.sanitized_key}.c",
31
+ 'java' => "java/src/gherkin/lexer/#{@i18n.sanitized_key.capitalize}.java",
32
+ 'rb' => "lib/gherkin/rb_lexer/#{@i18n.sanitized_key}.rb"
37
33
  }[@lang]
38
34
  end
39
35
 
40
36
  def common_ragel
41
- RL_OUTPUT_DIR + "/lexer_common.#{@i18n}.rl"
37
+ RL_OUTPUT_DIR + "/lexer_common.#{@i18n.sanitized_key}.rl"
42
38
  end
43
39
 
44
40
  def common_erb
@@ -46,7 +42,7 @@ class RagelTask
46
42
  end
47
43
 
48
44
  def lang_ragel
49
- RL_OUTPUT_DIR + "/#{@i18n}.#{@lang}.rl"
45
+ RL_OUTPUT_DIR + "/#{@i18n.sanitized_key}.#{@lang}.rl"
50
46
  end
51
47
 
52
48
  def lang_erb
@@ -61,23 +57,14 @@ class RagelTask
61
57
  }[@lang]
62
58
  end
63
59
 
64
- def prep_keywords
65
- keywords = @keywords.dup
66
- delimited_keywords = %w{feature background scenario scenario_outline examples}
67
- bare_keywords = %w{given when then and but}
68
- all_keywords = delimited_keywords + bare_keywords
69
-
70
- all_keywords.each { |k| keywords[k] = keywords[k].split("|") }
71
- delimited_keywords.each { |k| keywords[k].map! { |v| v += ':'} }
72
- bare_keywords.each { |k| keywords[k].map! { |v| (v + ' ').sub(/< $/, '')} }
73
- all_keywords.each { |k| keywords[k] = '("' + keywords[k].join('" | "') + '")' }
74
- keywords
75
- end
76
-
77
60
  def write(content, filename)
78
61
  mkdir_p(File.dirname(filename)) unless File.directory?(File.dirname(filename))
79
62
  File.open(filename, "wb") do |file|
80
63
  file.write(content)
81
64
  end
82
- end
65
+ end
66
+
67
+ def ragel_list(keywords)
68
+ "(#{keywords.map{|keyword| %{"#{keyword}"}}.join(' | ')})"
69
+ end
83
70
  end
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: 0.0.4
4
+ version: 1.0.0
5
5
  platform: universal-java-1.5
6
6
  authors:
7
7
  - Mike Sassak
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2009-11-28 00:00:00 +01:00
14
+ date: 2009-12-01 00:00:00 +01:00
15
15
  default_executable: gherkin
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -86,6 +86,7 @@ files:
86
86
  - lib/gherkin.rb
87
87
  - lib/gherkin/c_lexer.rb
88
88
  - lib/gherkin/core_ext/array.rb
89
+ - lib/gherkin/i18n.rb
89
90
  - lib/gherkin/i18n.yml
90
91
  - lib/gherkin/i18n_lexer.rb
91
92
  - lib/gherkin/java_lexer.rb