bryanl-gherkin 2.11.1.1

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.
Files changed (187) hide show
  1. data/.gitattributes +2 -0
  2. data/.mailmap +2 -0
  3. data/.rbenv-gemsets +1 -0
  4. data/.rspec +1 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +16 -0
  7. data/.yardopts +5 -0
  8. data/Gemfile +5 -0
  9. data/History.md +788 -0
  10. data/LICENSE +20 -0
  11. data/README.md +272 -0
  12. data/Rakefile +26 -0
  13. data/build_native_gems.sh +7 -0
  14. data/cucumber.yml +4 -0
  15. data/examples/parse_and_output_json.rb +19 -0
  16. data/features/.cucumber/stepdefs.json +244 -0
  17. data/features/escaped_pipes.feature +8 -0
  18. data/features/feature_parser.feature +237 -0
  19. data/features/json_formatter.feature +498 -0
  20. data/features/json_parser.feature +331 -0
  21. data/features/native_lexer.feature +19 -0
  22. data/features/parser_with_native_lexer.feature +205 -0
  23. data/features/pretty_formatter.feature +16 -0
  24. data/features/step_definitions/eyeball_steps.rb +3 -0
  25. data/features/step_definitions/gherkin_steps.rb +29 -0
  26. data/features/step_definitions/json_formatter_steps.rb +30 -0
  27. data/features/step_definitions/json_parser_steps.rb +20 -0
  28. data/features/step_definitions/pretty_formatter_steps.rb +85 -0
  29. data/features/steps_parser.feature +46 -0
  30. data/features/support/env.rb +42 -0
  31. data/gherkin.gemspec +77 -0
  32. data/install_mingw_os_x.sh +7 -0
  33. data/js/.npmignore +1 -0
  34. data/js/lib/gherkin/lexer/.npmignore +0 -0
  35. data/lib/gherkin.rb +2 -0
  36. data/lib/gherkin/c_lexer.rb +17 -0
  37. data/lib/gherkin/formatter/ansi_escapes.rb +97 -0
  38. data/lib/gherkin/formatter/argument.rb +16 -0
  39. data/lib/gherkin/formatter/escaping.rb +15 -0
  40. data/lib/gherkin/formatter/filter_formatter.rb +146 -0
  41. data/lib/gherkin/formatter/hashable.rb +19 -0
  42. data/lib/gherkin/formatter/json_formatter.rb +122 -0
  43. data/lib/gherkin/formatter/line_filter.rb +26 -0
  44. data/lib/gherkin/formatter/model.rb +281 -0
  45. data/lib/gherkin/formatter/pretty_formatter.rb +244 -0
  46. data/lib/gherkin/formatter/regexp_filter.rb +21 -0
  47. data/lib/gherkin/formatter/step_printer.rb +21 -0
  48. data/lib/gherkin/formatter/tag_count_formatter.rb +47 -0
  49. data/lib/gherkin/formatter/tag_filter.rb +19 -0
  50. data/lib/gherkin/i18n.rb +180 -0
  51. data/lib/gherkin/i18n.yml +613 -0
  52. data/lib/gherkin/js_lexer.rb +20 -0
  53. data/lib/gherkin/json_parser.rb +177 -0
  54. data/lib/gherkin/lexer/i18n_lexer.rb +46 -0
  55. data/lib/gherkin/listener/event.rb +45 -0
  56. data/lib/gherkin/listener/formatter_listener.rb +143 -0
  57. data/lib/gherkin/native.rb +7 -0
  58. data/lib/gherkin/native/java.rb +72 -0
  59. data/lib/gherkin/native/null.rb +5 -0
  60. data/lib/gherkin/native/therubyracer.rb +39 -0
  61. data/lib/gherkin/parser/meta.txt +5 -0
  62. data/lib/gherkin/parser/parser.rb +164 -0
  63. data/lib/gherkin/parser/root.txt +11 -0
  64. data/lib/gherkin/parser/steps.txt +4 -0
  65. data/lib/gherkin/rb_lexer.rb +8 -0
  66. data/lib/gherkin/rb_lexer/README.rdoc +8 -0
  67. data/lib/gherkin/rb_lexer/ar.rb +1165 -0
  68. data/lib/gherkin/rb_lexer/bg.rb +1377 -0
  69. data/lib/gherkin/rb_lexer/bm.rb +1081 -0
  70. data/lib/gherkin/rb_lexer/ca.rb +1305 -0
  71. data/lib/gherkin/rb_lexer/cs.rb +1157 -0
  72. data/lib/gherkin/rb_lexer/cy_gb.rb +1027 -0
  73. data/lib/gherkin/rb_lexer/da.rb +1043 -0
  74. data/lib/gherkin/rb_lexer/de.rb +1151 -0
  75. data/lib/gherkin/rb_lexer/en.rb +1151 -0
  76. data/lib/gherkin/rb_lexer/en_au.rb +971 -0
  77. data/lib/gherkin/rb_lexer/en_lol.rb +929 -0
  78. data/lib/gherkin/rb_lexer/en_pirate.rb +1205 -0
  79. data/lib/gherkin/rb_lexer/en_scouse.rb +1357 -0
  80. data/lib/gherkin/rb_lexer/en_tx.rb +1011 -0
  81. data/lib/gherkin/rb_lexer/eo.rb +990 -0
  82. data/lib/gherkin/rb_lexer/es.rb +1135 -0
  83. data/lib/gherkin/rb_lexer/et.rb +985 -0
  84. data/lib/gherkin/rb_lexer/fi.rb +964 -0
  85. data/lib/gherkin/rb_lexer/fr.rb +1223 -0
  86. data/lib/gherkin/rb_lexer/he.rb +1113 -0
  87. data/lib/gherkin/rb_lexer/hr.rb +1061 -0
  88. data/lib/gherkin/rb_lexer/hu.rb +1113 -0
  89. data/lib/gherkin/rb_lexer/id.rb +958 -0
  90. data/lib/gherkin/rb_lexer/is.rb +1115 -0
  91. data/lib/gherkin/rb_lexer/it.rb +1081 -0
  92. data/lib/gherkin/rb_lexer/ja.rb +1413 -0
  93. data/lib/gherkin/rb_lexer/ko.rb +1097 -0
  94. data/lib/gherkin/rb_lexer/lt.rb +1040 -0
  95. data/lib/gherkin/rb_lexer/lu.rb +1127 -0
  96. data/lib/gherkin/rb_lexer/lv.rb +1161 -0
  97. data/lib/gherkin/rb_lexer/nl.rb +1110 -0
  98. data/lib/gherkin/rb_lexer/no.rb +1055 -0
  99. data/lib/gherkin/rb_lexer/pl.rb +1452 -0
  100. data/lib/gherkin/rb_lexer/pt.rb +1425 -0
  101. data/lib/gherkin/rb_lexer/ro.rb +1159 -0
  102. data/lib/gherkin/rb_lexer/ru.rb +1749 -0
  103. data/lib/gherkin/rb_lexer/sk.rb +1041 -0
  104. data/lib/gherkin/rb_lexer/sr_cyrl.rb +1798 -0
  105. data/lib/gherkin/rb_lexer/sr_latn.rb +1289 -0
  106. data/lib/gherkin/rb_lexer/sv.rb +1065 -0
  107. data/lib/gherkin/rb_lexer/tr.rb +1087 -0
  108. data/lib/gherkin/rb_lexer/uk.rb +1641 -0
  109. data/lib/gherkin/rb_lexer/uz.rb +1371 -0
  110. data/lib/gherkin/rb_lexer/vi.rb +1193 -0
  111. data/lib/gherkin/rb_lexer/zh_cn.rb +1053 -0
  112. data/lib/gherkin/rb_lexer/zh_tw.rb +1047 -0
  113. data/lib/gherkin/rubify.rb +24 -0
  114. data/lib/gherkin/tag_expression.rb +62 -0
  115. data/ragel/lexer.c.rl.erb +454 -0
  116. data/ragel/lexer.java.rl.erb +219 -0
  117. data/ragel/lexer.js.rl.erb +227 -0
  118. data/ragel/lexer.rb.rl.erb +174 -0
  119. data/ragel/lexer_common.rl.erb +50 -0
  120. data/spec/gherkin/c_lexer_spec.rb +22 -0
  121. data/spec/gherkin/fixtures/1.feature +8 -0
  122. data/spec/gherkin/fixtures/comments_in_table.feature +9 -0
  123. data/spec/gherkin/fixtures/complex.feature +45 -0
  124. data/spec/gherkin/fixtures/complex.json +139 -0
  125. data/spec/gherkin/fixtures/complex_for_filtering.feature +60 -0
  126. data/spec/gherkin/fixtures/complex_with_tags.feature +61 -0
  127. data/spec/gherkin/fixtures/dos_line_endings.feature +45 -0
  128. data/spec/gherkin/fixtures/examples_with_only_header.feature +14 -0
  129. data/spec/gherkin/fixtures/hantu_pisang.feature +35 -0
  130. data/spec/gherkin/fixtures/i18n_fr.feature +14 -0
  131. data/spec/gherkin/fixtures/i18n_fr2.feature +8 -0
  132. data/spec/gherkin/fixtures/i18n_no.feature +7 -0
  133. data/spec/gherkin/fixtures/i18n_pt1.feature +44 -0
  134. data/spec/gherkin/fixtures/i18n_pt2.feature +4 -0
  135. data/spec/gherkin/fixtures/i18n_pt3.feature +4 -0
  136. data/spec/gherkin/fixtures/i18n_pt4.feature +4 -0
  137. data/spec/gherkin/fixtures/i18n_zh-CN.feature +9 -0
  138. data/spec/gherkin/fixtures/issue_145.feature +22 -0
  139. data/spec/gherkin/fixtures/scenario_outline_with_tags.feature +13 -0
  140. data/spec/gherkin/fixtures/scenario_without_steps.feature +5 -0
  141. data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
  142. data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
  143. data/spec/gherkin/fixtures/with_bom.feature +3 -0
  144. data/spec/gherkin/formatter/ansi_escapes_spec.rb +32 -0
  145. data/spec/gherkin/formatter/filter_formatter_spec.rb +204 -0
  146. data/spec/gherkin/formatter/json_formatter_spec.rb +92 -0
  147. data/spec/gherkin/formatter/model_spec.rb +28 -0
  148. data/spec/gherkin/formatter/pretty_formatter_spec.rb +177 -0
  149. data/spec/gherkin/formatter/spaces.feature +9 -0
  150. data/spec/gherkin/formatter/step_printer_spec.rb +55 -0
  151. data/spec/gherkin/formatter/tabs.feature +9 -0
  152. data/spec/gherkin/formatter/tag_count_formatter_spec.rb +30 -0
  153. data/spec/gherkin/i18n_spec.rb +241 -0
  154. data/spec/gherkin/java_lexer_spec.rb +20 -0
  155. data/spec/gherkin/js_lexer_spec.rb +23 -0
  156. data/spec/gherkin/json_parser_spec.rb +176 -0
  157. data/spec/gherkin/lexer/i18n_lexer_spec.rb +43 -0
  158. data/spec/gherkin/output_stream_string_io.rb +20 -0
  159. data/spec/gherkin/parser/parser_spec.rb +16 -0
  160. data/spec/gherkin/rb_lexer_spec.rb +20 -0
  161. data/spec/gherkin/sexp_recorder.rb +59 -0
  162. data/spec/gherkin/shared/bom_group.rb +20 -0
  163. data/spec/gherkin/shared/doc_string_group.rb +163 -0
  164. data/spec/gherkin/shared/lexer_group.rb +591 -0
  165. data/spec/gherkin/shared/row_group.rb +125 -0
  166. data/spec/gherkin/shared/tags_group.rb +54 -0
  167. data/spec/gherkin/tag_expression_spec.rb +142 -0
  168. data/spec/spec_helper.rb +75 -0
  169. data/tasks/bench.rake +184 -0
  170. data/tasks/bench/feature_builder.rb +49 -0
  171. data/tasks/bench/null_listener.rb +4 -0
  172. data/tasks/compile.rake +120 -0
  173. data/tasks/cucumber.rake +22 -0
  174. data/tasks/gems.rake +31 -0
  175. data/tasks/ikvm.rake +124 -0
  176. data/tasks/ragel_task.rb +100 -0
  177. data/tasks/release.rake +49 -0
  178. data/tasks/rspec.rake +8 -0
  179. data/tasks/yard.rake +7 -0
  180. data/tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  181. data/tasks/yard/default/layout/html/bubble_48x48.png +0 -0
  182. data/tasks/yard/default/layout/html/footer.erb +5 -0
  183. data/tasks/yard/default/layout/html/index.erb +1 -0
  184. data/tasks/yard/default/layout/html/layout.erb +25 -0
  185. data/tasks/yard/default/layout/html/logo.erb +1 -0
  186. data/tasks/yard/default/layout/html/setup.rb +4 -0
  187. metadata +473 -0
@@ -0,0 +1,49 @@
1
+ class StepsBuilder
2
+ def initialize
3
+ @steps = []
4
+ end
5
+
6
+ def step(content, generator)
7
+ @steps << " Given #{content}"
8
+ if(rand(5) == 0)
9
+ cols = rand(8) + 1
10
+ rows = rand(10)
11
+ rows.times do
12
+ row = " |"
13
+ cols.times do
14
+ row << generator.table_cell << "|"
15
+ end
16
+ @steps << row
17
+ end
18
+ end
19
+ end
20
+
21
+ def to_s
22
+ @steps.join("\n")
23
+ end
24
+ end
25
+
26
+ class FeatureBuilder
27
+ def initialize(name, &block)
28
+ @name = name
29
+ @scenarios = {}
30
+ block.call(self)
31
+ end
32
+
33
+ def scenario(name, &block)
34
+ @scenarios[name] = StepsBuilder.new
35
+ block.call(@scenarios[name])
36
+ end
37
+
38
+ def to_s
39
+ str = "Feature: #{@name}\n"
40
+ @scenarios.each do |scenario, steps|
41
+ str += "\n"
42
+ str += " Scenario: #{scenario}\n"
43
+ str += steps.to_s
44
+ str += "\n"
45
+ end
46
+ str
47
+ end
48
+ end
49
+
@@ -0,0 +1,4 @@
1
+ class NullListener
2
+ def method_missing(*args)
3
+ end
4
+ end
@@ -0,0 +1,120 @@
1
+ require File.dirname(__FILE__) + '/ragel_task'
2
+ BYPASS_NATIVE_IMPL = true
3
+ require 'gherkin/i18n'
4
+
5
+ CLEAN.include [
6
+ 'pkg', 'tmp',
7
+ '**/*.{o,bundle,jar,so,obj,pdb,lib,def,exp,log,rbc}', 'ext',
8
+ 'java/target',
9
+ 'ragel/i18n/*.rl',
10
+ 'lib/gherkin/rb_lexer/*.rb',
11
+ 'lib/*.dll',
12
+ 'ext/**/*.c',
13
+ 'java/src/main/java/gherkin/lexer/i18n/*.java',
14
+ 'java/src/main/resources/gherkin/*.properties',
15
+ 'js/lib/gherkin/lexer/*.js',
16
+ 'doc'
17
+ ]
18
+
19
+ desc "Compile the Java extensions"
20
+ task :jar => 'lib/gherkin.jar'
21
+
22
+ file 'lib/gherkin.jar' => Dir['java/src/main/java/**/*.java'] do
23
+ sh("mvn -f java/pom.xml package")
24
+ end
25
+
26
+ desc "Build Javascript lexers"
27
+ task :js
28
+
29
+ rl_langs = ENV['RL_LANGS'] ? ENV['RL_LANGS'].split(',') : []
30
+ langs = Gherkin::I18n.all.select { |lang| rl_langs.empty? || rl_langs.include?(lang.iso_code) }
31
+
32
+ # http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6457127
33
+ file 'lib/gherkin.jar' => "java/src/main/resources/gherkin/I18nKeywords_in.properties"
34
+ file "java/src/main/resources/gherkin/I18nKeywords_in.properties" => "java/src/main/resources/gherkin/I18nKeywords_id.properties" do
35
+ cp "java/src/main/resources/gherkin/I18nKeywords_id.properties", "java/src/main/resources/gherkin/I18nKeywords_in.properties"
36
+ end
37
+
38
+ # http://forums.sun.com/thread.jspa?threadID=5335461
39
+ file 'lib/gherkin.jar' => "java/src/main/resources/gherkin/I18nKeywords_iw.properties"
40
+ file "java/src/main/resources/gherkin/I18nKeywords_iw.properties" => "java/src/main/resources/gherkin/I18nKeywords_he.properties" do
41
+ cp "java/src/main/resources/gherkin/I18nKeywords_he.properties", "java/src/main/resources/gherkin/I18nKeywords_iw.properties"
42
+ end
43
+
44
+ java_i18n_properties = "java/src/main/resources/gherkin/I18n.properties"
45
+ file java_i18n_properties => 'lib/gherkin/i18n.yml' do
46
+ File.open(java_i18n_properties, 'wb') do |io|
47
+ io.puts("# Generated file. Do not edit.")
48
+ io.puts("i18n.isoCodes=#{langs.map{|i18n| i18n.iso_code}.join(',')}")
49
+ end
50
+ end
51
+
52
+ langs.each do |i18n|
53
+ java = RagelTask.new('java', i18n)
54
+ rb = RagelTask.new('rb', i18n)
55
+ js = RagelTask.new('js', i18n)
56
+
57
+ lang_country = i18n.iso_code.split(/-/)
58
+ suffix = lang_country.length == 1 ? lang_country[0] : "#{lang_country[0]}_#{lang_country[1].upcase}"
59
+ java_properties = "java/src/main/resources/gherkin/I18nKeywords_#{suffix}.properties"
60
+ file java_properties => 'lib/gherkin/i18n.yml' do
61
+ File.open(java_properties, 'wb') do |io|
62
+ io.puts("# Generated file. Do not edit.")
63
+ (Gherkin::I18n::KEYWORD_KEYS + %w{name native}).each do |key|
64
+ value = Gherkin::I18n.unicode_escape(i18n.keywords(key).join("|"))
65
+ io.puts("#{key}:#{value}")
66
+ end
67
+ end
68
+ end
69
+ file 'lib/gherkin.jar' => [java.target, rb.target, java_properties, java_i18n_properties]
70
+
71
+ begin
72
+ if !defined?(JRUBY_VERSION)
73
+ require 'rake/extensiontask'
74
+
75
+ c = RagelTask.new('c', i18n)
76
+
77
+ extconf = "ext/gherkin_lexer_#{i18n.underscored_iso_code}/extconf.rb"
78
+ file extconf do
79
+ FileUtils.mkdir(File.dirname(extconf)) unless File.directory?(File.dirname(extconf))
80
+ File.open(extconf, "w") do |io|
81
+ io.write(<<-EOF)
82
+ require 'mkmf'
83
+ CONFIG['warnflags'].gsub!(/-Wshorten-64-to-32/, '') if CONFIG['warnflags']
84
+ $CFLAGS << ' -O0 -Wall' if CONFIG['CC'] =~ /gcc|clang/
85
+ dir_config("gherkin_lexer_#{i18n.underscored_iso_code}")
86
+ have_library("c", "main")
87
+ create_makefile("gherkin_lexer_#{i18n.underscored_iso_code}")
88
+ EOF
89
+ end
90
+ end
91
+
92
+ Rake::ExtensionTask.new("gherkin_lexer_#{i18n.underscored_iso_code}") do |ext|
93
+ if ENV['RUBY_CC_VERSION']
94
+ ext.cross_compile = true
95
+ ext.cross_platform = 'x86-mingw32'
96
+ end
97
+ end
98
+
99
+ # The way tasks are defined with compile:xxx (but without namespace) in rake-compiler forces us
100
+ # to use these hacks for setting up dependencies. Ugly!
101
+ Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(extconf)
102
+ Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(c.target)
103
+ Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(rb.target)
104
+ Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(js.target) if ENV['GHERKIN_JS']
105
+
106
+ Rake::Task["compile"].prerequisites.unshift(extconf)
107
+ Rake::Task["compile"].prerequisites.unshift(c.target)
108
+ Rake::Task["compile"].prerequisites.unshift(rb.target)
109
+ Rake::Task["compile"].prerequisites.unshift(js.target) if ENV['GHERKIN_JS']
110
+
111
+ Rake::Task["js"].prerequisites.unshift(js.target) if ENV['GHERKIN_JS']
112
+ end
113
+ rescue LoadError
114
+ unless defined?($c_warned)
115
+ warn "WARNING: Rake::ExtensionTask not installed. Skipping C compilation."
116
+ $c_warned = true
117
+ task :compile # no-op
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,22 @@
1
+
2
+ unless ENV['RUBY_CC_VERSION']
3
+ require 'cucumber/rake/task'
4
+
5
+ Cucumber::Rake::Task.new(:cucumber) do |t|
6
+ profile = ENV['TRAVIS'] ? 'travis' : 'default'
7
+ t.cucumber_opts = "--profile #{profile}"
8
+ end
9
+
10
+ namespace :cucumber do
11
+ Cucumber::Rake::Task.new(:rcov, "Run Cucumber using RCov") do |t|
12
+ t.cucumber_opts = "--profile default"
13
+ t.rcov = RUBY_VERSION =~ /^1\.8/
14
+ t.rcov_opts = %w{--exclude spec\/}
15
+ end
16
+
17
+ Cucumber::Rake::Task.new(:native_lexer, "Run Native lexer Cucumber features") do |t|
18
+ t.cucumber_opts = "--profile native_lexer"
19
+ end
20
+ task :native_lexer => [:clean, :compile]
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ namespace :gems do
2
+ task :win do
3
+ unless File.directory?(File.expand_path('~/.rake-compiler'))
4
+ STDERR.puts "[ERROR] You must install MinGW rubies to build gherkin gems for Windows. See README.rdoc"
5
+ exit(1)
6
+ end
7
+ # rvm and mingw ruby versions have to match to avoid errors
8
+ sh "rvm 1.8.7-p352@cucumber do rake cross compile RUBY_CC_VERSION=1.8.7"
9
+ sh "bundle exec rake cross compile RUBY_CC_VERSION=1.9.3"
10
+ # This will copy the .so files to the proper place
11
+ sh "bundle exec rake -t cross compile RUBY_CC_VERSION=1.8.7:1.9.3"
12
+ end
13
+
14
+ desc 'Prepare JRuby binares'
15
+ task :jruby => [:jar] do
16
+ sh "rvm jruby@cucumber exec rspec spec"
17
+ end
18
+
19
+ task :sanity do
20
+ raise "The jruby gem looks too small" if File.stat("release/gherkin-#{GHERKIN_VERSION}-java.gem").size < 1000000
21
+ end
22
+
23
+ desc "Prepare binaries for all gems"
24
+ task :prepare => [
25
+ :clean,
26
+ :spec,
27
+ :win,
28
+ :jruby
29
+ ]
30
+
31
+ end
@@ -0,0 +1,124 @@
1
+ # encoding: utf-8
2
+
3
+ namespace :ikvm do
4
+ IKVM_VERSION = '0.46.0.1'
5
+ IKVM_DIR = "ikvm/ikvm-#{IKVM_VERSION}"
6
+ IKVM_ZIP = "ikvm/ikvmbin-#{IKVM_VERSION}.zip"
7
+ CLOBBER.include(IKVM_DIR, IKVM_ZIP)
8
+ IKVM_BIN_DIR = "#{IKVM_DIR}/bin"
9
+ IKVMC_EXE = "#{IKVM_BIN_DIR}/ikvmc.exe"
10
+ GHERKIN_EXE = "release/gherkin.exe"
11
+ GHERKIN_PKG_DLL = "release/nuspec/lib/gherkin.dll"
12
+ GHERKIN_NUSPEC = "release/nuspec/gherkin.nuspec"
13
+ GHERKIN_NUPKG = "release/gherkin.#{GHERKIN_VERSION}.nupkg"
14
+ GHERKIN_LIB_DLL = 'lib/gherkin.dll'
15
+
16
+ def mono(args)
17
+ if(`which mono`.strip =~ /mono/)
18
+ # http://monomvc.wordpress.com/2012/03/06/nuget-on-mono/
19
+ sh("mono --runtime=v4.0.30319 #{args}")
20
+ else
21
+ raise "[ERROR] You must install Mono and IKVM build gherkin for .NET. See README.md"
22
+ end
23
+ end
24
+
25
+ def ikvmc(args)
26
+ begin
27
+ mono("#{IKVMC_EXE} #{args}")
28
+ rescue => e
29
+ if e.message =~ /Cannot open assembly/
30
+ e.message << "\n\n[ERROR] You must install Mono and IKVM build gherkin for .NET. See README.md"
31
+ end
32
+ raise e
33
+ end
34
+ end
35
+
36
+ def nuget(args)
37
+ mono("/usr/local/nuget/NuGet.exe #{args}")
38
+ end
39
+
40
+ file GHERKIN_EXE => [IKVMC_EXE, 'lib/gherkin.jar'] do
41
+ ikvmc("-target:exe lib/gherkin.jar -out:#{GHERKIN_EXE}")
42
+ end
43
+
44
+ file GHERKIN_PKG_DLL => [IKVMC_EXE, 'lib/gherkin.jar'] do
45
+ mkdir_p File.dirname(GHERKIN_PKG_DLL) unless File.directory?(File.dirname(GHERKIN_PKG_DLL))
46
+ ikvmc("-target:library lib/gherkin.jar -out:#{GHERKIN_PKG_DLL} -version:#{GHERKIN_VERSION}")
47
+ end
48
+
49
+ file GHERKIN_LIB_DLL => GHERKIN_PKG_DLL do
50
+ cp GHERKIN_PKG_DLL, GHERKIN_LIB_DLL
51
+ end
52
+
53
+ file GHERKIN_NUPKG => [GHERKIN_PKG_DLL, GHERKIN_NUSPEC] do
54
+ pkg_dir = File.dirname(GHERKIN_EXE)
55
+ mkdir_p File.dirname(pkg_dir) unless File.directory?(pkg_dir)
56
+ nuget("Pack #{GHERKIN_NUSPEC} -Version #{GHERKIN_VERSION} -OutputDirectory #{pkg_dir}")
57
+ # Now, fix the path inside the file - see https://github.com/cucumber/gherkin/issues/148
58
+ require 'zip/zipfilesystem'
59
+ Zip::ZipFile.open(GHERKIN_NUPKG) do |zipfile|
60
+ begin
61
+ zipfile.file.rename 'lib%2Fgherkin.dll', 'lib/gherkin.dll'
62
+ rescue => looks_like_nuget_has_been_fixed
63
+ end
64
+ end
65
+ end
66
+
67
+ file GHERKIN_NUSPEC do
68
+ mkdir_p File.dirname(GHERKIN_NUSPEC) unless File.directory?(File.dirname(GHERKIN_NUSPEC))
69
+ File.open(GHERKIN_NUSPEC, "w") do |io|
70
+ io.write(<<-EOF)
71
+ <?xml version="1.0"?>
72
+ <package>
73
+ <metadata>
74
+ <id>gherkin</id>
75
+ <version>#{GHERKIN_VERSION}</version>
76
+ <authors>aslakhellesoy</authors>
77
+ <owners>Mike Sassak, Gregory Hnatiuk, Aslak Hellesøy</owners>
78
+ <projectUrl>https://github.com/cucumber/gherkin</projectUrl>
79
+ <licenseUrl>https://github.com/cucumber/gherkin/blob/master/LICENSE</licenseUrl>
80
+ <iconUrl>https://github.com/cucumber/cukes.info/raw/master/templates/images/gherkin/gherkin_128x128.png</iconUrl>
81
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
82
+ <description>A fast lexer and parser for the Gherkin language based on Ragel</description>
83
+ <copyright>Copyright (c) 2009-2011 Mike Sassak, Gregory Hnatiuk, Aslak Hellesøy</copyright>
84
+ <dependencies>
85
+ <dependency id="IKVM" version="#{IKVM_VERSION}" />
86
+ </dependencies>
87
+ <tags>gherkin cucumber specflow bdd lexer parser</tags>
88
+ </metadata>
89
+ </package>
90
+ EOF
91
+ end
92
+ end
93
+
94
+ task :nupkg => GHERKIN_NUPKG
95
+
96
+ task :check => [GHERKIN_EXE, :copy_ikvm_dlls] do
97
+ puts "************** Pretty printing some features with .NET. **************"
98
+ mono "#{GHERKIN_EXE} features"
99
+ puts "************** DONE Pretty printing some features with .NET. All OK. **************"
100
+ end
101
+
102
+ task :copy_ikvm_dlls => IKVMC_EXE do
103
+ exe_dir = File.dirname(GHERKIN_EXE)
104
+ mkdir_p File.dirname(exe_dir) unless File.directory?(exe_dir)
105
+ Dir["#{IKVM_BIN_DIR}/*.dll"].each do |dll|
106
+ cp dll, exe_dir
107
+ end
108
+ end
109
+
110
+ task :push => GHERKIN_NUPKG do
111
+ nuget("Push #{GHERKIN_NUPKG}")
112
+ nuget("Publish gherkin #{GHERKIN_VERSION}")
113
+ end
114
+
115
+ file IKVMC_EXE do
116
+ sh("wget http://downloads.sourceforge.net/project/ikvm/ikvm/#{IKVM_VERSION}/ikvmbin-#{IKVM_VERSION}.zip -O #{IKVM_ZIP}")
117
+ Dir.chdir('ikvm') do
118
+ sh("unzip ikvmbin-#{IKVM_VERSION}.zip")
119
+ end
120
+ end
121
+ end
122
+
123
+ task :ikvm => ['ikvm:check']
124
+
@@ -0,0 +1,100 @@
1
+ require 'yaml'
2
+ require 'erb'
3
+ require 'rbconfig'
4
+
5
+ class RagelTask
6
+ begin
7
+ # Support Rake >= 0.9.0
8
+ require 'rake/dsl_definition'
9
+ include Rake::DSL
10
+ rescue LoadError
11
+ end
12
+
13
+ RL_OUTPUT_DIR = File.dirname(__FILE__) + "/../ragel/i18n"
14
+ UGLIFYJS = File.dirname(__FILE__) + "/../js/node_modules/uglify-js/bin/uglifyjs"
15
+
16
+ def initialize(lang, i18n)
17
+ @lang = lang
18
+ @i18n = i18n
19
+ define_tasks
20
+ end
21
+
22
+ def define_tasks
23
+ deps = [lang_ragel, common_ragel]
24
+ deps.unshift(UGLIFYJS) if(@lang == 'js')
25
+
26
+ file target => deps do
27
+ mkdir_p(File.dirname(target)) unless File.directory?(File.dirname(target))
28
+ sh "ragel #{flags} #{lang_ragel} -o #{target}"
29
+ if(@lang == 'js')
30
+ # Ragel chokes if we put the escaped triple quotes in .rl, so we'll do the replace with sed after the fact. Lots of backslashes!!
31
+ sed = Config::CONFIG['host_os'] =~ /linux/i ? "sed -i" : "sed -i ''"
32
+ sh %{#{sed} 's/ESCAPED_TRIPLE_QUOTE/\\\\\\\\\\\\"\\\\\\\\\\\\"\\\\\\\\\\\\"/' #{target}}
33
+
34
+ # Minify
35
+ sh %{node #{UGLIFYJS} #{target} > #{target.gsub(/\.js$/, '.min.js')}}
36
+ end
37
+ end
38
+
39
+ file UGLIFYJS do
40
+ unless File.exist?(UGLIFYJS)
41
+ Dir.chdir('js') do
42
+ sh "npm install"
43
+ end
44
+ end
45
+ end
46
+
47
+ file lang_ragel => lang_erb do
48
+ write(ERB.new(IO.read(lang_erb)).result(binding), lang_ragel)
49
+ end
50
+
51
+ file common_ragel => common_erb do
52
+ write(ERB.new(IO.read(common_erb)).result(binding), common_ragel)
53
+ end
54
+ end
55
+
56
+ def target
57
+ {
58
+ 'c' => "ext/gherkin_lexer_#{@i18n.underscored_iso_code}/gherkin_lexer_#{@i18n.underscored_iso_code}.c",
59
+ 'java' => "java/src/main/java/gherkin/lexer/i18n/#{@i18n.underscored_iso_code.upcase}.java",
60
+ 'rb' => "lib/gherkin/rb_lexer/#{@i18n.underscored_iso_code}.rb",
61
+ 'js' => "js/lib/gherkin/lexer/#{@i18n.underscored_iso_code}.js"
62
+ }[@lang]
63
+ end
64
+
65
+ def common_ragel
66
+ RL_OUTPUT_DIR + "/lexer_common.#{@i18n.underscored_iso_code}.rl"
67
+ end
68
+
69
+ def common_erb
70
+ File.dirname(__FILE__) + '/../ragel/lexer_common.rl.erb'
71
+ end
72
+
73
+ def lang_ragel
74
+ RL_OUTPUT_DIR + "/#{@i18n.underscored_iso_code}.#{@lang}.rl"
75
+ end
76
+
77
+ def lang_erb
78
+ File.dirname(__FILE__) + "/../ragel/lexer.#{@lang}.rl.erb"
79
+ end
80
+
81
+ def flags
82
+ {
83
+ 'c' => '-C',
84
+ 'java' => '-J',
85
+ 'rb' => '-R',
86
+ 'js' => '-E'
87
+ }[@lang]
88
+ end
89
+
90
+ def write(content, filename)
91
+ mkdir_p(File.dirname(filename)) unless File.directory?(File.dirname(filename))
92
+ File.open(filename, "wb") do |file|
93
+ file.write(content)
94
+ end
95
+ end
96
+
97
+ def ragel_list(keywords)
98
+ "(#{keywords.map{|keyword| %{"#{keyword}"}}.join(' | ')})"
99
+ end
100
+ end