square-cucumber 0.3.12.2

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 (408) hide show
  1. data/History.txt +830 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +410 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +76 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +30 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en-lol/Rakefile +6 -0
  46. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  47. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  48. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  49. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  50. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  51. data/examples/i18n/en/Rakefile +6 -0
  52. data/examples/i18n/en/features/addition.feature +17 -0
  53. data/examples/i18n/en/features/division.feature +10 -0
  54. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  55. data/examples/i18n/en/lib/calculator.rb +14 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +16 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/zh-CN/Rakefile +6 -0
  151. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  152. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  153. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  154. data/examples/i18n/zh-TW/Rakefile +6 -0
  155. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  156. data/examples/i18n/zh-TW/features/division.feature +11 -0
  157. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  159. data/examples/java/README.textile +18 -0
  160. data/examples/java/build.xml +33 -0
  161. data/examples/java/features/hello.feature +11 -0
  162. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  163. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  164. data/examples/java/features/tree.feature +9 -0
  165. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  166. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  167. data/examples/junit/features/pending.feature +5 -0
  168. data/examples/junit/features/step_definitions/steps.rb +11 -0
  169. data/examples/pure_java/README.textile +5 -0
  170. data/examples/selenium/Rakefile +6 -0
  171. data/examples/selenium/features/search.feature +9 -0
  172. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  173. data/examples/selenium/features/support/env.rb +19 -0
  174. data/examples/selenium_webrat/Rakefile +6 -0
  175. data/examples/selenium_webrat/config.ru +0 -0
  176. data/examples/selenium_webrat/features/search.feature +9 -0
  177. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  178. data/examples/selenium_webrat/features/support/env.rb +45 -0
  179. data/examples/self_test/README.textile +6 -0
  180. data/examples/self_test/Rakefile +6 -0
  181. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  182. data/examples/self_test/features/background/background_with_name.feature +7 -0
  183. data/examples/self_test/features/background/failing_background.feature +12 -0
  184. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  185. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  186. data/examples/self_test/features/background/passing_background.feature +10 -0
  187. data/examples/self_test/features/background/pending_background.feature +10 -0
  188. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  189. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  190. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  191. data/examples/self_test/features/failing_expectation.feature +4 -0
  192. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  193. data/examples/self_test/features/multiline_name.feature +27 -0
  194. data/examples/self_test/features/outline_sample.feature +15 -0
  195. data/examples/self_test/features/sample.feature +21 -0
  196. data/examples/self_test/features/search_sample.feature +32 -0
  197. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  198. data/examples/self_test/features/support/env.rb +17 -0
  199. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  200. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  201. data/examples/sinatra/Rakefile +6 -0
  202. data/examples/sinatra/app.rb +14 -0
  203. data/examples/sinatra/features/add.feature +11 -0
  204. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  205. data/examples/sinatra/features/support/env.rb +28 -0
  206. data/examples/sinatra/views/add.erb +5 -0
  207. data/examples/sinatra/views/layout.erb +8 -0
  208. data/examples/test_unit/Rakefile +6 -0
  209. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  210. data/examples/test_unit/features/test_unit.feature +9 -0
  211. data/examples/tickets/Rakefile +16 -0
  212. data/examples/tickets/features/172.feature +28 -0
  213. data/examples/tickets/features/177/1.feature +29 -0
  214. data/examples/tickets/features/177/2.feature +21 -0
  215. data/examples/tickets/features/177/3.feature +18 -0
  216. data/examples/tickets/features/180.feature +7 -0
  217. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  218. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  219. data/examples/tickets/features/236.feature +13 -0
  220. data/examples/tickets/features/241.feature +13 -0
  221. data/examples/tickets/features/246.feature +4 -0
  222. data/examples/tickets/features/248.feature +11 -0
  223. data/examples/tickets/features/270/back.feature +14 -0
  224. data/examples/tickets/features/270/back.steps.rb +14 -0
  225. data/examples/tickets/features/272/hooks.feature +26 -0
  226. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  227. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  228. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  229. data/examples/tickets/features/279/wrong.feature_ +11 -0
  230. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  231. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  232. data/examples/tickets/features/306/only_background.feature +4 -0
  233. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  234. data/examples/tickets/features/lib/pantry.rb +20 -0
  235. data/examples/tickets/features/scenario_outline.feature +95 -0
  236. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  237. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  238. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  239. data/examples/tickets/features/step_definitons/tickets_steps.rb +66 -0
  240. data/examples/tickets/features/tickets.feature +28 -0
  241. data/examples/watir/README.textile +16 -0
  242. data/examples/watir/Rakefile +6 -0
  243. data/examples/watir/features/search.feature +12 -0
  244. data/examples/watir/features/step_definitons/search_steps.rb +22 -0
  245. data/examples/watir/features/support/env.rb +32 -0
  246. data/features/after_block_exceptions.feature +102 -0
  247. data/features/after_step_block_exceptions.feature +104 -0
  248. data/features/background.feature +311 -0
  249. data/features/bug_371.feature +32 -0
  250. data/features/cucumber_cli.feature +549 -0
  251. data/features/cucumber_cli_diff_disabled.feature +53 -0
  252. data/features/cucumber_cli_outlines.feature +109 -0
  253. data/features/custom_formatter.feature +11 -0
  254. data/features/drb_server_integration.feature +115 -0
  255. data/features/exclude_files.feature +20 -0
  256. data/features/expand.feature +49 -0
  257. data/features/html_formatter.feature +7 -0
  258. data/features/html_formatter/a.html +185 -0
  259. data/features/junit_formatter.feature +71 -0
  260. data/features/language_from_header.feature +30 -0
  261. data/features/multiline_names.feature +43 -0
  262. data/features/rake_task.feature +150 -0
  263. data/features/report_called_undefined_steps.feature +35 -0
  264. data/features/snippet.feature +22 -0
  265. data/features/step_definitions/cucumber_steps.rb +130 -0
  266. data/features/step_definitions/extra_steps.rb +2 -0
  267. data/features/support/env.rb +120 -0
  268. data/features/usage.feature +126 -0
  269. data/features/work_in_progress.feature +151 -0
  270. data/gem_tasks/deployment.rake +11 -0
  271. data/gem_tasks/environment.rake +7 -0
  272. data/gem_tasks/features.rake +10 -0
  273. data/gem_tasks/fix_cr_lf.rake +10 -0
  274. data/gem_tasks/flog.rake +4 -0
  275. data/gem_tasks/gemspec.rake +10 -0
  276. data/gem_tasks/rspec.rake +45 -0
  277. data/gem_tasks/sass.rake +4 -0
  278. data/gem_tasks/yard.rake +8 -0
  279. data/lib/autotest/cucumber.rb +6 -0
  280. data/lib/autotest/cucumber_mixin.rb +125 -0
  281. data/lib/autotest/cucumber_rails.rb +6 -0
  282. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  283. data/lib/autotest/cucumber_rspec.rb +6 -0
  284. data/lib/autotest/discover.rb +9 -0
  285. data/lib/cucumber.rb +11 -0
  286. data/lib/cucumber/ast.rb +29 -0
  287. data/lib/cucumber/ast/background.rb +62 -0
  288. data/lib/cucumber/ast/comment.rb +30 -0
  289. data/lib/cucumber/ast/examples.rb +26 -0
  290. data/lib/cucumber/ast/feature.rb +58 -0
  291. data/lib/cucumber/ast/feature_element.rb +57 -0
  292. data/lib/cucumber/ast/features.rb +30 -0
  293. data/lib/cucumber/ast/outline_table.rb +143 -0
  294. data/lib/cucumber/ast/py_string.rb +57 -0
  295. data/lib/cucumber/ast/scenario.rb +83 -0
  296. data/lib/cucumber/ast/scenario_outline.rb +93 -0
  297. data/lib/cucumber/ast/step.rb +112 -0
  298. data/lib/cucumber/ast/step_collection.rb +75 -0
  299. data/lib/cucumber/ast/step_invocation.rb +136 -0
  300. data/lib/cucumber/ast/table.rb +334 -0
  301. data/lib/cucumber/ast/tags.rb +33 -0
  302. data/lib/cucumber/ast/visitor.rb +116 -0
  303. data/lib/cucumber/broadcaster.rb +13 -0
  304. data/lib/cucumber/cli/configuration.rb +425 -0
  305. data/lib/cucumber/cli/drb_client.rb +20 -0
  306. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  307. data/lib/cucumber/cli/main.rb +136 -0
  308. data/lib/cucumber/core_ext/exception.rb +53 -0
  309. data/lib/cucumber/core_ext/instance_exec.rb +67 -0
  310. data/lib/cucumber/core_ext/proc.rb +29 -0
  311. data/lib/cucumber/core_ext/string.rb +48 -0
  312. data/lib/cucumber/feature_file.rb +47 -0
  313. data/lib/cucumber/filter.rb +50 -0
  314. data/lib/cucumber/formatter/ansicolor.rb +110 -0
  315. data/lib/cucumber/formatter/color_io.rb +23 -0
  316. data/lib/cucumber/formatter/console.rb +149 -0
  317. data/lib/cucumber/formatter/cucumber.css +132 -0
  318. data/lib/cucumber/formatter/cucumber.sass +139 -0
  319. data/lib/cucumber/formatter/duration.rb +10 -0
  320. data/lib/cucumber/formatter/html.rb +258 -0
  321. data/lib/cucumber/formatter/junit.rb +75 -0
  322. data/lib/cucumber/formatter/pretty.rb +188 -0
  323. data/lib/cucumber/formatter/profile.rb +77 -0
  324. data/lib/cucumber/formatter/progress.rb +60 -0
  325. data/lib/cucumber/formatter/rerun.rb +44 -0
  326. data/lib/cucumber/formatter/tag_cloud.rb +28 -0
  327. data/lib/cucumber/formatter/unicode.rb +35 -0
  328. data/lib/cucumber/formatter/usage.rb +85 -0
  329. data/lib/cucumber/formatters/unicode.rb +7 -0
  330. data/lib/cucumber/languages.yml +532 -0
  331. data/lib/cucumber/parser.rb +6 -0
  332. data/lib/cucumber/parser/feature.rb +1787 -0
  333. data/lib/cucumber/parser/feature.tt +324 -0
  334. data/lib/cucumber/parser/i18n.tt +42 -0
  335. data/lib/cucumber/parser/i18n/language.rb +80 -0
  336. data/lib/cucumber/parser/table.rb +414 -0
  337. data/lib/cucumber/parser/table.tt +71 -0
  338. data/lib/cucumber/parser/treetop_ext.rb +52 -0
  339. data/lib/cucumber/platform.rb +23 -0
  340. data/lib/cucumber/rails/rspec.rb +10 -0
  341. data/lib/cucumber/rails/world.rb +99 -0
  342. data/lib/cucumber/rake/task.rb +233 -0
  343. data/lib/cucumber/rspec_neuter.rb +23 -0
  344. data/lib/cucumber/step_definition.rb +122 -0
  345. data/lib/cucumber/step_match.rb +61 -0
  346. data/lib/cucumber/step_mother.rb +362 -0
  347. data/lib/cucumber/version.rb +10 -0
  348. data/lib/cucumber/webrat/mechanize_world.rb +82 -0
  349. data/lib/cucumber/world.rb +53 -0
  350. data/rails_generators/cucumber/USAGE +11 -0
  351. data/rails_generators/cucumber/cucumber_generator.rb +66 -0
  352. data/rails_generators/cucumber/templates/cucumber +8 -0
  353. data/rails_generators/cucumber/templates/cucumber.rake +20 -0
  354. data/rails_generators/cucumber/templates/cucumber_environment.rb +23 -0
  355. data/rails_generators/cucumber/templates/env.rb +26 -0
  356. data/rails_generators/cucumber/templates/paths.rb +27 -0
  357. data/rails_generators/cucumber/templates/spork_env.rb +36 -0
  358. data/rails_generators/cucumber/templates/webrat_steps.rb +147 -0
  359. data/rails_generators/feature/USAGE +12 -0
  360. data/rails_generators/feature/feature_generator.rb +40 -0
  361. data/rails_generators/feature/templates/feature.erb +31 -0
  362. data/rails_generators/feature/templates/steps.erb +20 -0
  363. data/spec/cucumber/ast/background_spec.rb +50 -0
  364. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  365. data/spec/cucumber/ast/feature_factory.rb +63 -0
  366. data/spec/cucumber/ast/feature_spec.rb +38 -0
  367. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  368. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  369. data/spec/cucumber/ast/scenario_spec.rb +38 -0
  370. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  371. data/spec/cucumber/ast/step_spec.rb +66 -0
  372. data/spec/cucumber/ast/table_spec.rb +186 -0
  373. data/spec/cucumber/ast/visitor_spec.rb +27 -0
  374. data/spec/cucumber/broadcaster_spec.rb +15 -0
  375. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  376. data/spec/cucumber/cli/drb_client_spec.rb +43 -0
  377. data/spec/cucumber/cli/main_spec.rb +140 -0
  378. data/spec/cucumber/core_ext/proc_spec.rb +54 -0
  379. data/spec/cucumber/core_ext/string_spec.rb +42 -0
  380. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  381. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  382. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  383. data/spec/cucumber/formatter/progress_spec.rb +36 -0
  384. data/spec/cucumber/parser/feature_parser_spec.rb +387 -0
  385. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  386. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  387. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  388. data/spec/cucumber/rails/world_spec.rb +11 -0
  389. data/spec/cucumber/sell_cucumbers.feature +19 -0
  390. data/spec/cucumber/step_definition_spec.rb +101 -0
  391. data/spec/cucumber/step_mother_spec.rb +155 -0
  392. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  393. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  394. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  395. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  396. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  397. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  398. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  399. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  400. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  401. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  402. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  403. data/spec/cucumber/treetop_parser/with_comments.feature +10 -0
  404. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  405. data/spec/cucumber/world/pending_spec.rb +47 -0
  406. data/spec/spec.opts +2 -0
  407. data/spec/spec_helper.rb +13 -0
  408. metadata +504 -0
@@ -0,0 +1,324 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ grammar Feature
10
+
11
+ rule feature_sub
12
+ white
13
+ comment
14
+ white
15
+ tags
16
+ white
17
+ header:(!(scenario_outline / scenario / background) .)*
18
+ bg:background?
19
+ feature_elements
20
+ comment? {
21
+ def has_tags?(tag_names)
22
+ tags.has_tags?(tag_names)
23
+ end
24
+
25
+ def build(filter)
26
+ if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
27
+ background = bg.respond_to?(:build) ? bg.build : nil
28
+ Ast::Feature.new(
29
+ background,
30
+ comment.build,
31
+ tags.build,
32
+ header.text_value,
33
+ feature_elements.build(background, filter)
34
+ )
35
+ end
36
+ end
37
+ }
38
+ end
39
+
40
+ rule tags
41
+ white ts:(tag (space/eol)+)* {
42
+ def at_line?(line)
43
+ ts.elements.detect{|e| e.tag.line == line}
44
+ end
45
+
46
+ def has_tags?(tags)
47
+ (tag_names & tags).any?
48
+ end
49
+
50
+ def build
51
+ Ast::Tags.new(ts.line, tag_names)
52
+ end
53
+
54
+ def tag_names
55
+ @tag_names ||= ts.elements.map{|e| e.tag.tag_name.text_value}
56
+ end
57
+ }
58
+ end
59
+
60
+ rule tag
61
+ '@' tag_name:([^@\r\n\t ])+
62
+ end
63
+
64
+ rule comment
65
+ (comment_line white)* {
66
+ def build
67
+ Ast::Comment.new(text_value)
68
+ end
69
+ }
70
+ end
71
+
72
+ rule comment_line
73
+ '#' line_to_eol
74
+ end
75
+
76
+ rule background
77
+ comment white background_keyword space* name:lines_to_keyword? (eol+ / eof) steps {
78
+ def matches_name?(regexp_to_match)
79
+ name.build =~ regexp_to_match
80
+ end
81
+
82
+ def at_line?(line)
83
+ background_keyword.line == line ||
84
+ steps.at_line?(line)
85
+ end
86
+
87
+ def has_tags?(tag_names)
88
+ feature_tags = self.parent.tags
89
+ feature_tags.has_tags?(tag_names)
90
+ end
91
+
92
+ def build
93
+ Ast::Background.new(
94
+ comment.build,
95
+ background_keyword.line,
96
+ background_keyword.text_value,
97
+ name.build,
98
+ steps.build
99
+ )
100
+ end
101
+ }
102
+ end
103
+
104
+ rule feature_elements
105
+ (scenario / scenario_outline)* {
106
+ def accept?(filter)
107
+ filter.nil? || elements.empty? || elements.detect{|feature_element| filter.accept?(feature_element)}
108
+ end
109
+
110
+ def build(background, filter)
111
+ elements.map do |feature_element|
112
+ if filter.nil? || filter.accept?(feature_element)
113
+ feature_element.build(background, filter)
114
+ end
115
+ end.compact
116
+ end
117
+ }
118
+ end
119
+
120
+ rule scenario
121
+ comment tags white scenario_keyword space* name:lines_to_keyword white steps white {
122
+ def at_line?(line)
123
+ scenario_keyword.line == line ||
124
+ steps.at_line?(line) ||
125
+ tags.at_line?(line)
126
+ end
127
+
128
+ def has_tags?(tag_names)
129
+ feature_tags = self.parent.parent.tags
130
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
131
+ end
132
+
133
+ def matches_name?(regexp_to_match)
134
+ name.build =~ regexp_to_match
135
+ end
136
+
137
+ def build(background, filter)
138
+ Ast::Scenario.new(
139
+ background,
140
+ comment.build,
141
+ tags.build,
142
+ scenario_keyword.line,
143
+ scenario_keyword.text_value,
144
+ name.build,
145
+ steps.build
146
+ )
147
+ end
148
+ }
149
+ end
150
+
151
+ rule scenario_outline
152
+ comment tags white scenario_outline_keyword space* name:lines_to_keyword white steps examples_sections white {
153
+ def at_line?(line)
154
+ outline_at_line?(line) ||
155
+ examples_sections.at_line?(line) ||
156
+ tags.at_line?(line)
157
+ end
158
+
159
+ def outline_at_line?(line)
160
+ scenario_outline_keyword.line == line ||
161
+ steps.at_line?(line)
162
+ end
163
+
164
+ def has_tags?(tag_names)
165
+ feature_tags = self.parent.parent.tags
166
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
167
+ end
168
+
169
+ def matches_name?(regexp_to_match)
170
+ outline_matches_name?(regexp_to_match) || examples_sections.matches_name?(regexp_to_match)
171
+ end
172
+
173
+ def outline_matches_name?(regexp_to_match)
174
+ name.build =~ regexp_to_match
175
+ end
176
+
177
+ def build(background, filter)
178
+ Ast::ScenarioOutline.new(
179
+ background,
180
+ comment.build,
181
+ tags.build,
182
+ scenario_outline_keyword.line,
183
+ scenario_outline_keyword.text_value,
184
+ name.build,
185
+ steps.build,
186
+ examples_sections.build(filter, self)
187
+ )
188
+ end
189
+ }
190
+ end
191
+
192
+ rule steps
193
+ step* {
194
+ def at_line?(line)
195
+ elements.detect{|e| e.at_line?(line)}
196
+ end
197
+
198
+ def build
199
+ elements.map{|e| e.build}
200
+ end
201
+ }
202
+ end
203
+
204
+ rule step
205
+ comment space* step_keyword keyword_space name:line_to_eol (eol+ / eof) multi:multiline_arg? white {
206
+ def at_line?(line)
207
+ step_keyword.line == line ||
208
+ (multi.respond_to?(:at_line?) && multi.at_line?(line))
209
+ end
210
+
211
+ def build
212
+ if multi.respond_to?(:build)
213
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip, multi.build)
214
+ else
215
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip)
216
+ end
217
+ end
218
+ }
219
+ end
220
+
221
+ rule examples_sections
222
+ examples* {
223
+ def at_line?(line)
224
+ elements.detect { |e| e.at_line?(line) }
225
+ end
226
+
227
+ def matches_name?(regexp_to_match)
228
+ elements.detect { |e| e.matches_name?(regexp_to_match) }
229
+ end
230
+
231
+ def build(filter, scenario_outline)
232
+ elements.map do |e|
233
+ if(filter.nil? || filter.accept_example?(e, scenario_outline))
234
+ e.build(filter, scenario_outline)
235
+ end
236
+ end.compact
237
+ end
238
+ }
239
+ end
240
+
241
+ rule examples
242
+ space* examples_keyword space* name:lines_to_keyword? eol table white {
243
+ def at_line?(line)
244
+ examples_keyword.line == line ||
245
+ table.at_line?(line)
246
+ end
247
+
248
+ def has_tags?(tag_names)
249
+ true
250
+ end
251
+
252
+ def outline_at_line?(line)
253
+ true
254
+ end
255
+
256
+ def matches_name?(regexp_to_match)
257
+ name.build =~ regexp_to_match
258
+ end
259
+
260
+ def build(filter, scenario_outline)
261
+ [examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
262
+ end
263
+ }
264
+ end
265
+
266
+ rule multiline_arg
267
+ table / py_string
268
+ end
269
+
270
+ rule line_to_eol
271
+ (!eol .)*
272
+ end
273
+
274
+ rule lines_to_keyword
275
+ (!(eol space* reserved_words_and_symbols) .)* {
276
+ def build
277
+ self.text_value.split("\n").map{|s| s.strip}.join("\n")
278
+ end
279
+ }
280
+ end
281
+
282
+ rule reserved_words_and_symbols
283
+ (step_keyword keyword_space) / scenario_keyword / scenario_outline_keyword / table / tag / comment_line
284
+ end
285
+
286
+ rule py_string
287
+ open_py_string s:(!close_py_string .)* close_py_string {
288
+ def at_line?(line)
289
+ line >= open_py_string.line && line <= close_py_string.line
290
+ end
291
+
292
+ def build
293
+ Ast::PyString.new(open_py_string.line, close_py_string.line, s.text_value, open_py_string.indentation)
294
+ end
295
+ }
296
+ end
297
+
298
+ rule open_py_string
299
+ indent:space* '"""' space* eol {
300
+ def indentation
301
+ indent.text_value.length
302
+ end
303
+
304
+ def line
305
+ indent.line
306
+ end
307
+ }
308
+ end
309
+
310
+ rule close_py_string
311
+ eol space* quotes:'"""' white {
312
+ def line
313
+ quotes.line
314
+ end
315
+ }
316
+ end
317
+
318
+ rule white
319
+ (space / eol)*
320
+ end
321
+
322
+ end
323
+ end
324
+ end
@@ -0,0 +1,42 @@
1
+ module Cucumber
2
+ module Parser
3
+ module I18n
4
+ grammar <%= keywords('grammar_name', true) %>
5
+ include Feature
6
+ include Table
7
+
8
+ rule feature
9
+ feature_sub
10
+ end
11
+
12
+ rule background_keyword
13
+ (<%= keywords('background') %>) ':'
14
+ end
15
+
16
+ rule scenario_keyword
17
+ (<%= keywords('scenario') %>) ':'
18
+ end
19
+
20
+ rule scenario_outline_keyword
21
+ (<%= keywords('scenario_outline') %>) ':'
22
+ end
23
+
24
+ rule step_keyword
25
+ (<%= keywords('given') %>) /
26
+ (<%= keywords('when') %>) /
27
+ (<%= keywords('then') %>) /
28
+ (<%= keywords('and') %>) /
29
+ (<%= keywords('but') %>)
30
+ end
31
+
32
+ rule keyword_space
33
+ <%= keywords('space_after_keyword', true) ? 'space+' : 'space*' %>
34
+ end
35
+
36
+ rule examples_keyword
37
+ (<%= keywords('examples') %>) ':'?
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,80 @@
1
+ module Cucumber
2
+ module Parser
3
+ module I18n
4
+ class Language
5
+ KEYWORD_KEYS = %w{name native encoding feature background scenario scenario_outline examples given when then but}
6
+
7
+ class << self
8
+ LANGUAGES = Hash.new{|h,k| h[k] = Language.new(k)}
9
+
10
+ def [](key)
11
+ LANGUAGES[key]
12
+ end
13
+
14
+ def alias_step_definitions(keywords) #:nodoc:
15
+ all_keywords = %w{given when then and but}.map{|keyword| keywords[keyword].split('|')}.flatten
16
+ alias_steps(all_keywords)
17
+ end
18
+
19
+ # Sets up additional method aliases for Given, When and Then.
20
+ # This does *not* affect how feature files are parsed. If you
21
+ # want to create aliases in the parser, you have to do this in
22
+ # languages.yml. For example:
23
+ #
24
+ # and: And|With
25
+ def alias_steps(keywords)
26
+ keywords.each do |adverb|
27
+ StepMother.alias_adverb(adverb)
28
+ World.alias_adverb(adverb)
29
+ end
30
+ end
31
+ end
32
+
33
+ alias_step_definitions(Cucumber::LANGUAGES['en'])
34
+
35
+ attr_reader :parser
36
+
37
+ def initialize(lang)
38
+ @keywords = Cucumber::LANGUAGES[lang]
39
+ raise "Language not supported: #{lang.inspect}" if @keywords.nil?
40
+ @keywords['grammar_name'] = @keywords['name'].gsub(/\s/, '')
41
+ i18n_tt = File.expand_path(File.dirname(__FILE__) + '/../i18n.tt')
42
+ template = File.open(i18n_tt, Cucumber.file_mode('r')).read
43
+ erb = ERB.new(template)
44
+ grammar = erb.result(binding)
45
+ Treetop.load_from_string(grammar)
46
+ @parser = Parser::I18n.const_get("#{@keywords['grammar_name']}Parser").new
47
+ self.class.alias_step_definitions(@keywords)
48
+ end
49
+
50
+ def parse(source, path, filter)
51
+ feature = @parser.parse_or_fail(source, path, filter)
52
+ feature.language = self if feature
53
+ feature
54
+ end
55
+
56
+ def keywords(key, raw=false)
57
+ return @keywords[key] if raw
58
+ values = @keywords[key].split('|')
59
+ values.map{|value| "'#{value}'"}.join(" / ")
60
+ end
61
+
62
+ def language_incomplete?
63
+ KEYWORD_KEYS.detect{|key| @keywords[key].nil?}
64
+ end
65
+
66
+ def scenario_keyword
67
+ @keywords['scenario'].split('|')[0] + ':'
68
+ end
69
+
70
+ def but_keywords
71
+ @keywords['but'].split('|')
72
+ end
73
+
74
+ def and_keywords
75
+ @keywords['and'].split('|')
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,414 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ module Table
10
+ include Treetop::Runtime
11
+
12
+ def root
13
+ @root || :table
14
+ end
15
+
16
+ module Table0
17
+ def at_line?(line)
18
+ elements.detect{|table_row| table_row.at_line?(line)}
19
+ end
20
+
21
+ def build(filter=nil)
22
+ Ast::Table.new(raw)
23
+ end
24
+
25
+ def raw(filter=nil, scenario_outline=nil)
26
+ elements.map do |table_row|
27
+ if(filter.nil? || table_row == elements[0] || filter.at_line?(table_row) || (scenario_outline && filter.outline_at_line?(scenario_outline)))
28
+ table_row.build
29
+ end
30
+ end.compact
31
+ end
32
+ end
33
+
34
+ def _nt_table
35
+ start_index = index
36
+ if node_cache[:table].has_key?(index)
37
+ cached = node_cache[:table][index]
38
+ @index = cached.interval.end if cached
39
+ return cached
40
+ end
41
+
42
+ s0, i0 = [], index
43
+ loop do
44
+ r1 = _nt_table_row
45
+ if r1
46
+ s0 << r1
47
+ else
48
+ break
49
+ end
50
+ end
51
+ if s0.empty?
52
+ self.index = i0
53
+ r0 = nil
54
+ else
55
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
56
+ r0.extend(Table0)
57
+ end
58
+
59
+ node_cache[:table][start_index] = r0
60
+
61
+ return r0
62
+ end
63
+
64
+ module TableRow0
65
+ def cell
66
+ elements[0]
67
+ end
68
+
69
+ end
70
+
71
+ module TableRow1
72
+ def cells
73
+ elements[2]
74
+ end
75
+
76
+ end
77
+
78
+ module TableRow2
79
+ def at_line?(line)
80
+ cells.line == line
81
+ end
82
+
83
+ def build
84
+ row = cells.elements.map do |elt|
85
+ value = elt.cell.text_value.strip
86
+ value.empty? ? nil : value
87
+ end
88
+
89
+ class << row
90
+ attr_accessor :line
91
+ end
92
+ row.line = cells.line
93
+
94
+ row
95
+ end
96
+ end
97
+
98
+ def _nt_table_row
99
+ start_index = index
100
+ if node_cache[:table_row].has_key?(index)
101
+ cached = node_cache[:table_row][index]
102
+ @index = cached.interval.end if cached
103
+ return cached
104
+ end
105
+
106
+ i0, s0 = index, []
107
+ s1, i1 = [], index
108
+ loop do
109
+ r2 = _nt_space
110
+ if r2
111
+ s1 << r2
112
+ else
113
+ break
114
+ end
115
+ end
116
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
117
+ s0 << r1
118
+ if r1
119
+ if input.index('|', index) == index
120
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
121
+ @index += 1
122
+ else
123
+ terminal_parse_failure('|')
124
+ r3 = nil
125
+ end
126
+ s0 << r3
127
+ if r3
128
+ s4, i4 = [], index
129
+ loop do
130
+ i5, s5 = index, []
131
+ r6 = _nt_cell
132
+ s5 << r6
133
+ if r6
134
+ if input.index('|', index) == index
135
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
136
+ @index += 1
137
+ else
138
+ terminal_parse_failure('|')
139
+ r7 = nil
140
+ end
141
+ s5 << r7
142
+ end
143
+ if s5.last
144
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
145
+ r5.extend(TableRow0)
146
+ else
147
+ self.index = i5
148
+ r5 = nil
149
+ end
150
+ if r5
151
+ s4 << r5
152
+ else
153
+ break
154
+ end
155
+ end
156
+ if s4.empty?
157
+ self.index = i4
158
+ r4 = nil
159
+ else
160
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
161
+ end
162
+ s0 << r4
163
+ if r4
164
+ s8, i8 = [], index
165
+ loop do
166
+ r9 = _nt_space
167
+ if r9
168
+ s8 << r9
169
+ else
170
+ break
171
+ end
172
+ end
173
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
174
+ s0 << r8
175
+ if r8
176
+ i10 = index
177
+ s11, i11 = [], index
178
+ loop do
179
+ r12 = _nt_eol
180
+ if r12
181
+ s11 << r12
182
+ else
183
+ break
184
+ end
185
+ end
186
+ if s11.empty?
187
+ self.index = i11
188
+ r11 = nil
189
+ else
190
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
191
+ end
192
+ if r11
193
+ r10 = r11
194
+ else
195
+ r13 = _nt_eof
196
+ if r13
197
+ r10 = r13
198
+ else
199
+ self.index = i10
200
+ r10 = nil
201
+ end
202
+ end
203
+ s0 << r10
204
+ end
205
+ end
206
+ end
207
+ end
208
+ if s0.last
209
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
210
+ r0.extend(TableRow1)
211
+ r0.extend(TableRow2)
212
+ else
213
+ self.index = i0
214
+ r0 = nil
215
+ end
216
+
217
+ node_cache[:table_row][start_index] = r0
218
+
219
+ return r0
220
+ end
221
+
222
+ module Cell0
223
+ end
224
+
225
+ def _nt_cell
226
+ start_index = index
227
+ if node_cache[:cell].has_key?(index)
228
+ cached = node_cache[:cell][index]
229
+ @index = cached.interval.end if cached
230
+ return cached
231
+ end
232
+
233
+ s0, i0 = [], index
234
+ loop do
235
+ i1, s1 = index, []
236
+ i2 = index
237
+ i3 = index
238
+ if input.index('|', index) == index
239
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
240
+ @index += 1
241
+ else
242
+ terminal_parse_failure('|')
243
+ r4 = nil
244
+ end
245
+ if r4
246
+ r3 = r4
247
+ else
248
+ r5 = _nt_eol
249
+ if r5
250
+ r3 = r5
251
+ else
252
+ self.index = i3
253
+ r3 = nil
254
+ end
255
+ end
256
+ if r3
257
+ r2 = nil
258
+ else
259
+ self.index = i2
260
+ r2 = instantiate_node(SyntaxNode,input, index...index)
261
+ end
262
+ s1 << r2
263
+ if r2
264
+ if index < input_length
265
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
266
+ @index += 1
267
+ else
268
+ terminal_parse_failure("any character")
269
+ r6 = nil
270
+ end
271
+ s1 << r6
272
+ end
273
+ if s1.last
274
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
275
+ r1.extend(Cell0)
276
+ else
277
+ self.index = i1
278
+ r1 = nil
279
+ end
280
+ if r1
281
+ s0 << r1
282
+ else
283
+ break
284
+ end
285
+ end
286
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
287
+
288
+ node_cache[:cell][start_index] = r0
289
+
290
+ return r0
291
+ end
292
+
293
+ def _nt_space
294
+ start_index = index
295
+ if node_cache[:space].has_key?(index)
296
+ cached = node_cache[:space][index]
297
+ @index = cached.interval.end if cached
298
+ return cached
299
+ end
300
+
301
+ if input.index(Regexp.new('[ \\t]'), index) == index
302
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
303
+ @index += 1
304
+ else
305
+ r0 = nil
306
+ end
307
+
308
+ node_cache[:space][start_index] = r0
309
+
310
+ return r0
311
+ end
312
+
313
+ module Eol0
314
+ end
315
+
316
+ def _nt_eol
317
+ start_index = index
318
+ if node_cache[:eol].has_key?(index)
319
+ cached = node_cache[:eol][index]
320
+ @index = cached.interval.end if cached
321
+ return cached
322
+ end
323
+
324
+ i0 = index
325
+ if input.index("\n", index) == index
326
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
327
+ @index += 1
328
+ else
329
+ terminal_parse_failure("\n")
330
+ r1 = nil
331
+ end
332
+ if r1
333
+ r0 = r1
334
+ else
335
+ i2, s2 = index, []
336
+ if input.index("\r", index) == index
337
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
338
+ @index += 1
339
+ else
340
+ terminal_parse_failure("\r")
341
+ r3 = nil
342
+ end
343
+ s2 << r3
344
+ if r3
345
+ if input.index("\n", index) == index
346
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
347
+ @index += 1
348
+ else
349
+ terminal_parse_failure("\n")
350
+ r5 = nil
351
+ end
352
+ if r5
353
+ r4 = r5
354
+ else
355
+ r4 = instantiate_node(SyntaxNode,input, index...index)
356
+ end
357
+ s2 << r4
358
+ end
359
+ if s2.last
360
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
361
+ r2.extend(Eol0)
362
+ else
363
+ self.index = i2
364
+ r2 = nil
365
+ end
366
+ if r2
367
+ r0 = r2
368
+ else
369
+ self.index = i0
370
+ r0 = nil
371
+ end
372
+ end
373
+
374
+ node_cache[:eol][start_index] = r0
375
+
376
+ return r0
377
+ end
378
+
379
+ def _nt_eof
380
+ start_index = index
381
+ if node_cache[:eof].has_key?(index)
382
+ cached = node_cache[:eof][index]
383
+ @index = cached.interval.end if cached
384
+ return cached
385
+ end
386
+
387
+ i0 = index
388
+ if index < input_length
389
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
390
+ @index += 1
391
+ else
392
+ terminal_parse_failure("any character")
393
+ r1 = nil
394
+ end
395
+ if r1
396
+ r0 = nil
397
+ else
398
+ self.index = i0
399
+ r0 = instantiate_node(SyntaxNode,input, index...index)
400
+ end
401
+
402
+ node_cache[:eof][start_index] = r0
403
+
404
+ return r0
405
+ end
406
+
407
+ end
408
+
409
+ class TableParser < Treetop::Runtime::CompiledParser
410
+ include Table
411
+ end
412
+
413
+ end
414
+ end