gherkin 2.12.2 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (333) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -15
  3. data/CONTRIBUTING.md +23 -0
  4. data/Gemfile +0 -3
  5. data/LICENSE +18 -17
  6. data/Makefile +65 -0
  7. data/README.md +9 -268
  8. data/Rakefile +17 -19
  9. data/bin/gherkin-generate-ast +21 -0
  10. data/bin/gherkin-generate-pickles +25 -0
  11. data/bin/gherkin-generate-tokens +12 -0
  12. data/gherkin-ruby.razor +218 -0
  13. data/gherkin.gemspec +22 -76
  14. data/lib/gherkin/ast_builder.rb +243 -0
  15. data/lib/gherkin/ast_node.rb +30 -0
  16. data/lib/gherkin/dialect.rb +58 -0
  17. data/lib/gherkin/errors.rb +45 -0
  18. data/lib/gherkin/gherkin-languages.json +2968 -0
  19. data/lib/gherkin/gherkin_line.rb +95 -0
  20. data/lib/gherkin/parser.rb +1910 -0
  21. data/lib/gherkin/pickles/compiler.rb +164 -0
  22. data/lib/gherkin/token.rb +18 -0
  23. data/lib/gherkin/token_formatter_builder.rb +39 -0
  24. data/lib/gherkin/token_matcher.rb +169 -0
  25. data/lib/gherkin/token_scanner.rb +40 -0
  26. data/spec/capture_warnings.rb +68 -0
  27. data/spec/coverage.rb +10 -0
  28. data/spec/gherkin/parser_spec.rb +146 -0
  29. metadata +60 -567
  30. data/.gitattributes +0 -2
  31. data/.mailmap +0 -2
  32. data/.rbenv-gemsets +0 -1
  33. data/.rspec +0 -1
  34. data/.ruby-gemset +0 -1
  35. data/.ruby-version +0 -1
  36. data/.yardopts +0 -5
  37. data/History.md +0 -881
  38. data/build_native_gems.sh +0 -7
  39. data/cucumber.yml +0 -5
  40. data/examples/parse_and_output_json.rb +0 -19
  41. data/ext/gherkin_lexer_ar/extconf.rb +0 -6
  42. data/ext/gherkin_lexer_ar/gherkin_lexer_ar.c +0 -1432
  43. data/ext/gherkin_lexer_bg/extconf.rb +0 -6
  44. data/ext/gherkin_lexer_bg/gherkin_lexer_bg.c +0 -1655
  45. data/ext/gherkin_lexer_bm/extconf.rb +0 -6
  46. data/ext/gherkin_lexer_bm/gherkin_lexer_bm.c +0 -1516
  47. data/ext/gherkin_lexer_ca/extconf.rb +0 -6
  48. data/ext/gherkin_lexer_ca/gherkin_lexer_ca.c +0 -1581
  49. data/ext/gherkin_lexer_cs/extconf.rb +0 -6
  50. data/ext/gherkin_lexer_cs/gherkin_lexer_cs.c +0 -1515
  51. data/ext/gherkin_lexer_cy_gb/extconf.rb +0 -6
  52. data/ext/gherkin_lexer_cy_gb/gherkin_lexer_cy_gb.c +0 -1282
  53. data/ext/gherkin_lexer_da/extconf.rb +0 -6
  54. data/ext/gherkin_lexer_da/gherkin_lexer_da.c +0 -1298
  55. data/ext/gherkin_lexer_de/extconf.rb +0 -6
  56. data/ext/gherkin_lexer_de/gherkin_lexer_de.c +0 -1425
  57. data/ext/gherkin_lexer_el/extconf.rb +0 -6
  58. data/ext/gherkin_lexer_el/gherkin_lexer_el.c +0 -1919
  59. data/ext/gherkin_lexer_en/extconf.rb +0 -6
  60. data/ext/gherkin_lexer_en/gherkin_lexer_en.c +0 -1418
  61. data/ext/gherkin_lexer_en_au/extconf.rb +0 -6
  62. data/ext/gherkin_lexer_en_au/gherkin_lexer_en_au.c +0 -1765
  63. data/ext/gherkin_lexer_en_lol/extconf.rb +0 -6
  64. data/ext/gherkin_lexer_en_lol/gherkin_lexer_en_lol.c +0 -1177
  65. data/ext/gherkin_lexer_en_old/extconf.rb +0 -6
  66. data/ext/gherkin_lexer_en_old/gherkin_lexer_en_old.c +0 -1309
  67. data/ext/gherkin_lexer_en_pirate/extconf.rb +0 -6
  68. data/ext/gherkin_lexer_en_pirate/gherkin_lexer_en_pirate.c +0 -1471
  69. data/ext/gherkin_lexer_en_scouse/extconf.rb +0 -6
  70. data/ext/gherkin_lexer_en_scouse/gherkin_lexer_en_scouse.c +0 -1634
  71. data/ext/gherkin_lexer_en_tx/extconf.rb +0 -6
  72. data/ext/gherkin_lexer_en_tx/gherkin_lexer_en_tx.c +0 -1265
  73. data/ext/gherkin_lexer_eo/extconf.rb +0 -6
  74. data/ext/gherkin_lexer_eo/gherkin_lexer_eo.c +0 -1241
  75. data/ext/gherkin_lexer_es/extconf.rb +0 -6
  76. data/ext/gherkin_lexer_es/gherkin_lexer_es.c +0 -1399
  77. data/ext/gherkin_lexer_et/extconf.rb +0 -6
  78. data/ext/gherkin_lexer_et/gherkin_lexer_et.c +0 -1236
  79. data/ext/gherkin_lexer_fa/extconf.rb +0 -6
  80. data/ext/gherkin_lexer_fa/gherkin_lexer_fa.c +0 -1475
  81. data/ext/gherkin_lexer_fi/extconf.rb +0 -6
  82. data/ext/gherkin_lexer_fi/gherkin_lexer_fi.c +0 -1215
  83. data/ext/gherkin_lexer_fr/extconf.rb +0 -6
  84. data/ext/gherkin_lexer_fr/gherkin_lexer_fr.c +0 -1493
  85. data/ext/gherkin_lexer_gl/extconf.rb +0 -6
  86. data/ext/gherkin_lexer_gl/gherkin_lexer_gl.c +0 -1374
  87. data/ext/gherkin_lexer_he/extconf.rb +0 -6
  88. data/ext/gherkin_lexer_he/gherkin_lexer_he.c +0 -1374
  89. data/ext/gherkin_lexer_hi/extconf.rb +0 -6
  90. data/ext/gherkin_lexer_hi/gherkin_lexer_hi.c +0 -1848
  91. data/ext/gherkin_lexer_hr/extconf.rb +0 -6
  92. data/ext/gherkin_lexer_hr/gherkin_lexer_hr.c +0 -1323
  93. data/ext/gherkin_lexer_hu/extconf.rb +0 -6
  94. data/ext/gherkin_lexer_hu/gherkin_lexer_hu.c +0 -1376
  95. data/ext/gherkin_lexer_id/extconf.rb +0 -6
  96. data/ext/gherkin_lexer_id/gherkin_lexer_id.c +0 -1208
  97. data/ext/gherkin_lexer_is/extconf.rb +0 -6
  98. data/ext/gherkin_lexer_is/gherkin_lexer_is.c +0 -1376
  99. data/ext/gherkin_lexer_it/extconf.rb +0 -6
  100. data/ext/gherkin_lexer_it/gherkin_lexer_it.c +0 -1340
  101. data/ext/gherkin_lexer_ja/extconf.rb +0 -6
  102. data/ext/gherkin_lexer_ja/gherkin_lexer_ja.c +0 -1699
  103. data/ext/gherkin_lexer_kn/extconf.rb +0 -6
  104. data/ext/gherkin_lexer_kn/gherkin_lexer_kn.c +0 -1965
  105. data/ext/gherkin_lexer_ko/extconf.rb +0 -6
  106. data/ext/gherkin_lexer_ko/gherkin_lexer_ko.c +0 -1360
  107. data/ext/gherkin_lexer_lt/extconf.rb +0 -6
  108. data/ext/gherkin_lexer_lt/gherkin_lexer_lt.c +0 -1296
  109. data/ext/gherkin_lexer_lu/extconf.rb +0 -6
  110. data/ext/gherkin_lexer_lu/gherkin_lexer_lu.c +0 -1389
  111. data/ext/gherkin_lexer_lv/extconf.rb +0 -6
  112. data/ext/gherkin_lexer_lv/gherkin_lexer_lv.c +0 -1425
  113. data/ext/gherkin_lexer_nl/extconf.rb +0 -6
  114. data/ext/gherkin_lexer_nl/gherkin_lexer_nl.c +0 -1368
  115. data/ext/gherkin_lexer_no/extconf.rb +0 -6
  116. data/ext/gherkin_lexer_no/gherkin_lexer_no.c +0 -1311
  117. data/ext/gherkin_lexer_pa/extconf.rb +0 -6
  118. data/ext/gherkin_lexer_pa/gherkin_lexer_pa.c +0 -2160
  119. data/ext/gherkin_lexer_pl/extconf.rb +0 -6
  120. data/ext/gherkin_lexer_pl/gherkin_lexer_pl.c +0 -1738
  121. data/ext/gherkin_lexer_pt/extconf.rb +0 -6
  122. data/ext/gherkin_lexer_pt/gherkin_lexer_pt.c +0 -1711
  123. data/ext/gherkin_lexer_ro/extconf.rb +0 -6
  124. data/ext/gherkin_lexer_ro/gherkin_lexer_ro.c +0 -1427
  125. data/ext/gherkin_lexer_ru/extconf.rb +0 -6
  126. data/ext/gherkin_lexer_ru/gherkin_lexer_ru.c +0 -2071
  127. data/ext/gherkin_lexer_sk/extconf.rb +0 -6
  128. data/ext/gherkin_lexer_sk/gherkin_lexer_sk.c +0 -1739
  129. data/ext/gherkin_lexer_sr_cyrl/extconf.rb +0 -6
  130. data/ext/gherkin_lexer_sr_cyrl/gherkin_lexer_sr_cyrl.c +0 -2112
  131. data/ext/gherkin_lexer_sr_latn/extconf.rb +0 -6
  132. data/ext/gherkin_lexer_sr_latn/gherkin_lexer_sr_latn.c +0 -1567
  133. data/ext/gherkin_lexer_sv/extconf.rb +0 -6
  134. data/ext/gherkin_lexer_sv/gherkin_lexer_sv.c +0 -1324
  135. data/ext/gherkin_lexer_th/extconf.rb +0 -6
  136. data/ext/gherkin_lexer_th/gherkin_lexer_th.c +0 -2840
  137. data/ext/gherkin_lexer_tl/extconf.rb +0 -6
  138. data/ext/gherkin_lexer_tl/gherkin_lexer_tl.c +0 -2021
  139. data/ext/gherkin_lexer_tr/extconf.rb +0 -6
  140. data/ext/gherkin_lexer_tr/gherkin_lexer_tr.c +0 -1347
  141. data/ext/gherkin_lexer_tt/extconf.rb +0 -6
  142. data/ext/gherkin_lexer_tt/gherkin_lexer_tt.c +0 -1936
  143. data/ext/gherkin_lexer_uk/extconf.rb +0 -6
  144. data/ext/gherkin_lexer_uk/gherkin_lexer_uk.c +0 -1941
  145. data/ext/gherkin_lexer_uz/extconf.rb +0 -6
  146. data/ext/gherkin_lexer_uz/gherkin_lexer_uz.c +0 -1651
  147. data/ext/gherkin_lexer_vi/extconf.rb +0 -6
  148. data/ext/gherkin_lexer_vi/gherkin_lexer_vi.c +0 -1458
  149. data/ext/gherkin_lexer_zh_cn/extconf.rb +0 -6
  150. data/ext/gherkin_lexer_zh_cn/gherkin_lexer_zh_cn.c +0 -1314
  151. data/ext/gherkin_lexer_zh_tw/extconf.rb +0 -6
  152. data/ext/gherkin_lexer_zh_tw/gherkin_lexer_zh_tw.c +0 -1307
  153. data/features/.cucumber/stepdefs.json +0 -244
  154. data/features/escaped_pipes.feature +0 -8
  155. data/features/feature_parser.feature +0 -237
  156. data/features/json_formatter.feature +0 -498
  157. data/features/json_parser.feature +0 -331
  158. data/features/native_lexer.feature +0 -19
  159. data/features/parser_with_native_lexer.feature +0 -205
  160. data/features/pretty_formatter.feature +0 -17
  161. data/features/step_definitions/eyeball_steps.rb +0 -3
  162. data/features/step_definitions/gherkin_steps.rb +0 -29
  163. data/features/step_definitions/json_formatter_steps.rb +0 -30
  164. data/features/step_definitions/json_parser_steps.rb +0 -21
  165. data/features/step_definitions/pretty_formatter_steps.rb +0 -85
  166. data/features/steps_parser.feature +0 -46
  167. data/features/support/env.rb +0 -41
  168. data/install_mingw_os_x.sh +0 -5
  169. data/js/.npmignore +0 -1
  170. data/js/lib/gherkin/lexer/.npmignore +0 -0
  171. data/lib/gherkin.rb +0 -2
  172. data/lib/gherkin/README.md +0 -7
  173. data/lib/gherkin/c_lexer.rb +0 -17
  174. data/lib/gherkin/formatter/ansi_escapes.rb +0 -97
  175. data/lib/gherkin/formatter/argument.rb +0 -16
  176. data/lib/gherkin/formatter/escaping.rb +0 -15
  177. data/lib/gherkin/formatter/filter_formatter.rb +0 -150
  178. data/lib/gherkin/formatter/hashable.rb +0 -25
  179. data/lib/gherkin/formatter/json_formatter.rb +0 -133
  180. data/lib/gherkin/formatter/line_filter.rb +0 -26
  181. data/lib/gherkin/formatter/model.rb +0 -281
  182. data/lib/gherkin/formatter/pretty_formatter.rb +0 -245
  183. data/lib/gherkin/formatter/regexp_filter.rb +0 -21
  184. data/lib/gherkin/formatter/step_printer.rb +0 -21
  185. data/lib/gherkin/formatter/tag_count_formatter.rb +0 -47
  186. data/lib/gherkin/formatter/tag_filter.rb +0 -19
  187. data/lib/gherkin/i18n.json +0 -786
  188. data/lib/gherkin/i18n.rb +0 -176
  189. data/lib/gherkin/json_parser.rb +0 -177
  190. data/lib/gherkin/lexer/ar.rb +0 -1170
  191. data/lib/gherkin/lexer/bg.rb +0 -1382
  192. data/lib/gherkin/lexer/bm.rb +0 -1250
  193. data/lib/gherkin/lexer/ca.rb +0 -1310
  194. data/lib/gherkin/lexer/cs.rb +0 -1246
  195. data/lib/gherkin/lexer/cy_gb.rb +0 -1032
  196. data/lib/gherkin/lexer/da.rb +0 -1048
  197. data/lib/gherkin/lexer/de.rb +0 -1166
  198. data/lib/gherkin/lexer/el.rb +0 -1628
  199. data/lib/gherkin/lexer/en.rb +0 -1156
  200. data/lib/gherkin/lexer/en_au.rb +0 -1486
  201. data/lib/gherkin/lexer/en_lol.rb +0 -934
  202. data/lib/gherkin/lexer/en_old.rb +0 -1037
  203. data/lib/gherkin/lexer/en_pirate.rb +0 -1210
  204. data/lib/gherkin/lexer/en_scouse.rb +0 -1362
  205. data/lib/gherkin/lexer/en_tx.rb +0 -1016
  206. data/lib/gherkin/lexer/encoding.rb +0 -41
  207. data/lib/gherkin/lexer/eo.rb +0 -995
  208. data/lib/gherkin/lexer/es.rb +0 -1140
  209. data/lib/gherkin/lexer/et.rb +0 -990
  210. data/lib/gherkin/lexer/fa.rb +0 -1214
  211. data/lib/gherkin/lexer/fi.rb +0 -969
  212. data/lib/gherkin/lexer/fr.rb +0 -1228
  213. data/lib/gherkin/lexer/gl.rb +0 -1117
  214. data/lib/gherkin/lexer/he.rb +0 -1118
  215. data/lib/gherkin/lexer/hi.rb +0 -1559
  216. data/lib/gherkin/lexer/hr.rb +0 -1066
  217. data/lib/gherkin/lexer/hu.rb +0 -1118
  218. data/lib/gherkin/lexer/i18n_lexer.rb +0 -48
  219. data/lib/gherkin/lexer/id.rb +0 -963
  220. data/lib/gherkin/lexer/is.rb +0 -1120
  221. data/lib/gherkin/lexer/it.rb +0 -1086
  222. data/lib/gherkin/lexer/ja.rb +0 -1418
  223. data/lib/gherkin/lexer/kn.rb +0 -1672
  224. data/lib/gherkin/lexer/ko.rb +0 -1102
  225. data/lib/gherkin/lexer/lt.rb +0 -1045
  226. data/lib/gherkin/lexer/lu.rb +0 -1132
  227. data/lib/gherkin/lexer/lv.rb +0 -1166
  228. data/lib/gherkin/lexer/nl.rb +0 -1115
  229. data/lib/gherkin/lexer/no.rb +0 -1060
  230. data/lib/gherkin/lexer/pa.rb +0 -1852
  231. data/lib/gherkin/lexer/pl.rb +0 -1457
  232. data/lib/gherkin/lexer/pt.rb +0 -1430
  233. data/lib/gherkin/lexer/ro.rb +0 -1164
  234. data/lib/gherkin/lexer/ru.rb +0 -1766
  235. data/lib/gherkin/lexer/sk.rb +0 -1452
  236. data/lib/gherkin/lexer/sr_cyrl.rb +0 -1803
  237. data/lib/gherkin/lexer/sr_latn.rb +0 -1294
  238. data/lib/gherkin/lexer/sv.rb +0 -1070
  239. data/lib/gherkin/lexer/th.rb +0 -2492
  240. data/lib/gherkin/lexer/tl.rb +0 -1726
  241. data/lib/gherkin/lexer/tr.rb +0 -1092
  242. data/lib/gherkin/lexer/tt.rb +0 -1643
  243. data/lib/gherkin/lexer/uk.rb +0 -1646
  244. data/lib/gherkin/lexer/uz.rb +0 -1376
  245. data/lib/gherkin/lexer/vi.rb +0 -1198
  246. data/lib/gherkin/lexer/zh_cn.rb +0 -1058
  247. data/lib/gherkin/lexer/zh_tw.rb +0 -1052
  248. data/lib/gherkin/listener/event.rb +0 -45
  249. data/lib/gherkin/listener/formatter_listener.rb +0 -150
  250. data/lib/gherkin/native.rb +0 -7
  251. data/lib/gherkin/native/java.rb +0 -72
  252. data/lib/gherkin/native/null.rb +0 -5
  253. data/lib/gherkin/native/therubyracer.rb +0 -41
  254. data/lib/gherkin/parser/meta.txt +0 -5
  255. data/lib/gherkin/parser/parser.rb +0 -166
  256. data/lib/gherkin/parser/root.txt +0 -11
  257. data/lib/gherkin/parser/steps.txt +0 -4
  258. data/lib/gherkin/platform.rb +0 -13
  259. data/lib/gherkin/rubify.rb +0 -31
  260. data/lib/gherkin/tag_expression.rb +0 -63
  261. data/ragel/lexer.c.rl.erb +0 -454
  262. data/ragel/lexer.java.rl.erb +0 -219
  263. data/ragel/lexer.js.rl.erb +0 -322
  264. data/ragel/lexer.rb.rl.erb +0 -179
  265. data/ragel/lexer_common.rl.erb +0 -50
  266. data/spec/gherkin/c_lexer_spec.rb +0 -22
  267. data/spec/gherkin/fixtures/1.feature +0 -8
  268. data/spec/gherkin/fixtures/comments_in_table.feature +0 -9
  269. data/spec/gherkin/fixtures/complex.feature +0 -45
  270. data/spec/gherkin/fixtures/complex.json +0 -139
  271. data/spec/gherkin/fixtures/complex_for_filtering.feature +0 -60
  272. data/spec/gherkin/fixtures/complex_with_tags.feature +0 -61
  273. data/spec/gherkin/fixtures/dos_line_endings.feature +0 -45
  274. data/spec/gherkin/fixtures/examples_with_only_header.feature +0 -14
  275. data/spec/gherkin/fixtures/hantu_pisang.feature +0 -35
  276. data/spec/gherkin/fixtures/i18n_fr.feature +0 -14
  277. data/spec/gherkin/fixtures/i18n_fr2.feature +0 -8
  278. data/spec/gherkin/fixtures/i18n_no.feature +0 -7
  279. data/spec/gherkin/fixtures/i18n_pt1.feature +0 -44
  280. data/spec/gherkin/fixtures/i18n_pt2.feature +0 -4
  281. data/spec/gherkin/fixtures/i18n_pt3.feature +0 -4
  282. data/spec/gherkin/fixtures/i18n_pt4.feature +0 -4
  283. data/spec/gherkin/fixtures/i18n_zh-CN.feature +0 -9
  284. data/spec/gherkin/fixtures/iso-8859-1.feature +0 -6
  285. data/spec/gherkin/fixtures/issue_145.feature +0 -22
  286. data/spec/gherkin/fixtures/scenario_outline_with_tags.feature +0 -13
  287. data/spec/gherkin/fixtures/scenario_without_steps.feature +0 -5
  288. data/spec/gherkin/fixtures/simple_with_comments.feature +0 -7
  289. data/spec/gherkin/fixtures/simple_with_tags.feature +0 -11
  290. data/spec/gherkin/fixtures/with_bom.feature +0 -3
  291. data/spec/gherkin/fixtures/with_bom_and_language_spec.feature +0 -4
  292. data/spec/gherkin/formatter/ansi_escapes_spec.rb +0 -32
  293. data/spec/gherkin/formatter/filter_formatter_spec.rb +0 -204
  294. data/spec/gherkin/formatter/json_formatter_spec.rb +0 -179
  295. data/spec/gherkin/formatter/model_spec.rb +0 -28
  296. data/spec/gherkin/formatter/pretty_formatter_spec.rb +0 -184
  297. data/spec/gherkin/formatter/spaces.feature +0 -9
  298. data/spec/gherkin/formatter/step_printer_spec.rb +0 -55
  299. data/spec/gherkin/formatter/tabs.feature +0 -9
  300. data/spec/gherkin/formatter/tag_count_formatter_spec.rb +0 -30
  301. data/spec/gherkin/i18n_spec.rb +0 -256
  302. data/spec/gherkin/java_lexer_spec.rb +0 -20
  303. data/spec/gherkin/json_parser_spec.rb +0 -165
  304. data/spec/gherkin/lexer/i18n_lexer_spec.rb +0 -65
  305. data/spec/gherkin/native_lexer_spec.rb +0 -29
  306. data/spec/gherkin/parser/parser_spec.rb +0 -16
  307. data/spec/gherkin/rubify_spec.rb +0 -23
  308. data/spec/gherkin/sexp_recorder.rb +0 -59
  309. data/spec/gherkin/shared/doc_string_group.rb +0 -161
  310. data/spec/gherkin/shared/encoding_group.rb +0 -48
  311. data/spec/gherkin/shared/lexer_group.rb +0 -589
  312. data/spec/gherkin/shared/row_group.rb +0 -123
  313. data/spec/gherkin/shared/tags_group.rb +0 -52
  314. data/spec/gherkin/tag_expression_spec.rb +0 -146
  315. data/spec/spec_helper.rb +0 -94
  316. data/tasks/apidoc.rake +0 -32
  317. data/tasks/bench.rake +0 -184
  318. data/tasks/bench/feature_builder.rb +0 -49
  319. data/tasks/bench/null_listener.rb +0 -4
  320. data/tasks/compile.rake +0 -83
  321. data/tasks/cucumber.rake +0 -23
  322. data/tasks/gems.rake +0 -46
  323. data/tasks/ikvm.rake +0 -126
  324. data/tasks/ragel_task.rb +0 -124
  325. data/tasks/release.rake +0 -34
  326. data/tasks/rspec.rake +0 -6
  327. data/tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  328. data/tasks/yard/default/layout/html/bubble_48x48.png +0 -0
  329. data/tasks/yard/default/layout/html/footer.erb +0 -5
  330. data/tasks/yard/default/layout/html/index.erb +0 -1
  331. data/tasks/yard/default/layout/html/layout.erb +0 -25
  332. data/tasks/yard/default/layout/html/logo.erb +0 -1
  333. data/tasks/yard/default/layout/html/setup.rb +0 -4
@@ -1,184 +0,0 @@
1
- %w{/../lib /bench}.each do |l|
2
- $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + l)
3
- end
4
-
5
- require 'benchmark'
6
-
7
- GENERATED_FEATURES = File.expand_path(File.dirname(__FILE__) + "/bench/generated")
8
-
9
- class RandomFeatureGenerator
10
- def initialize(number)
11
- require 'faker'
12
- require 'feature_builder'
13
-
14
- @number = number
15
- end
16
-
17
- def generate
18
- @number.times do
19
- name = catch_phrase
20
- feature = FeatureBuilder.new(name) do |f|
21
- num_scenarios = rand_in(1..10)
22
- num_scenarios.times do
23
- f.scenario(bs) do |steps|
24
- num_steps = rand_in(3..10)
25
- num_steps.times do
26
- steps.step(sentence, self)
27
- end
28
- end
29
- end
30
- end
31
- write feature.to_s, name
32
- end
33
- end
34
-
35
- def write(content, name)
36
- File.open(GENERATED_FEATURES + "/#{name.downcase.gsub(/[\s\-\/]/, '_')}.feature", "w+") do |file|
37
- file << content
38
- end
39
- end
40
-
41
- def rand_in(range)
42
- ary = range.to_a
43
- ary[rand(ary.length - 1)]
44
- end
45
-
46
- def catch_phrase
47
- Faker::Company.catch_phrase
48
- end
49
-
50
- def bs
51
- Faker::Company.bs.capitalize
52
- end
53
-
54
- def sentence
55
- Faker::Lorem.sentence
56
- end
57
-
58
- def table_cell
59
- Faker::Lorem.words(rand(2)+1).join(" ")
60
- end
61
- end
62
-
63
- class Benchmarker
64
- def initialize
65
- @features = Dir[GENERATED_FEATURES + "/**/*feature"]
66
- end
67
-
68
- def report(lexer)
69
- Benchmark.bm do |x|
70
- x.report("#{lexer}:") { send :"run_#{lexer}" }
71
- end
72
- end
73
-
74
- def report_all
75
- Benchmark.bmbm do |x|
76
- x.report("native_gherkin:") { run_native_gherkin }
77
- x.report("native_gherkin_no_parser:") { run_native_gherkin_no_parser }
78
- x.report("rb_gherkin:") { run_rb_gherkin }
79
- x.report("cucumber:") { run_cucumber }
80
- x.report("tt:") { run_tt }
81
- end
82
- end
83
-
84
- def run_cucumber
85
- require 'cucumber'
86
- require 'logger'
87
- step_mother = Cucumber::StepMother.new
88
- logger = Logger.new(STDOUT)
89
- logger.level = Logger::INFO
90
- step_mother.log = logger
91
- step_mother.load_plain_text_features(@features)
92
- end
93
-
94
- def run_tt
95
- require 'cucumber'
96
- # Using Cucumber's Treetop lexer, but never calling #build to build the AST
97
- lexer = Cucumber::Parser::NaturalLanguage.new(nil, 'en').parser
98
- @features.each do |file|
99
- source = IO.read(file)
100
- parse_tree = lexer.parse(source)
101
- if parse_tree.nil?
102
- raise Cucumber::Parser::SyntaxError.new(lexer, file, 0)
103
- end
104
- end
105
- end
106
-
107
- def run_rb_gherkin
108
- require 'gherkin'
109
- require 'null_formatter'
110
- parser = Gherkin::Parser::Parser.new(NullFormatter.new, true, "root", true)
111
- @features.each do |feature|
112
- parser.parse(File.read(feature), feature, 0)
113
- end
114
- end
115
-
116
- def run_native_gherkin
117
- require 'gherkin'
118
- require 'null_listener'
119
- parser = Gherkin::Parser::Parser.new(NullFormatter.new, true, "root", false)
120
- @features.each do |feature|
121
- parser.parse(File.read(feature), feature, 0)
122
- end
123
- end
124
-
125
- def run_native_gherkin_no_parser
126
- require 'gherkin'
127
- require 'gherkin/lexer/i18n_lexer'
128
- require 'null_listener'
129
- lexer = Gherkin::Lexer::I18nLexer.new(NullListener.new, false)
130
- @features.each do |feature|
131
- lexer.scan(File.read(feature), feature, 0)
132
- end
133
- end
134
- end
135
-
136
- desc "Generate 500 random features and benchmark Cucumber, Treetop and Gherkin with them"
137
- task :bench => ["bench:clean", "bench:gen"] do
138
- benchmarker = Benchmarker.new
139
- benchmarker.report_all
140
- end
141
-
142
- namespace :bench do
143
- desc "Generate [number] features with random content, or 500 features if number is not provided"
144
- task :gen, :number do |t, args|
145
- args.with_defaults(:number => 500)
146
- generator = RandomFeatureGenerator.new(args.number.to_i)
147
- generator.generate
148
- end
149
-
150
- desc "Benchmark Cucumber AST building from the features in tasks/bench/generated"
151
- task :cucumber do
152
- benchmarker = Benchmarker.new
153
- benchmarker.report("cucumber")
154
- end
155
-
156
- desc "Benchmark the Treetop parser with the features in tasks/bench/generated"
157
- task :tt do
158
- benchmarker = Benchmarker.new
159
- benchmarker.report("tt")
160
- end
161
-
162
- desc "Benchmark the Ruby Gherkin lexer+parser with the features in tasks/bench/generated"
163
- task :rb_gherkin do
164
- benchmarker = Benchmarker.new
165
- benchmarker.report("rb_gherkin")
166
- end
167
-
168
- desc "Benchmark the ntive Gherkin lexer+parser with the features in tasks/bench/generated"
169
- task :native_gherkin do
170
- benchmarker = Benchmarker.new
171
- benchmarker.report("native_gherkin")
172
- end
173
-
174
- desc "Benchmark the native Gherkin lexer (no parser) with the features in tasks/bench/generated"
175
- task :native_gherkin_no_parser do
176
- benchmarker = Benchmarker.new
177
- benchmarker.report("native_gherkin_no_parser")
178
- end
179
-
180
- desc "Remove all generated features in tasks/bench/generated"
181
- task :clean do
182
- rm_f FileList[GENERATED_FEATURES + "/**/*feature"]
183
- end
184
- end
@@ -1,49 +0,0 @@
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
-
@@ -1,4 +0,0 @@
1
- class NullListener
2
- def method_missing(*args)
3
- end
4
- end
@@ -1,83 +0,0 @@
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
- 'lib/*.dll',
10
- 'ext/**/*.c',
11
- 'doc'
12
- ]
13
-
14
- desc "Compile the Java extensions"
15
- task :jar => 'lib/gherkin.jar'
16
-
17
- file 'lib/gherkin.jar' => Dir['java/src/main/java/**/*.java'] do
18
- sh("mvn -f java/pom.xml package")
19
- end
20
-
21
- desc "Build JavaScript lexers"
22
- task :js
23
-
24
- rl_langs = ENV['RL_LANGS'] ? ENV['RL_LANGS'].split(',') : []
25
- langs = Gherkin::I18n.all.select { |lang| rl_langs.empty? || rl_langs.include?(lang.iso_code) }
26
-
27
- langs.each do |i18n|
28
- java = RagelTask.new('java', i18n)
29
- rb = RagelTask.new('rb', i18n)
30
- js = RagelTask.new('js', i18n)
31
-
32
- file 'lib/gherkin.jar' => [java.target]
33
-
34
- begin
35
- if !defined?(JRUBY_VERSION)
36
- require 'rake/extensiontask'
37
-
38
- c = RagelTask.new('c', i18n)
39
-
40
- extconf = "ext/gherkin_lexer_#{i18n.underscored_iso_code}/extconf.rb"
41
- file extconf do
42
- FileUtils.mkdir(File.dirname(extconf)) unless File.directory?(File.dirname(extconf))
43
- File.open(extconf, "w") do |io|
44
- io.write(<<-EOF)
45
- require 'mkmf'
46
- CONFIG['warnflags'].gsub!(/-Wshorten-64-to-32/, '') if CONFIG['warnflags']
47
- $CFLAGS << ' -O0 -Wall' if CONFIG['CC'] =~ /gcc|clang/
48
- dir_config("gherkin_lexer_#{i18n.underscored_iso_code}")
49
- have_library("c", "main")
50
- create_makefile("gherkin_lexer_#{i18n.underscored_iso_code}")
51
- EOF
52
- end
53
- end
54
-
55
- Rake::ExtensionTask.new("gherkin_lexer_#{i18n.underscored_iso_code}") do |ext|
56
- if ENV['RUBY_CC_VERSION']
57
- ext.cross_compile = true
58
- ext.cross_platform = 'x86-mingw32'
59
- end
60
- end
61
-
62
- # The way tasks are defined with compile:xxx (but without namespace) in rake-compiler forces us
63
- # to use these hacks for setting up dependencies. Ugly!
64
- Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(extconf)
65
- Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(c.target)
66
- Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(rb.target)
67
- Rake::Task["compile:gherkin_lexer_#{i18n.underscored_iso_code}"].prerequisites.unshift(js.target) if ENV['GHERKIN_JS']
68
-
69
- Rake::Task["compile"].prerequisites.unshift(extconf)
70
- Rake::Task["compile"].prerequisites.unshift(c.target)
71
- Rake::Task["compile"].prerequisites.unshift(rb.target)
72
- Rake::Task["compile"].prerequisites.unshift(js.target) if ENV['GHERKIN_JS']
73
-
74
- Rake::Task["js"].prerequisites.unshift(js.target) if ENV['GHERKIN_JS']
75
- end
76
- rescue LoadError
77
- unless defined?($c_warned)
78
- warn "WARNING: Rake::ExtensionTask not installed. Skipping C compilation."
79
- $c_warned = true
80
- task :compile # no-op
81
- end
82
- end
83
- end
@@ -1,23 +0,0 @@
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
- profile = 'javascript' if ENV['GHERKIN_JS_NATIVE']
8
- t.cucumber_opts = "--profile #{profile}"
9
- end
10
-
11
- namespace :cucumber do
12
- Cucumber::Rake::Task.new(:rcov, "Run Cucumber using RCov") do |t|
13
- t.cucumber_opts = "--profile default"
14
- t.rcov = RUBY_VERSION =~ /^1\.8/
15
- t.rcov_opts = %w{--exclude spec\/}
16
- end
17
-
18
- Cucumber::Rake::Task.new(:native_lexer, "Run Native lexer Cucumber features") do |t|
19
- t.cucumber_opts = "--profile native_lexer"
20
- end
21
- task :native_lexer => [:clean, :compile]
22
- end
23
- end
@@ -1,46 +0,0 @@
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.md"
5
- exit(1)
6
- end
7
- # rvm and mingw ruby versions have to match to avoid errors
8
- rbenv('1.9.3-p448') do
9
- sh "bundle exec rake cross compile RUBY_CC_VERSION=1.9.3"
10
- end
11
- rbenv('2.0.0-p247') do
12
- sh "bundle exec rake cross compile RUBY_CC_VERSION=2.0.0"
13
- end
14
- # This will copy the .so files to the proper place
15
- sh "bundle exec rake -t cross compile RUBY_CC_VERSION=1.9.3:2.0.0"
16
- end
17
-
18
- desc 'Prepare JRuby binares'
19
- task :jruby => [:jar] do
20
- rbenv('jruby-1.7.4') do
21
- sh "bundle exec rspec spec"
22
- end
23
- end
24
-
25
- task :sanity do
26
- raise "The jruby gem looks too small" if File.stat("release/gherkin-#{GHERKIN_VERSION}-java.gem").size < 1000000
27
- end
28
-
29
- desc "Prepare binaries for all gems"
30
- task :prepare => [
31
- :clean,
32
- :spec,
33
- :win,
34
- :jruby
35
- ]
36
-
37
- # https://github.com/sstephenson/rbenv/issues/121
38
- def rbenv(version)
39
- old_version = ENV['RBENV_VERSION']
40
- ENV['RBENV_VERSION'] = version
41
- yield
42
- ensure
43
- ENV['RBENV_VERSION'] = old_version
44
- end
45
-
46
- end
@@ -1,126 +0,0 @@
1
- # encoding: utf-8
2
-
3
- namespace :ikvm do
4
- IKVM_VERSION = '7.2.4630.5'
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("ikvm/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, verify that we have a proper dll inside the package
58
- require 'zip'
59
- Zip::File.open(GHERKIN_NUPKG) do |zipfile|
60
- dll = zipfile.get_entry('lib/gherkin.dll')
61
- if(dll.size < 3_000_000)
62
- raise "Looks like the dll is too small."
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-2013 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
- <files>
90
- <file src="lib/gherkin.dll" target="lib/gherkin.dll" />
91
- </files>
92
- </package>
93
- EOF
94
- end
95
- end
96
-
97
- task :nupkg => GHERKIN_NUPKG
98
-
99
- task :check => [GHERKIN_EXE, :copy_ikvm_dlls] do
100
- puts "************** Pretty printing some features with .NET. **************"
101
- mono "#{GHERKIN_EXE} features"
102
- puts "************** DONE Pretty printing some features with .NET. All OK. **************"
103
- end
104
-
105
- task :copy_ikvm_dlls => IKVMC_EXE do
106
- exe_dir = File.dirname(GHERKIN_EXE)
107
- mkdir_p File.dirname(exe_dir) unless File.directory?(exe_dir)
108
- Dir["#{IKVM_BIN_DIR}/*.dll"].each do |dll|
109
- cp dll, exe_dir
110
- end
111
- end
112
-
113
- task :push => GHERKIN_NUPKG do
114
- nuget("Push #{GHERKIN_NUPKG}")
115
- end
116
-
117
- file IKVMC_EXE do
118
- sh("wget http://downloads.sourceforge.net/project/ikvm/ikvm/#{IKVM_VERSION}/ikvmbin-#{IKVM_VERSION}.zip -O #{IKVM_ZIP}")
119
- Dir.chdir('ikvm') do
120
- sh("unzip ikvmbin-#{IKVM_VERSION}.zip")
121
- end
122
- end
123
- end
124
-
125
- task :ikvm => ['ikvm:check']
126
-