jwilger-cucumber 0.3.11.200906161550

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 (411) 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/Rakefile +6 -0
  46. data/examples/i18n/en/features/addition.feature +17 -0
  47. data/examples/i18n/en/features/division.feature +10 -0
  48. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  49. data/examples/i18n/en/lib/calculator.rb +14 -0
  50. data/examples/i18n/en-lol/Rakefile +6 -0
  51. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  52. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  53. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  54. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  55. data/examples/i18n/en-lol/lib/belly.rb +11 -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/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  209. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  210. data/examples/test_unit/Rakefile +6 -0
  211. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  212. data/examples/test_unit/features/test_unit.feature +9 -0
  213. data/examples/tickets/Rakefile +16 -0
  214. data/examples/tickets/features/172.feature +28 -0
  215. data/examples/tickets/features/177/1.feature +29 -0
  216. data/examples/tickets/features/177/2.feature +21 -0
  217. data/examples/tickets/features/177/3.feature +18 -0
  218. data/examples/tickets/features/180.feature +7 -0
  219. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  220. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  221. data/examples/tickets/features/236.feature +13 -0
  222. data/examples/tickets/features/241.feature +13 -0
  223. data/examples/tickets/features/246.feature +4 -0
  224. data/examples/tickets/features/248.feature +11 -0
  225. data/examples/tickets/features/270/back.feature +14 -0
  226. data/examples/tickets/features/270/back.steps.rb +14 -0
  227. data/examples/tickets/features/272/hooks.feature +26 -0
  228. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  229. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  230. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  231. data/examples/tickets/features/279/wrong.feature_ +11 -0
  232. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  233. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  234. data/examples/tickets/features/306/only_background.feature +4 -0
  235. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  236. data/examples/tickets/features/lib/pantry.rb +20 -0
  237. data/examples/tickets/features/scenario_outline.feature +95 -0
  238. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  239. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  240. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  241. data/examples/tickets/features/step_definitons/tickets_steps.rb +66 -0
  242. data/examples/tickets/features/tickets.feature +28 -0
  243. data/examples/watir/README.textile +16 -0
  244. data/examples/watir/Rakefile +6 -0
  245. data/examples/watir/features/search.feature +12 -0
  246. data/examples/watir/features/step_definitons/search_steps.rb +22 -0
  247. data/examples/watir/features/support/env.rb +32 -0
  248. data/features/after_block_exceptions.feature +102 -0
  249. data/features/after_step_block_exceptions.feature +104 -0
  250. data/features/background.feature +311 -0
  251. data/features/bug_371.feature +32 -0
  252. data/features/cucumber_cli.feature +549 -0
  253. data/features/cucumber_cli_diff_disabled.feature +53 -0
  254. data/features/cucumber_cli_outlines.feature +109 -0
  255. data/features/custom_formatter.feature +11 -0
  256. data/features/drb_server_integration.feature +115 -0
  257. data/features/exclude_files.feature +20 -0
  258. data/features/expand.feature +49 -0
  259. data/features/html_formatter/a.html +185 -0
  260. data/features/html_formatter.feature +7 -0
  261. data/features/junit_formatter.feature +71 -0
  262. data/features/language_from_header.feature +30 -0
  263. data/features/multiline_names.feature +43 -0
  264. data/features/rake_task.feature +150 -0
  265. data/features/report_called_undefined_steps.feature +35 -0
  266. data/features/snippet.feature +22 -0
  267. data/features/step_definitions/cucumber_steps.rb +130 -0
  268. data/features/step_definitions/extra_steps.rb +2 -0
  269. data/features/steps_formatter.feature +25 -0
  270. data/features/support/env.rb +120 -0
  271. data/features/usage.feature +126 -0
  272. data/features/work_in_progress.feature +151 -0
  273. data/gem_tasks/deployment.rake +11 -0
  274. data/gem_tasks/environment.rake +7 -0
  275. data/gem_tasks/features.rake +10 -0
  276. data/gem_tasks/fix_cr_lf.rake +10 -0
  277. data/gem_tasks/flog.rake +4 -0
  278. data/gem_tasks/gemspec.rake +10 -0
  279. data/gem_tasks/rspec.rake +45 -0
  280. data/gem_tasks/sass.rake +4 -0
  281. data/gem_tasks/yard.rake +8 -0
  282. data/lib/autotest/cucumber.rb +6 -0
  283. data/lib/autotest/cucumber_mixin.rb +125 -0
  284. data/lib/autotest/cucumber_rails.rb +6 -0
  285. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  286. data/lib/autotest/cucumber_rspec.rb +6 -0
  287. data/lib/autotest/discover.rb +9 -0
  288. data/lib/cucumber/ast/background.rb +62 -0
  289. data/lib/cucumber/ast/comment.rb +30 -0
  290. data/lib/cucumber/ast/examples.rb +26 -0
  291. data/lib/cucumber/ast/feature.rb +58 -0
  292. data/lib/cucumber/ast/feature_element.rb +57 -0
  293. data/lib/cucumber/ast/features.rb +30 -0
  294. data/lib/cucumber/ast/outline_table.rb +143 -0
  295. data/lib/cucumber/ast/py_string.rb +57 -0
  296. data/lib/cucumber/ast/scenario.rb +83 -0
  297. data/lib/cucumber/ast/scenario_outline.rb +93 -0
  298. data/lib/cucumber/ast/step.rb +112 -0
  299. data/lib/cucumber/ast/step_collection.rb +75 -0
  300. data/lib/cucumber/ast/step_invocation.rb +136 -0
  301. data/lib/cucumber/ast/table.rb +334 -0
  302. data/lib/cucumber/ast/tags.rb +33 -0
  303. data/lib/cucumber/ast/visitor.rb +116 -0
  304. data/lib/cucumber/ast.rb +29 -0
  305. data/lib/cucumber/broadcaster.rb +13 -0
  306. data/lib/cucumber/cli/configuration.rb +427 -0
  307. data/lib/cucumber/cli/drb_client.rb +20 -0
  308. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  309. data/lib/cucumber/cli/main.rb +136 -0
  310. data/lib/cucumber/core_ext/exception.rb +53 -0
  311. data/lib/cucumber/core_ext/instance_exec.rb +67 -0
  312. data/lib/cucumber/core_ext/proc.rb +29 -0
  313. data/lib/cucumber/core_ext/string.rb +48 -0
  314. data/lib/cucumber/feature_file.rb +47 -0
  315. data/lib/cucumber/filter.rb +50 -0
  316. data/lib/cucumber/formatter/ansicolor.rb +110 -0
  317. data/lib/cucumber/formatter/color_io.rb +23 -0
  318. data/lib/cucumber/formatter/console.rb +149 -0
  319. data/lib/cucumber/formatter/cucumber.css +132 -0
  320. data/lib/cucumber/formatter/cucumber.sass +139 -0
  321. data/lib/cucumber/formatter/duration.rb +10 -0
  322. data/lib/cucumber/formatter/html.rb +258 -0
  323. data/lib/cucumber/formatter/junit.rb +75 -0
  324. data/lib/cucumber/formatter/pretty.rb +188 -0
  325. data/lib/cucumber/formatter/profile.rb +77 -0
  326. data/lib/cucumber/formatter/progress.rb +60 -0
  327. data/lib/cucumber/formatter/rerun.rb +44 -0
  328. data/lib/cucumber/formatter/steps.rb +49 -0
  329. data/lib/cucumber/formatter/tag_cloud.rb +28 -0
  330. data/lib/cucumber/formatter/unicode.rb +35 -0
  331. data/lib/cucumber/formatter/usage.rb +85 -0
  332. data/lib/cucumber/formatters/unicode.rb +7 -0
  333. data/lib/cucumber/languages.yml +532 -0
  334. data/lib/cucumber/parser/feature.rb +1787 -0
  335. data/lib/cucumber/parser/feature.tt +324 -0
  336. data/lib/cucumber/parser/i18n/language.rb +80 -0
  337. data/lib/cucumber/parser/i18n.tt +42 -0
  338. data/lib/cucumber/parser/table.rb +414 -0
  339. data/lib/cucumber/parser/table.tt +71 -0
  340. data/lib/cucumber/parser/treetop_ext.rb +52 -0
  341. data/lib/cucumber/parser.rb +6 -0
  342. data/lib/cucumber/platform.rb +23 -0
  343. data/lib/cucumber/rails/rspec.rb +10 -0
  344. data/lib/cucumber/rails/world.rb +99 -0
  345. data/lib/cucumber/rake/task.rb +233 -0
  346. data/lib/cucumber/rspec_neuter.rb +23 -0
  347. data/lib/cucumber/step_definition.rb +122 -0
  348. data/lib/cucumber/step_match.rb +61 -0
  349. data/lib/cucumber/step_mother.rb +362 -0
  350. data/lib/cucumber/version.rb +10 -0
  351. data/lib/cucumber/world.rb +53 -0
  352. data/lib/cucumber.rb +11 -0
  353. data/rails_generators/cucumber/USAGE +11 -0
  354. data/rails_generators/cucumber/cucumber_generator.rb +66 -0
  355. data/rails_generators/cucumber/templates/cucumber +8 -0
  356. data/rails_generators/cucumber/templates/cucumber.rake +20 -0
  357. data/rails_generators/cucumber/templates/cucumber_environment.rb +23 -0
  358. data/rails_generators/cucumber/templates/env.rb +26 -0
  359. data/rails_generators/cucumber/templates/paths.rb +27 -0
  360. data/rails_generators/cucumber/templates/spork_env.rb +36 -0
  361. data/rails_generators/cucumber/templates/webrat_steps.rb +147 -0
  362. data/rails_generators/feature/USAGE +12 -0
  363. data/rails_generators/feature/feature_generator.rb +40 -0
  364. data/rails_generators/feature/templates/feature.erb +31 -0
  365. data/rails_generators/feature/templates/steps.erb +20 -0
  366. data/spec/cucumber/ast/background_spec.rb +50 -0
  367. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  368. data/spec/cucumber/ast/feature_factory.rb +63 -0
  369. data/spec/cucumber/ast/feature_spec.rb +38 -0
  370. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  371. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  372. data/spec/cucumber/ast/scenario_spec.rb +38 -0
  373. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  374. data/spec/cucumber/ast/step_spec.rb +66 -0
  375. data/spec/cucumber/ast/table_spec.rb +186 -0
  376. data/spec/cucumber/ast/visitor_spec.rb +27 -0
  377. data/spec/cucumber/broadcaster_spec.rb +15 -0
  378. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  379. data/spec/cucumber/cli/drb_client_spec.rb +43 -0
  380. data/spec/cucumber/cli/main_spec.rb +140 -0
  381. data/spec/cucumber/core_ext/proc_spec.rb +54 -0
  382. data/spec/cucumber/core_ext/string_spec.rb +42 -0
  383. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  384. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  385. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  386. data/spec/cucumber/formatter/progress_spec.rb +36 -0
  387. data/spec/cucumber/parser/feature_parser_spec.rb +387 -0
  388. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  389. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  390. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  391. data/spec/cucumber/rails/world_spec.rb +11 -0
  392. data/spec/cucumber/sell_cucumbers.feature +19 -0
  393. data/spec/cucumber/step_definition_spec.rb +101 -0
  394. data/spec/cucumber/step_mother_spec.rb +155 -0
  395. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  396. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  397. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  398. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  399. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  400. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  401. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  402. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  403. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  404. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  405. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  406. data/spec/cucumber/treetop_parser/with_comments.feature +10 -0
  407. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  408. data/spec/cucumber/world/pending_spec.rb +47 -0
  409. data/spec/spec.opts +2 -0
  410. data/spec/spec_helper.rb +13 -0
  411. metadata +506 -0
@@ -0,0 +1,1787 @@
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 Feature
10
+ include Treetop::Runtime
11
+
12
+ def root
13
+ @root || :feature_sub
14
+ end
15
+
16
+ module FeatureSub0
17
+ end
18
+
19
+ module FeatureSub1
20
+ def white
21
+ elements[0]
22
+ end
23
+
24
+ def comment
25
+ elements[1]
26
+ end
27
+
28
+ def white
29
+ elements[2]
30
+ end
31
+
32
+ def tags
33
+ elements[3]
34
+ end
35
+
36
+ def white
37
+ elements[4]
38
+ end
39
+
40
+ def header
41
+ elements[5]
42
+ end
43
+
44
+ def bg
45
+ elements[6]
46
+ end
47
+
48
+ def feature_elements
49
+ elements[7]
50
+ end
51
+
52
+ end
53
+
54
+ module FeatureSub2
55
+ def has_tags?(tag_names)
56
+ tags.has_tags?(tag_names)
57
+ end
58
+
59
+ def build(filter)
60
+ if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
61
+ background = bg.respond_to?(:build) ? bg.build : nil
62
+ Ast::Feature.new(
63
+ background,
64
+ comment.build,
65
+ tags.build,
66
+ header.text_value,
67
+ feature_elements.build(background, filter)
68
+ )
69
+ end
70
+ end
71
+ end
72
+
73
+ def _nt_feature_sub
74
+ start_index = index
75
+ if node_cache[:feature_sub].has_key?(index)
76
+ cached = node_cache[:feature_sub][index]
77
+ @index = cached.interval.end if cached
78
+ return cached
79
+ end
80
+
81
+ i0, s0 = index, []
82
+ r1 = _nt_white
83
+ s0 << r1
84
+ if r1
85
+ r2 = _nt_comment
86
+ s0 << r2
87
+ if r2
88
+ r3 = _nt_white
89
+ s0 << r3
90
+ if r3
91
+ r4 = _nt_tags
92
+ s0 << r4
93
+ if r4
94
+ r5 = _nt_white
95
+ s0 << r5
96
+ if r5
97
+ s6, i6 = [], index
98
+ loop do
99
+ i7, s7 = index, []
100
+ i8 = index
101
+ i9 = index
102
+ r10 = _nt_scenario_outline
103
+ if r10
104
+ r9 = r10
105
+ else
106
+ r11 = _nt_scenario
107
+ if r11
108
+ r9 = r11
109
+ else
110
+ r12 = _nt_background
111
+ if r12
112
+ r9 = r12
113
+ else
114
+ self.index = i9
115
+ r9 = nil
116
+ end
117
+ end
118
+ end
119
+ if r9
120
+ r8 = nil
121
+ else
122
+ self.index = i8
123
+ r8 = instantiate_node(SyntaxNode,input, index...index)
124
+ end
125
+ s7 << r8
126
+ if r8
127
+ if index < input_length
128
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
129
+ @index += 1
130
+ else
131
+ terminal_parse_failure("any character")
132
+ r13 = nil
133
+ end
134
+ s7 << r13
135
+ end
136
+ if s7.last
137
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
138
+ r7.extend(FeatureSub0)
139
+ else
140
+ self.index = i7
141
+ r7 = nil
142
+ end
143
+ if r7
144
+ s6 << r7
145
+ else
146
+ break
147
+ end
148
+ end
149
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
150
+ s0 << r6
151
+ if r6
152
+ r15 = _nt_background
153
+ if r15
154
+ r14 = r15
155
+ else
156
+ r14 = instantiate_node(SyntaxNode,input, index...index)
157
+ end
158
+ s0 << r14
159
+ if r14
160
+ r16 = _nt_feature_elements
161
+ s0 << r16
162
+ if r16
163
+ r18 = _nt_comment
164
+ if r18
165
+ r17 = r18
166
+ else
167
+ r17 = instantiate_node(SyntaxNode,input, index...index)
168
+ end
169
+ s0 << r17
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ if s0.last
179
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
180
+ r0.extend(FeatureSub1)
181
+ r0.extend(FeatureSub2)
182
+ else
183
+ self.index = i0
184
+ r0 = nil
185
+ end
186
+
187
+ node_cache[:feature_sub][start_index] = r0
188
+
189
+ return r0
190
+ end
191
+
192
+ module Tags0
193
+ def tag
194
+ elements[0]
195
+ end
196
+
197
+ end
198
+
199
+ module Tags1
200
+ def white
201
+ elements[0]
202
+ end
203
+
204
+ def ts
205
+ elements[1]
206
+ end
207
+ end
208
+
209
+ module Tags2
210
+ def at_line?(line)
211
+ ts.elements.detect{|e| e.tag.line == line}
212
+ end
213
+
214
+ def has_tags?(tags)
215
+ (tag_names & tags).any?
216
+ end
217
+
218
+ def build
219
+ Ast::Tags.new(ts.line, tag_names)
220
+ end
221
+
222
+ def tag_names
223
+ @tag_names ||= ts.elements.map{|e| e.tag.tag_name.text_value}
224
+ end
225
+ end
226
+
227
+ def _nt_tags
228
+ start_index = index
229
+ if node_cache[:tags].has_key?(index)
230
+ cached = node_cache[:tags][index]
231
+ @index = cached.interval.end if cached
232
+ return cached
233
+ end
234
+
235
+ i0, s0 = index, []
236
+ r1 = _nt_white
237
+ s0 << r1
238
+ if r1
239
+ s2, i2 = [], index
240
+ loop do
241
+ i3, s3 = index, []
242
+ r4 = _nt_tag
243
+ s3 << r4
244
+ if r4
245
+ s5, i5 = [], index
246
+ loop do
247
+ i6 = index
248
+ r7 = _nt_space
249
+ if r7
250
+ r6 = r7
251
+ else
252
+ r8 = _nt_eol
253
+ if r8
254
+ r6 = r8
255
+ else
256
+ self.index = i6
257
+ r6 = nil
258
+ end
259
+ end
260
+ if r6
261
+ s5 << r6
262
+ else
263
+ break
264
+ end
265
+ end
266
+ if s5.empty?
267
+ self.index = i5
268
+ r5 = nil
269
+ else
270
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
271
+ end
272
+ s3 << r5
273
+ end
274
+ if s3.last
275
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
276
+ r3.extend(Tags0)
277
+ else
278
+ self.index = i3
279
+ r3 = nil
280
+ end
281
+ if r3
282
+ s2 << r3
283
+ else
284
+ break
285
+ end
286
+ end
287
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
288
+ s0 << r2
289
+ end
290
+ if s0.last
291
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
292
+ r0.extend(Tags1)
293
+ r0.extend(Tags2)
294
+ else
295
+ self.index = i0
296
+ r0 = nil
297
+ end
298
+
299
+ node_cache[:tags][start_index] = r0
300
+
301
+ return r0
302
+ end
303
+
304
+ module Tag0
305
+ def tag_name
306
+ elements[1]
307
+ end
308
+ end
309
+
310
+ def _nt_tag
311
+ start_index = index
312
+ if node_cache[:tag].has_key?(index)
313
+ cached = node_cache[:tag][index]
314
+ @index = cached.interval.end if cached
315
+ return cached
316
+ end
317
+
318
+ i0, s0 = index, []
319
+ if input.index('@', index) == index
320
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
321
+ @index += 1
322
+ else
323
+ terminal_parse_failure('@')
324
+ r1 = nil
325
+ end
326
+ s0 << r1
327
+ if r1
328
+ s2, i2 = [], index
329
+ loop do
330
+ if input.index(Regexp.new('[^@\\r\\n\\t ]'), index) == index
331
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
332
+ @index += 1
333
+ else
334
+ r3 = nil
335
+ end
336
+ if r3
337
+ s2 << r3
338
+ else
339
+ break
340
+ end
341
+ end
342
+ if s2.empty?
343
+ self.index = i2
344
+ r2 = nil
345
+ else
346
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
347
+ end
348
+ s0 << r2
349
+ end
350
+ if s0.last
351
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
352
+ r0.extend(Tag0)
353
+ else
354
+ self.index = i0
355
+ r0 = nil
356
+ end
357
+
358
+ node_cache[:tag][start_index] = r0
359
+
360
+ return r0
361
+ end
362
+
363
+ module Comment0
364
+ def comment_line
365
+ elements[0]
366
+ end
367
+
368
+ def white
369
+ elements[1]
370
+ end
371
+ end
372
+
373
+ module Comment1
374
+ def build
375
+ Ast::Comment.new(text_value)
376
+ end
377
+ end
378
+
379
+ def _nt_comment
380
+ start_index = index
381
+ if node_cache[:comment].has_key?(index)
382
+ cached = node_cache[:comment][index]
383
+ @index = cached.interval.end if cached
384
+ return cached
385
+ end
386
+
387
+ s0, i0 = [], index
388
+ loop do
389
+ i1, s1 = index, []
390
+ r2 = _nt_comment_line
391
+ s1 << r2
392
+ if r2
393
+ r3 = _nt_white
394
+ s1 << r3
395
+ end
396
+ if s1.last
397
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
398
+ r1.extend(Comment0)
399
+ else
400
+ self.index = i1
401
+ r1 = nil
402
+ end
403
+ if r1
404
+ s0 << r1
405
+ else
406
+ break
407
+ end
408
+ end
409
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
410
+ r0.extend(Comment1)
411
+
412
+ node_cache[:comment][start_index] = r0
413
+
414
+ return r0
415
+ end
416
+
417
+ module CommentLine0
418
+ def line_to_eol
419
+ elements[1]
420
+ end
421
+ end
422
+
423
+ def _nt_comment_line
424
+ start_index = index
425
+ if node_cache[:comment_line].has_key?(index)
426
+ cached = node_cache[:comment_line][index]
427
+ @index = cached.interval.end if cached
428
+ return cached
429
+ end
430
+
431
+ i0, s0 = index, []
432
+ if input.index('#', index) == index
433
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
434
+ @index += 1
435
+ else
436
+ terminal_parse_failure('#')
437
+ r1 = nil
438
+ end
439
+ s0 << r1
440
+ if r1
441
+ r2 = _nt_line_to_eol
442
+ s0 << r2
443
+ end
444
+ if s0.last
445
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
446
+ r0.extend(CommentLine0)
447
+ else
448
+ self.index = i0
449
+ r0 = nil
450
+ end
451
+
452
+ node_cache[:comment_line][start_index] = r0
453
+
454
+ return r0
455
+ end
456
+
457
+ module Background0
458
+ def comment
459
+ elements[0]
460
+ end
461
+
462
+ def white
463
+ elements[1]
464
+ end
465
+
466
+ def background_keyword
467
+ elements[2]
468
+ end
469
+
470
+ def name
471
+ elements[4]
472
+ end
473
+
474
+ def steps
475
+ elements[6]
476
+ end
477
+ end
478
+
479
+ module Background1
480
+ def matches_name?(regexp_to_match)
481
+ name.build =~ regexp_to_match
482
+ end
483
+
484
+ def at_line?(line)
485
+ background_keyword.line == line ||
486
+ steps.at_line?(line)
487
+ end
488
+
489
+ def has_tags?(tag_names)
490
+ feature_tags = self.parent.tags
491
+ feature_tags.has_tags?(tag_names)
492
+ end
493
+
494
+ def build
495
+ Ast::Background.new(
496
+ comment.build,
497
+ background_keyword.line,
498
+ background_keyword.text_value,
499
+ name.build,
500
+ steps.build
501
+ )
502
+ end
503
+ end
504
+
505
+ def _nt_background
506
+ start_index = index
507
+ if node_cache[:background].has_key?(index)
508
+ cached = node_cache[:background][index]
509
+ @index = cached.interval.end if cached
510
+ return cached
511
+ end
512
+
513
+ i0, s0 = index, []
514
+ r1 = _nt_comment
515
+ s0 << r1
516
+ if r1
517
+ r2 = _nt_white
518
+ s0 << r2
519
+ if r2
520
+ r3 = _nt_background_keyword
521
+ s0 << r3
522
+ if r3
523
+ s4, i4 = [], index
524
+ loop do
525
+ r5 = _nt_space
526
+ if r5
527
+ s4 << r5
528
+ else
529
+ break
530
+ end
531
+ end
532
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
533
+ s0 << r4
534
+ if r4
535
+ r7 = _nt_lines_to_keyword
536
+ if r7
537
+ r6 = r7
538
+ else
539
+ r6 = instantiate_node(SyntaxNode,input, index...index)
540
+ end
541
+ s0 << r6
542
+ if r6
543
+ i8 = index
544
+ s9, i9 = [], index
545
+ loop do
546
+ r10 = _nt_eol
547
+ if r10
548
+ s9 << r10
549
+ else
550
+ break
551
+ end
552
+ end
553
+ if s9.empty?
554
+ self.index = i9
555
+ r9 = nil
556
+ else
557
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
558
+ end
559
+ if r9
560
+ r8 = r9
561
+ else
562
+ r11 = _nt_eof
563
+ if r11
564
+ r8 = r11
565
+ else
566
+ self.index = i8
567
+ r8 = nil
568
+ end
569
+ end
570
+ s0 << r8
571
+ if r8
572
+ r12 = _nt_steps
573
+ s0 << r12
574
+ end
575
+ end
576
+ end
577
+ end
578
+ end
579
+ end
580
+ if s0.last
581
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
582
+ r0.extend(Background0)
583
+ r0.extend(Background1)
584
+ else
585
+ self.index = i0
586
+ r0 = nil
587
+ end
588
+
589
+ node_cache[:background][start_index] = r0
590
+
591
+ return r0
592
+ end
593
+
594
+ module FeatureElements0
595
+ def accept?(filter)
596
+ filter.nil? || elements.empty? || elements.detect{|feature_element| filter.accept?(feature_element)}
597
+ end
598
+
599
+ def build(background, filter)
600
+ elements.map do |feature_element|
601
+ if filter.nil? || filter.accept?(feature_element)
602
+ feature_element.build(background, filter)
603
+ end
604
+ end.compact
605
+ end
606
+ end
607
+
608
+ def _nt_feature_elements
609
+ start_index = index
610
+ if node_cache[:feature_elements].has_key?(index)
611
+ cached = node_cache[:feature_elements][index]
612
+ @index = cached.interval.end if cached
613
+ return cached
614
+ end
615
+
616
+ s0, i0 = [], index
617
+ loop do
618
+ i1 = index
619
+ r2 = _nt_scenario
620
+ if r2
621
+ r1 = r2
622
+ else
623
+ r3 = _nt_scenario_outline
624
+ if r3
625
+ r1 = r3
626
+ else
627
+ self.index = i1
628
+ r1 = nil
629
+ end
630
+ end
631
+ if r1
632
+ s0 << r1
633
+ else
634
+ break
635
+ end
636
+ end
637
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
638
+ r0.extend(FeatureElements0)
639
+
640
+ node_cache[:feature_elements][start_index] = r0
641
+
642
+ return r0
643
+ end
644
+
645
+ module Scenario0
646
+ def comment
647
+ elements[0]
648
+ end
649
+
650
+ def tags
651
+ elements[1]
652
+ end
653
+
654
+ def white
655
+ elements[2]
656
+ end
657
+
658
+ def scenario_keyword
659
+ elements[3]
660
+ end
661
+
662
+ def name
663
+ elements[5]
664
+ end
665
+
666
+ def white
667
+ elements[6]
668
+ end
669
+
670
+ def steps
671
+ elements[7]
672
+ end
673
+
674
+ def white
675
+ elements[8]
676
+ end
677
+ end
678
+
679
+ module Scenario1
680
+ def at_line?(line)
681
+ scenario_keyword.line == line ||
682
+ steps.at_line?(line) ||
683
+ tags.at_line?(line)
684
+ end
685
+
686
+ def has_tags?(tag_names)
687
+ feature_tags = self.parent.parent.tags
688
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
689
+ end
690
+
691
+ def matches_name?(regexp_to_match)
692
+ name.build =~ regexp_to_match
693
+ end
694
+
695
+ def build(background, filter)
696
+ Ast::Scenario.new(
697
+ background,
698
+ comment.build,
699
+ tags.build,
700
+ scenario_keyword.line,
701
+ scenario_keyword.text_value,
702
+ name.build,
703
+ steps.build
704
+ )
705
+ end
706
+ end
707
+
708
+ def _nt_scenario
709
+ start_index = index
710
+ if node_cache[:scenario].has_key?(index)
711
+ cached = node_cache[:scenario][index]
712
+ @index = cached.interval.end if cached
713
+ return cached
714
+ end
715
+
716
+ i0, s0 = index, []
717
+ r1 = _nt_comment
718
+ s0 << r1
719
+ if r1
720
+ r2 = _nt_tags
721
+ s0 << r2
722
+ if r2
723
+ r3 = _nt_white
724
+ s0 << r3
725
+ if r3
726
+ r4 = _nt_scenario_keyword
727
+ s0 << r4
728
+ if r4
729
+ s5, i5 = [], index
730
+ loop do
731
+ r6 = _nt_space
732
+ if r6
733
+ s5 << r6
734
+ else
735
+ break
736
+ end
737
+ end
738
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
739
+ s0 << r5
740
+ if r5
741
+ r7 = _nt_lines_to_keyword
742
+ s0 << r7
743
+ if r7
744
+ r8 = _nt_white
745
+ s0 << r8
746
+ if r8
747
+ r9 = _nt_steps
748
+ s0 << r9
749
+ if r9
750
+ r10 = _nt_white
751
+ s0 << r10
752
+ end
753
+ end
754
+ end
755
+ end
756
+ end
757
+ end
758
+ end
759
+ end
760
+ if s0.last
761
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
762
+ r0.extend(Scenario0)
763
+ r0.extend(Scenario1)
764
+ else
765
+ self.index = i0
766
+ r0 = nil
767
+ end
768
+
769
+ node_cache[:scenario][start_index] = r0
770
+
771
+ return r0
772
+ end
773
+
774
+ module ScenarioOutline0
775
+ def comment
776
+ elements[0]
777
+ end
778
+
779
+ def tags
780
+ elements[1]
781
+ end
782
+
783
+ def white
784
+ elements[2]
785
+ end
786
+
787
+ def scenario_outline_keyword
788
+ elements[3]
789
+ end
790
+
791
+ def name
792
+ elements[5]
793
+ end
794
+
795
+ def white
796
+ elements[6]
797
+ end
798
+
799
+ def steps
800
+ elements[7]
801
+ end
802
+
803
+ def examples_sections
804
+ elements[8]
805
+ end
806
+
807
+ def white
808
+ elements[9]
809
+ end
810
+ end
811
+
812
+ module ScenarioOutline1
813
+ def at_line?(line)
814
+ outline_at_line?(line) ||
815
+ examples_sections.at_line?(line) ||
816
+ tags.at_line?(line)
817
+ end
818
+
819
+ def outline_at_line?(line)
820
+ scenario_outline_keyword.line == line ||
821
+ steps.at_line?(line)
822
+ end
823
+
824
+ def has_tags?(tag_names)
825
+ feature_tags = self.parent.parent.tags
826
+ tags.has_tags?(tag_names) || feature_tags.has_tags?(tag_names)
827
+ end
828
+
829
+ def matches_name?(regexp_to_match)
830
+ outline_matches_name?(regexp_to_match) || examples_sections.matches_name?(regexp_to_match)
831
+ end
832
+
833
+ def outline_matches_name?(regexp_to_match)
834
+ name.build =~ regexp_to_match
835
+ end
836
+
837
+ def build(background, filter)
838
+ Ast::ScenarioOutline.new(
839
+ background,
840
+ comment.build,
841
+ tags.build,
842
+ scenario_outline_keyword.line,
843
+ scenario_outline_keyword.text_value,
844
+ name.build,
845
+ steps.build,
846
+ examples_sections.build(filter, self)
847
+ )
848
+ end
849
+ end
850
+
851
+ def _nt_scenario_outline
852
+ start_index = index
853
+ if node_cache[:scenario_outline].has_key?(index)
854
+ cached = node_cache[:scenario_outline][index]
855
+ @index = cached.interval.end if cached
856
+ return cached
857
+ end
858
+
859
+ i0, s0 = index, []
860
+ r1 = _nt_comment
861
+ s0 << r1
862
+ if r1
863
+ r2 = _nt_tags
864
+ s0 << r2
865
+ if r2
866
+ r3 = _nt_white
867
+ s0 << r3
868
+ if r3
869
+ r4 = _nt_scenario_outline_keyword
870
+ s0 << r4
871
+ if r4
872
+ s5, i5 = [], index
873
+ loop do
874
+ r6 = _nt_space
875
+ if r6
876
+ s5 << r6
877
+ else
878
+ break
879
+ end
880
+ end
881
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
882
+ s0 << r5
883
+ if r5
884
+ r7 = _nt_lines_to_keyword
885
+ s0 << r7
886
+ if r7
887
+ r8 = _nt_white
888
+ s0 << r8
889
+ if r8
890
+ r9 = _nt_steps
891
+ s0 << r9
892
+ if r9
893
+ r10 = _nt_examples_sections
894
+ s0 << r10
895
+ if r10
896
+ r11 = _nt_white
897
+ s0 << r11
898
+ end
899
+ end
900
+ end
901
+ end
902
+ end
903
+ end
904
+ end
905
+ end
906
+ end
907
+ if s0.last
908
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
909
+ r0.extend(ScenarioOutline0)
910
+ r0.extend(ScenarioOutline1)
911
+ else
912
+ self.index = i0
913
+ r0 = nil
914
+ end
915
+
916
+ node_cache[:scenario_outline][start_index] = r0
917
+
918
+ return r0
919
+ end
920
+
921
+ module Steps0
922
+ def at_line?(line)
923
+ elements.detect{|e| e.at_line?(line)}
924
+ end
925
+
926
+ def build
927
+ elements.map{|e| e.build}
928
+ end
929
+ end
930
+
931
+ def _nt_steps
932
+ start_index = index
933
+ if node_cache[:steps].has_key?(index)
934
+ cached = node_cache[:steps][index]
935
+ @index = cached.interval.end if cached
936
+ return cached
937
+ end
938
+
939
+ s0, i0 = [], index
940
+ loop do
941
+ r1 = _nt_step
942
+ if r1
943
+ s0 << r1
944
+ else
945
+ break
946
+ end
947
+ end
948
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
949
+ r0.extend(Steps0)
950
+
951
+ node_cache[:steps][start_index] = r0
952
+
953
+ return r0
954
+ end
955
+
956
+ module Step0
957
+ def comment
958
+ elements[0]
959
+ end
960
+
961
+ def step_keyword
962
+ elements[2]
963
+ end
964
+
965
+ def keyword_space
966
+ elements[3]
967
+ end
968
+
969
+ def name
970
+ elements[4]
971
+ end
972
+
973
+ def multi
974
+ elements[6]
975
+ end
976
+
977
+ def white
978
+ elements[7]
979
+ end
980
+ end
981
+
982
+ module Step1
983
+ def at_line?(line)
984
+ step_keyword.line == line ||
985
+ (multi.respond_to?(:at_line?) && multi.at_line?(line))
986
+ end
987
+
988
+ def build
989
+ if multi.respond_to?(:build)
990
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip, multi.build)
991
+ else
992
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip)
993
+ end
994
+ end
995
+ end
996
+
997
+ def _nt_step
998
+ start_index = index
999
+ if node_cache[:step].has_key?(index)
1000
+ cached = node_cache[:step][index]
1001
+ @index = cached.interval.end if cached
1002
+ return cached
1003
+ end
1004
+
1005
+ i0, s0 = index, []
1006
+ r1 = _nt_comment
1007
+ s0 << r1
1008
+ if r1
1009
+ s2, i2 = [], index
1010
+ loop do
1011
+ r3 = _nt_space
1012
+ if r3
1013
+ s2 << r3
1014
+ else
1015
+ break
1016
+ end
1017
+ end
1018
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1019
+ s0 << r2
1020
+ if r2
1021
+ r4 = _nt_step_keyword
1022
+ s0 << r4
1023
+ if r4
1024
+ r5 = _nt_keyword_space
1025
+ s0 << r5
1026
+ if r5
1027
+ r6 = _nt_line_to_eol
1028
+ s0 << r6
1029
+ if r6
1030
+ i7 = index
1031
+ s8, i8 = [], index
1032
+ loop do
1033
+ r9 = _nt_eol
1034
+ if r9
1035
+ s8 << r9
1036
+ else
1037
+ break
1038
+ end
1039
+ end
1040
+ if s8.empty?
1041
+ self.index = i8
1042
+ r8 = nil
1043
+ else
1044
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
1045
+ end
1046
+ if r8
1047
+ r7 = r8
1048
+ else
1049
+ r10 = _nt_eof
1050
+ if r10
1051
+ r7 = r10
1052
+ else
1053
+ self.index = i7
1054
+ r7 = nil
1055
+ end
1056
+ end
1057
+ s0 << r7
1058
+ if r7
1059
+ r12 = _nt_multiline_arg
1060
+ if r12
1061
+ r11 = r12
1062
+ else
1063
+ r11 = instantiate_node(SyntaxNode,input, index...index)
1064
+ end
1065
+ s0 << r11
1066
+ if r11
1067
+ r13 = _nt_white
1068
+ s0 << r13
1069
+ end
1070
+ end
1071
+ end
1072
+ end
1073
+ end
1074
+ end
1075
+ end
1076
+ if s0.last
1077
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1078
+ r0.extend(Step0)
1079
+ r0.extend(Step1)
1080
+ else
1081
+ self.index = i0
1082
+ r0 = nil
1083
+ end
1084
+
1085
+ node_cache[:step][start_index] = r0
1086
+
1087
+ return r0
1088
+ end
1089
+
1090
+ module ExamplesSections0
1091
+ def at_line?(line)
1092
+ elements.detect { |e| e.at_line?(line) }
1093
+ end
1094
+
1095
+ def matches_name?(regexp_to_match)
1096
+ elements.detect { |e| e.matches_name?(regexp_to_match) }
1097
+ end
1098
+
1099
+ def build(filter, scenario_outline)
1100
+ elements.map do |e|
1101
+ if(filter.nil? || filter.accept_example?(e, scenario_outline))
1102
+ e.build(filter, scenario_outline)
1103
+ end
1104
+ end.compact
1105
+ end
1106
+ end
1107
+
1108
+ def _nt_examples_sections
1109
+ start_index = index
1110
+ if node_cache[:examples_sections].has_key?(index)
1111
+ cached = node_cache[:examples_sections][index]
1112
+ @index = cached.interval.end if cached
1113
+ return cached
1114
+ end
1115
+
1116
+ s0, i0 = [], index
1117
+ loop do
1118
+ r1 = _nt_examples
1119
+ if r1
1120
+ s0 << r1
1121
+ else
1122
+ break
1123
+ end
1124
+ end
1125
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1126
+ r0.extend(ExamplesSections0)
1127
+
1128
+ node_cache[:examples_sections][start_index] = r0
1129
+
1130
+ return r0
1131
+ end
1132
+
1133
+ module Examples0
1134
+ def examples_keyword
1135
+ elements[1]
1136
+ end
1137
+
1138
+ def name
1139
+ elements[3]
1140
+ end
1141
+
1142
+ def eol
1143
+ elements[4]
1144
+ end
1145
+
1146
+ def table
1147
+ elements[5]
1148
+ end
1149
+
1150
+ def white
1151
+ elements[6]
1152
+ end
1153
+ end
1154
+
1155
+ module Examples1
1156
+ def at_line?(line)
1157
+ examples_keyword.line == line ||
1158
+ table.at_line?(line)
1159
+ end
1160
+
1161
+ def has_tags?(tag_names)
1162
+ true
1163
+ end
1164
+
1165
+ def outline_at_line?(line)
1166
+ true
1167
+ end
1168
+
1169
+ def matches_name?(regexp_to_match)
1170
+ name.build =~ regexp_to_match
1171
+ end
1172
+
1173
+ def build(filter, scenario_outline)
1174
+ [examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
1175
+ end
1176
+ end
1177
+
1178
+ def _nt_examples
1179
+ start_index = index
1180
+ if node_cache[:examples].has_key?(index)
1181
+ cached = node_cache[:examples][index]
1182
+ @index = cached.interval.end if cached
1183
+ return cached
1184
+ end
1185
+
1186
+ i0, s0 = index, []
1187
+ s1, i1 = [], index
1188
+ loop do
1189
+ r2 = _nt_space
1190
+ if r2
1191
+ s1 << r2
1192
+ else
1193
+ break
1194
+ end
1195
+ end
1196
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1197
+ s0 << r1
1198
+ if r1
1199
+ r3 = _nt_examples_keyword
1200
+ s0 << r3
1201
+ if r3
1202
+ s4, i4 = [], index
1203
+ loop do
1204
+ r5 = _nt_space
1205
+ if r5
1206
+ s4 << r5
1207
+ else
1208
+ break
1209
+ end
1210
+ end
1211
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1212
+ s0 << r4
1213
+ if r4
1214
+ r7 = _nt_lines_to_keyword
1215
+ if r7
1216
+ r6 = r7
1217
+ else
1218
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1219
+ end
1220
+ s0 << r6
1221
+ if r6
1222
+ r8 = _nt_eol
1223
+ s0 << r8
1224
+ if r8
1225
+ r9 = _nt_table
1226
+ s0 << r9
1227
+ if r9
1228
+ r10 = _nt_white
1229
+ s0 << r10
1230
+ end
1231
+ end
1232
+ end
1233
+ end
1234
+ end
1235
+ end
1236
+ if s0.last
1237
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1238
+ r0.extend(Examples0)
1239
+ r0.extend(Examples1)
1240
+ else
1241
+ self.index = i0
1242
+ r0 = nil
1243
+ end
1244
+
1245
+ node_cache[:examples][start_index] = r0
1246
+
1247
+ return r0
1248
+ end
1249
+
1250
+ def _nt_multiline_arg
1251
+ start_index = index
1252
+ if node_cache[:multiline_arg].has_key?(index)
1253
+ cached = node_cache[:multiline_arg][index]
1254
+ @index = cached.interval.end if cached
1255
+ return cached
1256
+ end
1257
+
1258
+ i0 = index
1259
+ r1 = _nt_table
1260
+ if r1
1261
+ r0 = r1
1262
+ else
1263
+ r2 = _nt_py_string
1264
+ if r2
1265
+ r0 = r2
1266
+ else
1267
+ self.index = i0
1268
+ r0 = nil
1269
+ end
1270
+ end
1271
+
1272
+ node_cache[:multiline_arg][start_index] = r0
1273
+
1274
+ return r0
1275
+ end
1276
+
1277
+ module LineToEol0
1278
+ end
1279
+
1280
+ def _nt_line_to_eol
1281
+ start_index = index
1282
+ if node_cache[:line_to_eol].has_key?(index)
1283
+ cached = node_cache[:line_to_eol][index]
1284
+ @index = cached.interval.end if cached
1285
+ return cached
1286
+ end
1287
+
1288
+ s0, i0 = [], index
1289
+ loop do
1290
+ i1, s1 = index, []
1291
+ i2 = index
1292
+ r3 = _nt_eol
1293
+ if r3
1294
+ r2 = nil
1295
+ else
1296
+ self.index = i2
1297
+ r2 = instantiate_node(SyntaxNode,input, index...index)
1298
+ end
1299
+ s1 << r2
1300
+ if r2
1301
+ if index < input_length
1302
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
1303
+ @index += 1
1304
+ else
1305
+ terminal_parse_failure("any character")
1306
+ r4 = nil
1307
+ end
1308
+ s1 << r4
1309
+ end
1310
+ if s1.last
1311
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1312
+ r1.extend(LineToEol0)
1313
+ else
1314
+ self.index = i1
1315
+ r1 = nil
1316
+ end
1317
+ if r1
1318
+ s0 << r1
1319
+ else
1320
+ break
1321
+ end
1322
+ end
1323
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1324
+
1325
+ node_cache[:line_to_eol][start_index] = r0
1326
+
1327
+ return r0
1328
+ end
1329
+
1330
+ module LinesToKeyword0
1331
+ def eol
1332
+ elements[0]
1333
+ end
1334
+
1335
+ def reserved_words_and_symbols
1336
+ elements[2]
1337
+ end
1338
+ end
1339
+
1340
+ module LinesToKeyword1
1341
+ end
1342
+
1343
+ module LinesToKeyword2
1344
+ def build
1345
+ self.text_value.split("\n").map{|s| s.strip}.join("\n")
1346
+ end
1347
+ end
1348
+
1349
+ def _nt_lines_to_keyword
1350
+ start_index = index
1351
+ if node_cache[:lines_to_keyword].has_key?(index)
1352
+ cached = node_cache[:lines_to_keyword][index]
1353
+ @index = cached.interval.end if cached
1354
+ return cached
1355
+ end
1356
+
1357
+ s0, i0 = [], index
1358
+ loop do
1359
+ i1, s1 = index, []
1360
+ i2 = index
1361
+ i3, s3 = index, []
1362
+ r4 = _nt_eol
1363
+ s3 << r4
1364
+ if r4
1365
+ s5, i5 = [], index
1366
+ loop do
1367
+ r6 = _nt_space
1368
+ if r6
1369
+ s5 << r6
1370
+ else
1371
+ break
1372
+ end
1373
+ end
1374
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
1375
+ s3 << r5
1376
+ if r5
1377
+ r7 = _nt_reserved_words_and_symbols
1378
+ s3 << r7
1379
+ end
1380
+ end
1381
+ if s3.last
1382
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1383
+ r3.extend(LinesToKeyword0)
1384
+ else
1385
+ self.index = i3
1386
+ r3 = nil
1387
+ end
1388
+ if r3
1389
+ r2 = nil
1390
+ else
1391
+ self.index = i2
1392
+ r2 = instantiate_node(SyntaxNode,input, index...index)
1393
+ end
1394
+ s1 << r2
1395
+ if r2
1396
+ if index < input_length
1397
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
1398
+ @index += 1
1399
+ else
1400
+ terminal_parse_failure("any character")
1401
+ r8 = nil
1402
+ end
1403
+ s1 << r8
1404
+ end
1405
+ if s1.last
1406
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1407
+ r1.extend(LinesToKeyword1)
1408
+ else
1409
+ self.index = i1
1410
+ r1 = nil
1411
+ end
1412
+ if r1
1413
+ s0 << r1
1414
+ else
1415
+ break
1416
+ end
1417
+ end
1418
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1419
+ r0.extend(LinesToKeyword2)
1420
+
1421
+ node_cache[:lines_to_keyword][start_index] = r0
1422
+
1423
+ return r0
1424
+ end
1425
+
1426
+ module ReservedWordsAndSymbols0
1427
+ def step_keyword
1428
+ elements[0]
1429
+ end
1430
+
1431
+ def keyword_space
1432
+ elements[1]
1433
+ end
1434
+ end
1435
+
1436
+ def _nt_reserved_words_and_symbols
1437
+ start_index = index
1438
+ if node_cache[:reserved_words_and_symbols].has_key?(index)
1439
+ cached = node_cache[:reserved_words_and_symbols][index]
1440
+ @index = cached.interval.end if cached
1441
+ return cached
1442
+ end
1443
+
1444
+ i0 = index
1445
+ i1, s1 = index, []
1446
+ r2 = _nt_step_keyword
1447
+ s1 << r2
1448
+ if r2
1449
+ r3 = _nt_keyword_space
1450
+ s1 << r3
1451
+ end
1452
+ if s1.last
1453
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1454
+ r1.extend(ReservedWordsAndSymbols0)
1455
+ else
1456
+ self.index = i1
1457
+ r1 = nil
1458
+ end
1459
+ if r1
1460
+ r0 = r1
1461
+ else
1462
+ r4 = _nt_scenario_keyword
1463
+ if r4
1464
+ r0 = r4
1465
+ else
1466
+ r5 = _nt_scenario_outline_keyword
1467
+ if r5
1468
+ r0 = r5
1469
+ else
1470
+ r6 = _nt_table
1471
+ if r6
1472
+ r0 = r6
1473
+ else
1474
+ r7 = _nt_tag
1475
+ if r7
1476
+ r0 = r7
1477
+ else
1478
+ r8 = _nt_comment_line
1479
+ if r8
1480
+ r0 = r8
1481
+ else
1482
+ self.index = i0
1483
+ r0 = nil
1484
+ end
1485
+ end
1486
+ end
1487
+ end
1488
+ end
1489
+ end
1490
+
1491
+ node_cache[:reserved_words_and_symbols][start_index] = r0
1492
+
1493
+ return r0
1494
+ end
1495
+
1496
+ module PyString0
1497
+ end
1498
+
1499
+ module PyString1
1500
+ def open_py_string
1501
+ elements[0]
1502
+ end
1503
+
1504
+ def s
1505
+ elements[1]
1506
+ end
1507
+
1508
+ def close_py_string
1509
+ elements[2]
1510
+ end
1511
+ end
1512
+
1513
+ module PyString2
1514
+ def at_line?(line)
1515
+ line >= open_py_string.line && line <= close_py_string.line
1516
+ end
1517
+
1518
+ def build
1519
+ Ast::PyString.new(open_py_string.line, close_py_string.line, s.text_value, open_py_string.indentation)
1520
+ end
1521
+ end
1522
+
1523
+ def _nt_py_string
1524
+ start_index = index
1525
+ if node_cache[:py_string].has_key?(index)
1526
+ cached = node_cache[:py_string][index]
1527
+ @index = cached.interval.end if cached
1528
+ return cached
1529
+ end
1530
+
1531
+ i0, s0 = index, []
1532
+ r1 = _nt_open_py_string
1533
+ s0 << r1
1534
+ if r1
1535
+ s2, i2 = [], index
1536
+ loop do
1537
+ i3, s3 = index, []
1538
+ i4 = index
1539
+ r5 = _nt_close_py_string
1540
+ if r5
1541
+ r4 = nil
1542
+ else
1543
+ self.index = i4
1544
+ r4 = instantiate_node(SyntaxNode,input, index...index)
1545
+ end
1546
+ s3 << r4
1547
+ if r4
1548
+ if index < input_length
1549
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1550
+ @index += 1
1551
+ else
1552
+ terminal_parse_failure("any character")
1553
+ r6 = nil
1554
+ end
1555
+ s3 << r6
1556
+ end
1557
+ if s3.last
1558
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1559
+ r3.extend(PyString0)
1560
+ else
1561
+ self.index = i3
1562
+ r3 = nil
1563
+ end
1564
+ if r3
1565
+ s2 << r3
1566
+ else
1567
+ break
1568
+ end
1569
+ end
1570
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1571
+ s0 << r2
1572
+ if r2
1573
+ r7 = _nt_close_py_string
1574
+ s0 << r7
1575
+ end
1576
+ end
1577
+ if s0.last
1578
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1579
+ r0.extend(PyString1)
1580
+ r0.extend(PyString2)
1581
+ else
1582
+ self.index = i0
1583
+ r0 = nil
1584
+ end
1585
+
1586
+ node_cache[:py_string][start_index] = r0
1587
+
1588
+ return r0
1589
+ end
1590
+
1591
+ module OpenPyString0
1592
+ def indent
1593
+ elements[0]
1594
+ end
1595
+
1596
+ def eol
1597
+ elements[3]
1598
+ end
1599
+ end
1600
+
1601
+ module OpenPyString1
1602
+ def indentation
1603
+ indent.text_value.length
1604
+ end
1605
+
1606
+ def line
1607
+ indent.line
1608
+ end
1609
+ end
1610
+
1611
+ def _nt_open_py_string
1612
+ start_index = index
1613
+ if node_cache[:open_py_string].has_key?(index)
1614
+ cached = node_cache[:open_py_string][index]
1615
+ @index = cached.interval.end if cached
1616
+ return cached
1617
+ end
1618
+
1619
+ i0, s0 = index, []
1620
+ s1, i1 = [], index
1621
+ loop do
1622
+ r2 = _nt_space
1623
+ if r2
1624
+ s1 << r2
1625
+ else
1626
+ break
1627
+ end
1628
+ end
1629
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1630
+ s0 << r1
1631
+ if r1
1632
+ if input.index('"""', index) == index
1633
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
1634
+ @index += 3
1635
+ else
1636
+ terminal_parse_failure('"""')
1637
+ r3 = nil
1638
+ end
1639
+ s0 << r3
1640
+ if r3
1641
+ s4, i4 = [], index
1642
+ loop do
1643
+ r5 = _nt_space
1644
+ if r5
1645
+ s4 << r5
1646
+ else
1647
+ break
1648
+ end
1649
+ end
1650
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1651
+ s0 << r4
1652
+ if r4
1653
+ r6 = _nt_eol
1654
+ s0 << r6
1655
+ end
1656
+ end
1657
+ end
1658
+ if s0.last
1659
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1660
+ r0.extend(OpenPyString0)
1661
+ r0.extend(OpenPyString1)
1662
+ else
1663
+ self.index = i0
1664
+ r0 = nil
1665
+ end
1666
+
1667
+ node_cache[:open_py_string][start_index] = r0
1668
+
1669
+ return r0
1670
+ end
1671
+
1672
+ module ClosePyString0
1673
+ def eol
1674
+ elements[0]
1675
+ end
1676
+
1677
+ def quotes
1678
+ elements[2]
1679
+ end
1680
+
1681
+ def white
1682
+ elements[3]
1683
+ end
1684
+ end
1685
+
1686
+ module ClosePyString1
1687
+ def line
1688
+ quotes.line
1689
+ end
1690
+ end
1691
+
1692
+ def _nt_close_py_string
1693
+ start_index = index
1694
+ if node_cache[:close_py_string].has_key?(index)
1695
+ cached = node_cache[:close_py_string][index]
1696
+ @index = cached.interval.end if cached
1697
+ return cached
1698
+ end
1699
+
1700
+ i0, s0 = index, []
1701
+ r1 = _nt_eol
1702
+ s0 << r1
1703
+ if r1
1704
+ s2, i2 = [], index
1705
+ loop do
1706
+ r3 = _nt_space
1707
+ if r3
1708
+ s2 << r3
1709
+ else
1710
+ break
1711
+ end
1712
+ end
1713
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1714
+ s0 << r2
1715
+ if r2
1716
+ if input.index('"""', index) == index
1717
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
1718
+ @index += 3
1719
+ else
1720
+ terminal_parse_failure('"""')
1721
+ r4 = nil
1722
+ end
1723
+ s0 << r4
1724
+ if r4
1725
+ r5 = _nt_white
1726
+ s0 << r5
1727
+ end
1728
+ end
1729
+ end
1730
+ if s0.last
1731
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1732
+ r0.extend(ClosePyString0)
1733
+ r0.extend(ClosePyString1)
1734
+ else
1735
+ self.index = i0
1736
+ r0 = nil
1737
+ end
1738
+
1739
+ node_cache[:close_py_string][start_index] = r0
1740
+
1741
+ return r0
1742
+ end
1743
+
1744
+ def _nt_white
1745
+ start_index = index
1746
+ if node_cache[:white].has_key?(index)
1747
+ cached = node_cache[:white][index]
1748
+ @index = cached.interval.end if cached
1749
+ return cached
1750
+ end
1751
+
1752
+ s0, i0 = [], index
1753
+ loop do
1754
+ i1 = index
1755
+ r2 = _nt_space
1756
+ if r2
1757
+ r1 = r2
1758
+ else
1759
+ r3 = _nt_eol
1760
+ if r3
1761
+ r1 = r3
1762
+ else
1763
+ self.index = i1
1764
+ r1 = nil
1765
+ end
1766
+ end
1767
+ if r1
1768
+ s0 << r1
1769
+ else
1770
+ break
1771
+ end
1772
+ end
1773
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1774
+
1775
+ node_cache[:white][start_index] = r0
1776
+
1777
+ return r0
1778
+ end
1779
+
1780
+ end
1781
+
1782
+ class FeatureParser < Treetop::Runtime::CompiledParser
1783
+ include Feature
1784
+ end
1785
+
1786
+ end
1787
+ end