engineyard-cucumber 0.3.101

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