dwaite-cucumber 0.3.101

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 (454) hide show
  1. data/History.txt +1067 -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/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 +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/a.html +183 -0
  279. data/features/html_formatter.feature +7 -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/ast/background.rb +63 -0
  315. data/lib/cucumber/ast/comment.rb +31 -0
  316. data/lib/cucumber/ast/examples.rb +32 -0
  317. data/lib/cucumber/ast/feature.rb +81 -0
  318. data/lib/cucumber/ast/feature_element.rb +61 -0
  319. data/lib/cucumber/ast/features.rb +40 -0
  320. data/lib/cucumber/ast/outline_table.rb +146 -0
  321. data/lib/cucumber/ast/py_string.rb +57 -0
  322. data/lib/cucumber/ast/scenario.rb +108 -0
  323. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  324. data/lib/cucumber/ast/step.rb +116 -0
  325. data/lib/cucumber/ast/step_collection.rb +76 -0
  326. data/lib/cucumber/ast/step_invocation.rb +166 -0
  327. data/lib/cucumber/ast/table.rb +626 -0
  328. data/lib/cucumber/ast/tags.rb +44 -0
  329. data/lib/cucumber/ast/visitor.rb +115 -0
  330. data/lib/cucumber/ast.rb +29 -0
  331. data/lib/cucumber/broadcaster.rb +13 -0
  332. data/lib/cucumber/cli/configuration.rb +190 -0
  333. data/lib/cucumber/cli/drb_client.rb +26 -0
  334. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  335. data/lib/cucumber/cli/main.rb +116 -0
  336. data/lib/cucumber/cli/options.rb +394 -0
  337. data/lib/cucumber/cli/profile_loader.rb +70 -0
  338. data/lib/cucumber/constantize.rb +28 -0
  339. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  340. data/lib/cucumber/core_ext/proc.rb +29 -0
  341. data/lib/cucumber/core_ext/string.rb +48 -0
  342. data/lib/cucumber/feature_file.rb +54 -0
  343. data/lib/cucumber/filter.rb +52 -0
  344. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  345. data/lib/cucumber/formatter/color_io.rb +23 -0
  346. data/lib/cucumber/formatter/console.rb +185 -0
  347. data/lib/cucumber/formatter/cucumber.css +132 -0
  348. data/lib/cucumber/formatter/cucumber.sass +139 -0
  349. data/lib/cucumber/formatter/duration.rb +13 -0
  350. data/lib/cucumber/formatter/html.rb +261 -0
  351. data/lib/cucumber/formatter/junit.rb +121 -0
  352. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  353. data/lib/cucumber/formatter/pdf.rb +217 -0
  354. data/lib/cucumber/formatter/pretty.rb +222 -0
  355. data/lib/cucumber/formatter/profile.rb +78 -0
  356. data/lib/cucumber/formatter/progress.rb +67 -0
  357. data/lib/cucumber/formatter/rerun.rb +46 -0
  358. data/lib/cucumber/formatter/steps.rb +50 -0
  359. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  360. data/lib/cucumber/formatter/unicode.rb +35 -0
  361. data/lib/cucumber/formatter/usage.rb +86 -0
  362. data/lib/cucumber/formatters/unicode.rb +7 -0
  363. data/lib/cucumber/language_support/language_methods.rb +75 -0
  364. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  365. data/lib/cucumber/language_support.rb +30 -0
  366. data/lib/cucumber/languages.yml +561 -0
  367. data/lib/cucumber/parser/feature.rb +1838 -0
  368. data/lib/cucumber/parser/feature.tt +351 -0
  369. data/lib/cucumber/parser/i18n.tt +42 -0
  370. data/lib/cucumber/parser/natural_language.rb +72 -0
  371. data/lib/cucumber/parser/table.rb +417 -0
  372. data/lib/cucumber/parser/table.tt +71 -0
  373. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  374. data/lib/cucumber/parser.rb +6 -0
  375. data/lib/cucumber/platform.rb +27 -0
  376. data/lib/cucumber/py_support/py_dsl.py +8 -0
  377. data/lib/cucumber/py_support/py_language.py +2 -0
  378. data/lib/cucumber/py_support/py_language.rb +68 -0
  379. data/lib/cucumber/rails/rspec.rb +10 -0
  380. data/lib/cucumber/rails/world.rb +100 -0
  381. data/lib/cucumber/rake/task.rb +241 -0
  382. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  383. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  384. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  386. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  387. data/lib/cucumber/rspec_neuter.rb +23 -0
  388. data/lib/cucumber/step_match.rb +61 -0
  389. data/lib/cucumber/step_mother.rb +307 -0
  390. data/lib/cucumber/version.rb +10 -0
  391. data/lib/cucumber/webrat/element_locator.rb +87 -0
  392. data/lib/cucumber/webrat/table_locator.rb +1 -0
  393. data/lib/cucumber.rb +10 -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,100 @@
1
+ # Based on code from Brian Takita, Yurii Rashkovskii and Ben Mabey
2
+ # Adapted by Aslak Hellesøy
3
+
4
+ if defined?(ActiveRecord::Base)
5
+ require 'test_help'
6
+ else
7
+ require 'action_controller/test_process'
8
+ require 'action_controller/integration'
9
+ end
10
+
11
+ begin
12
+ require 'test/unit/testresult'
13
+ rescue LoadError => e
14
+ e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
15
+ e.message << "\nAlso make sure you have rack 1.0.0 or higher."
16
+ raise e
17
+ end
18
+
19
+ # So that Test::Unit doesn't launch at the end - makes it think it has already been run.
20
+ Test::Unit.run = true if Test::Unit.respond_to?(:run=)
21
+
22
+ $__cucumber_toplevel = self
23
+
24
+ module Cucumber #:nodoc:
25
+ module Rails
26
+ # All scenarios will execute in the context of a new instance of Cucumber::Rails:World if this file
27
+ # is loaded. This gives Step Definitions access to all the methods from Rails' ActionController::IntegrationTest
28
+ class World < ActionController::IntegrationTest
29
+ if defined?(ActiveRecord::Base)
30
+ self.use_transactional_fixtures = false
31
+ else
32
+ def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
33
+ end
34
+
35
+ def initialize #:nodoc:
36
+ @_result = Test::Unit::TestResult.new
37
+ end
38
+ end
39
+
40
+ def self.use_transactional_fixtures
41
+
42
+ unless ::Rails.configuration.cache_classes
43
+ warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/test.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
44
+ end
45
+
46
+ World.use_transactional_fixtures = true
47
+ if defined?(ActiveRecord::Base)
48
+ $__cucumber_toplevel.Before do
49
+ @__cucumber_ar_connection = ActiveRecord::Base.connection
50
+ if @__cucumber_ar_connection.respond_to?(:increment_open_transactions)
51
+ @__cucumber_ar_connection.increment_open_transactions
52
+ else
53
+ ActiveRecord::Base.__send__(:increment_open_transactions)
54
+ end
55
+ @__cucumber_ar_connection.begin_db_transaction
56
+ ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
57
+ end
58
+
59
+ $__cucumber_toplevel.After do
60
+ @__cucumber_ar_connection.rollback_db_transaction
61
+ if @__cucumber_ar_connection.respond_to?(:decrement_open_transactions)
62
+ @__cucumber_ar_connection.decrement_open_transactions
63
+ else
64
+ ActiveRecord::Base.__send__(:decrement_open_transactions)
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ def self.bypass_rescue
71
+ ActionController::Base.class_eval do
72
+ alias_method :rescue_action_without_bypass, :rescue_action
73
+
74
+ def rescue_action(exception)
75
+ raise exception
76
+ end
77
+ end
78
+
79
+ begin
80
+ ActionController::Failsafe.class_eval do
81
+ alias_method :failsafe_response_without_bypass, :failsafe_response
82
+
83
+ def failsafe_response(exception)
84
+ raise exception
85
+ end
86
+ end
87
+ rescue NameError # Failsafe was introduced in Rails 2.3.2
88
+ ActionController::Dispatcher.class_eval do
89
+ def self.failsafe_response(output, status, exception = nil)
90
+ raise exception
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ World do
99
+ Cucumber::Rails::World.new
100
+ end
@@ -0,0 +1,241 @@
1
+ require 'cucumber/platform'
2
+
3
+ module Cucumber
4
+ module Rake
5
+ # Defines a Rake task for running features.
6
+ #
7
+ # The simplest use of it goes something like:
8
+ #
9
+ # Cucumber::Rake::Task.new
10
+ #
11
+ # This will define a task named <tt>cucumber</tt> described as 'Run Cucumber features'.
12
+ # It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
13
+ #
14
+ # To further configure the task, you can pass a block:
15
+ #
16
+ # Cucumber::Rake::Task.new do |t|
17
+ # t.cucumber_opts = %w{--format progress}
18
+ # end
19
+ #
20
+ # This task can also be configured to be run with RCov:
21
+ #
22
+ # Cucumber::Rake::Task.new do |t|
23
+ # t.rcov = true
24
+ # end
25
+ #
26
+ # See the attributes for additional configuration possibilities.
27
+ class Task
28
+ class InProcessCucumberRunner #:nodoc:
29
+ attr_reader :args
30
+
31
+ def initialize(libs, cucumber_opts, feature_files)
32
+ raise "libs must be an Array when running in-process" unless Array === libs
33
+ libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
34
+ @args = (
35
+ cucumber_opts +
36
+ feature_files
37
+ ).flatten.compact
38
+ end
39
+
40
+ def run
41
+ require 'cucumber/cli/main'
42
+ failure = Cucumber::Cli::Main.execute(args)
43
+ raise "Cucumber failed" if failure
44
+ end
45
+ end
46
+
47
+ class ForkedCucumberRunner #:nodoc:
48
+ attr_reader :args
49
+
50
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
51
+ @args = (
52
+ ['-I'] + load_path(libs) +
53
+ quoted_binary(cucumber_bin) +
54
+ cucumber_opts +
55
+ feature_files
56
+ ).flatten
57
+ end
58
+
59
+ def load_path(libs)
60
+ ['"%s"' % libs.join(File::PATH_SEPARATOR)]
61
+ end
62
+
63
+ def quoted_binary(cucumber_bin)
64
+ ['"%s"' % cucumber_bin]
65
+ end
66
+
67
+ def run
68
+ ruby(args.join(" ")) # ruby(*args) is broken on Windows
69
+ end
70
+ end
71
+
72
+ class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
73
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
74
+ @args = (
75
+ ['-I'] + load_path(libs) +
76
+ ['-S', 'rcov'] + rcov_opts +
77
+ quoted_binary(cucumber_bin) +
78
+ ['--'] +
79
+ cucumber_opts +
80
+ feature_files
81
+ ).flatten
82
+ end
83
+ end
84
+
85
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') #:nodoc:
86
+
87
+ # TODO: remove depreated accessors for 0.4.0
88
+ def self.deprecate_accessor(attribute) #:nodoc:
89
+ attr_reader attribute
90
+ class_eval <<-EOF, __FILE__, __LINE__ + 1
91
+ def #{attribute}=(value)
92
+ @#{attribute} = value
93
+ warn("\nWARNING: Cucumber::Rake::Task##{attribute} is deprecated and will be removed in 0.4.0. Please use profiles for complex settings: http://wiki.github.com/aslakhellesoy/cucumber/using-rake#profiles\n")
94
+ end
95
+ EOF
96
+ end
97
+
98
+ # Directories to add to the Ruby $LOAD_PATH
99
+ attr_accessor :libs
100
+
101
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
102
+ attr_accessor :binary
103
+
104
+ # Array of paths to specific step definition files to use
105
+ deprecate_accessor :step_list
106
+
107
+ # File pattern for finding step definitions. Defaults to
108
+ # 'features/**/*.rb'.
109
+ deprecate_accessor :step_pattern
110
+
111
+ # Array of paths to specific features to run.
112
+ deprecate_accessor :feature_list
113
+
114
+ # File pattern for finding features to run. Defaults to
115
+ # 'features/**/*.feature'. Can be overridden by the FEATURE environment variable.
116
+ deprecate_accessor :feature_pattern
117
+
118
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
119
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
120
+ attr_accessor :cucumber_opts
121
+ def cucumber_opts=(opts) #:nodoc:
122
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
123
+ end
124
+
125
+ # Run cucumber with RCov? Defaults to false. If you set this to
126
+ # true, +fork+ is implicit.
127
+ attr_accessor :rcov
128
+
129
+ # Extra options to pass to rcov.
130
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
131
+ attr_accessor :rcov_opts
132
+ def rcov_opts=(opts) #:nodoc:
133
+ @rcov_opts = String === opts ? opts.split(' ') : opts
134
+ end
135
+
136
+ # Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
137
+ # some startup speed if you set it to false, but this may also cause issues with
138
+ # your load path and gems.
139
+ attr_accessor :fork
140
+
141
+ # Define what profile to be used. When used with cucumber_opts it is simply appended to it. Will be ignored when CUCUMBER_OPTS is used.
142
+ attr_accessor :profile
143
+ def profile=(profile) #:nodoc:
144
+ @profile = profile
145
+ unless feature_list
146
+ # TODO: remove once we completely remove these from the rake task.
147
+ @step_list = []
148
+ @feature_list = [] # Don't use accessor to avoid deprecation warning.
149
+ end
150
+ end
151
+
152
+ # Define Cucumber Rake task
153
+ def initialize(task_name = "cucumber", desc = "Run Cucumber features")
154
+ @task_name, @desc = task_name, desc
155
+ @fork = true
156
+ @libs = ['lib']
157
+ @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
158
+
159
+ yield self if block_given?
160
+
161
+ @feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
162
+ @step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
163
+
164
+ @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
165
+ @libs.insert(0, LIB) if binary == Cucumber::BINARY
166
+
167
+ define_task
168
+ end
169
+
170
+ def define_task #:nodoc:
171
+ desc @desc
172
+ task @task_name do
173
+ runner.run
174
+ end
175
+ end
176
+
177
+ def runner(task_args = nil) #:nodoc:
178
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
179
+ if(@rcov)
180
+ RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args), rcov_opts)
181
+ elsif(@fork)
182
+ ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args))
183
+ else
184
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files(task_args))
185
+ end
186
+ end
187
+
188
+ def cucumber_opts_with_profile #:nodoc:
189
+ @profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
190
+ end
191
+
192
+ def feature_files(task_args = nil) #:nodoc:
193
+ if ENV['FEATURE']
194
+ FileList[ ENV['FEATURE'] ]
195
+ else
196
+ result = []
197
+ result += feature_list.to_a if feature_list
198
+ result += FileList[feature_pattern].to_a if feature_pattern
199
+ result = make_command_line_safe(result)
200
+ FileList[result]
201
+ end
202
+ end
203
+
204
+ def step_files(task_args = nil) #:nodoc:
205
+ if ENV['STEPS']
206
+ FileList[ ENV['STEPS'] ]
207
+ else
208
+ result = []
209
+ result += Array(step_list) if step_list
210
+ result += Array(FileList[step_pattern]) if step_pattern
211
+ FileList[result]
212
+ end
213
+ end
214
+
215
+ private
216
+ def make_command_line_safe(list)
217
+ list.map{|string| string.gsub(' ', '\ ')}
218
+ end
219
+ end
220
+
221
+ class FeatureTask < Task
222
+
223
+ def initialize(task_name = "feature", desc = "Run a specified feature with Cucumber. #{task_name}[feature_name]")
224
+ super(task_name, desc)
225
+ end
226
+
227
+ def define_task #:nodoc:
228
+ desc @desc
229
+ task @task_name, :feature_name do |t, args|
230
+ runner(args).run
231
+ end
232
+ end
233
+
234
+ def feature_files(task_arguments) #:nodoc:
235
+ FileList[File.join("features", "**", "#{task_arguments[:feature_name]}.feature")]
236
+ end
237
+
238
+ end
239
+
240
+ end
241
+ end
@@ -0,0 +1,100 @@
1
+ require 'cucumber/rb_support/rb_hook'
2
+
3
+ module Cucumber
4
+ module RbSupport
5
+ # This module defines the methods you can use to define pure Ruby
6
+ # Step Definitions and Hooks. This module is mixed into the toplevel
7
+ # object.
8
+ module RbDsl
9
+ class << self
10
+ attr_writer :rb_language
11
+
12
+ def alias_adverb(adverb)
13
+ alias_method adverb, :register_rb_step_definition
14
+ end
15
+
16
+ def build_rb_world_factory(world_modules, proc)
17
+ @rb_language.build_rb_world_factory(world_modules, proc)
18
+ end
19
+
20
+ def register_rb_hook(phase, tag_names, proc)
21
+ @rb_language.register_rb_hook(phase, tag_names, proc)
22
+ end
23
+
24
+ def register_rb_step_definition(regexp, proc)
25
+ @rb_language.register_rb_step_definition(regexp, proc)
26
+ end
27
+ end
28
+
29
+ # Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
30
+ # The +proc+ will be executed once before each scenario to create an
31
+ # Object that the scenario's steps will run within. Any +world_modules+
32
+ # will be mixed into this Object (via Object#extend).
33
+ #
34
+ # This method is typically called from one or more Ruby scripts under
35
+ # <tt>features/support</tt>. You can call this method as many times as you
36
+ # like (to register more modules), but if you try to register more than
37
+ # one Proc you will get an error.
38
+ #
39
+ # Cucumber will not yield anything to the +proc+. Examples:
40
+ #
41
+ # World do
42
+ # MyClass.new
43
+ # end
44
+ #
45
+ # World(MyModule)
46
+ #
47
+ def World(*world_modules, &proc)
48
+ RbDsl.build_rb_world_factory(world_modules, proc)
49
+ end
50
+
51
+ # Registers a proc that will run before each Scenario. You can register as
52
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
53
+ def Before(*tag_names, &proc)
54
+ RbDsl.register_rb_hook('before', tag_names, proc)
55
+ end
56
+
57
+ # Registers a proc that will run after each Scenario. You can register as
58
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
59
+ def After(*tag_names, &proc)
60
+ RbDsl.register_rb_hook('after', tag_names, proc)
61
+ end
62
+
63
+ # Registers a proc that will run after each Step. You can register as
64
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
65
+ def AfterStep(*tag_names, &proc)
66
+ RbDsl.register_rb_hook('after_step', tag_names, proc)
67
+ end
68
+
69
+ # Registers a proc that will be called with a step definition argument if it
70
+ # matches the pattern passed as the first argument to Transform. Alternatively, if
71
+ # the pattern contains captures then they will be yielded as arguments to the
72
+ # provided proc. The return value of the proc is consequently yielded to the
73
+ # step definition.
74
+ def Transform(*args, &proc)
75
+ StepMother.register_transform(*args, &proc)
76
+ end
77
+
78
+ # Registers a proc that will run after Cucumber is configured. You can register as
79
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
80
+ def AfterConfiguration(&proc)
81
+ RbDsl.register_rb_hook('after_configuration', [], proc)
82
+ end
83
+
84
+ # Registers a new Ruby StepDefinition. This method is aliased
85
+ # to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>, and
86
+ # also to the i18n translations whenever a feature of a
87
+ # new language is loaded.
88
+ #
89
+ # The +&proc+ gets executed in the context of a <tt>World</tt>
90
+ # object, which is defined by #World. A new <tt>World</tt>
91
+ # object is created for each scenario and is shared across
92
+ # step definitions within that scenario.
93
+ def register_rb_step_definition(regexp, &proc)
94
+ RbDsl.register_rb_step_definition(regexp, proc)
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ extend(Cucumber::RbSupport::RbDsl)
@@ -0,0 +1,18 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ # Wrapper for Before, After and AfterStep hooks
4
+ class RbHook
5
+ attr_reader :tag_names
6
+
7
+ def initialize(rb_language, tag_names, proc)
8
+ @rb_language = rb_language
9
+ @tag_names = tag_names
10
+ @proc = proc
11
+ end
12
+
13
+ def invoke(location, argument)
14
+ @rb_language.current_world.cucumber_instance_exec(false, location, argument, &@proc)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,153 @@
1
+ require 'cucumber/rb_support/rb_dsl'
2
+ require 'cucumber/rb_support/rb_world'
3
+ require 'cucumber/rb_support/rb_step_definition'
4
+
5
+ module Cucumber
6
+ module RbSupport
7
+ # Raised if a World block returns Nil.
8
+ class NilWorld < StandardError
9
+ def initialize
10
+ super("World procs should never return nil")
11
+ end
12
+ end
13
+
14
+ # Raised if there are 2 or more World blocks.
15
+ class MultipleWorld < StandardError
16
+ def initialize(first_proc, second_proc)
17
+ message = "You can only pass a proc to #World once, but it's happening\n"
18
+ message << "in 2 places:\n\n"
19
+ message << first_proc.backtrace_line('World') << "\n"
20
+ message << second_proc.backtrace_line('World') << "\n\n"
21
+ message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
22
+ message << "or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.\n\n"
23
+ super(message)
24
+ end
25
+ end
26
+
27
+ # The Ruby implementation of the programming language API.
28
+ class RbLanguage
29
+ include LanguageSupport::LanguageMethods
30
+ attr_reader :current_world
31
+
32
+ def initialize(step_mother)
33
+ @step_mother = step_mother
34
+ RbDsl.rb_language = self
35
+ end
36
+
37
+ def alias_adverbs(adverbs)
38
+ adverbs.each do |adverb|
39
+ RbDsl.alias_adverb(adverb)
40
+ RbWorld.alias_adverb(adverb)
41
+ end
42
+ end
43
+
44
+ def step_definitions_for(code_file)
45
+ begin
46
+ load_code_file(code_file)
47
+ step_definitions
48
+ rescue LoadError => e
49
+ e.message << "\nFailed to load #{code_file}"
50
+ raise e
51
+ ensure
52
+ @step_definitions = nil
53
+ end
54
+ end
55
+
56
+ def snippet_text(step_keyword, step_name, multiline_arg_class = nil)
57
+ escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
58
+ escaped = escaped.gsub(PARAM_PATTERN, ESCAPED_PARAM_PATTERN)
59
+
60
+ n = 0
61
+ block_args = escaped.scan(ESCAPED_PARAM_PATTERN).map do |a|
62
+ n += 1
63
+ "arg#{n}"
64
+ end
65
+ block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
66
+ block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
67
+ multiline_class_comment = ""
68
+ if(multiline_arg_class == Ast::Table)
69
+ multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
70
+ end
71
+
72
+ "#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_comment}pending\nend"
73
+ end
74
+
75
+ def begin_rb_scenario
76
+ create_world
77
+ extend_world
78
+ connect_world
79
+ end
80
+
81
+ def register_rb_hook(phase, tag_names, proc)
82
+ add_hook(phase, RbHook.new(self, tag_names, proc))
83
+ end
84
+
85
+ def register_rb_step_definition(regexp, proc)
86
+ add_step_definition(RbStepDefinition.new(self, regexp, proc))
87
+ end
88
+
89
+ def build_rb_world_factory(world_modules, proc)
90
+ if(proc)
91
+ raise MultipleWorld.new(@world_proc, proc) if @world_proc
92
+ @world_proc = proc
93
+ end
94
+ @world_modules ||= []
95
+ @world_modules += world_modules
96
+ end
97
+
98
+ protected
99
+
100
+ def load_code_file(code_file)
101
+ require code_file # This will cause self.add_step_definition and self.add_hook to be called from RbDsl
102
+ end
103
+
104
+ def begin_scenario
105
+ begin_rb_scenario
106
+ end
107
+
108
+ def end_scenario
109
+ @current_world = nil
110
+ end
111
+
112
+ private
113
+
114
+ PARAM_PATTERN = /"([^\"]*)"/
115
+ ESCAPED_PARAM_PATTERN = '"([^\\"]*)"'
116
+
117
+ def create_world
118
+ if(@world_proc)
119
+ @current_world = @world_proc.call
120
+ check_nil(@current_world, @world_proc)
121
+ else
122
+ @current_world = Object.new
123
+ end
124
+ end
125
+
126
+ def extend_world
127
+ @current_world.extend(RbWorld)
128
+ @current_world.extend(::Spec::Matchers) if defined?(::Spec::Matchers)
129
+ (@world_modules || []).each do |mod|
130
+ @current_world.extend(mod)
131
+ end
132
+ end
133
+
134
+ def connect_world
135
+ @current_world.__cucumber_step_mother = @step_mother
136
+ end
137
+
138
+ def check_nil(o, proc)
139
+ if o.nil?
140
+ begin
141
+ raise NilWorld.new
142
+ rescue NilWorld => e
143
+ e.backtrace.clear
144
+ e.backtrace.push(proc.backtrace_line("World"))
145
+ raise e
146
+ end
147
+ else
148
+ o
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,60 @@
1
+ require 'cucumber/step_match'
2
+ require 'cucumber/core_ext/string'
3
+ require 'cucumber/core_ext/proc'
4
+
5
+ module Cucumber
6
+ module RbSupport
7
+ # A Ruby Step Definition holds a Regexp and a Proc, and is created
8
+ # by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
9
+ # in the <tt>step_definitions</tt> ruby files. See also RbDsl.
10
+ #
11
+ # Example:
12
+ #
13
+ # Given /I have (\d+) cucumbers in my belly/ do
14
+ # # some code here
15
+ # end
16
+ #
17
+ class RbStepDefinition
18
+ include LanguageSupport::StepDefinitionMethods
19
+
20
+ class MissingProc < StandardError
21
+ def message
22
+ "Step definitions must always have a proc"
23
+ end
24
+ end
25
+
26
+ attr_reader :proc
27
+
28
+ def initialize(rb_language, pattern, proc)
29
+ raise MissingProc if proc.nil?
30
+ if String === pattern
31
+ p = pattern.gsub(/\$\w+/, '(.*)') # Replace $var with (.*)
32
+ pattern = Regexp.new("^#{p}$")
33
+ end
34
+ @rb_language, @regexp, @proc = rb_language, pattern, proc
35
+ end
36
+
37
+ def regexp
38
+ @regexp
39
+ end
40
+
41
+ def invoke(args)
42
+ args = args.map{|arg| Ast::PyString === arg ? arg.to_s : arg}
43
+ begin
44
+ @rb_language.current_world.cucumber_instance_exec(true, regexp.inspect, *args, &@proc)
45
+ rescue Cucumber::ArityMismatchError => e
46
+ e.backtrace.unshift(self.backtrace_line)
47
+ raise e
48
+ end
49
+ end
50
+
51
+ def file_colon_line
52
+ @proc.file_colon_line
53
+ end
54
+
55
+ def file
56
+ @file ||= file_colon_line.split(':')[0]
57
+ end
58
+ end
59
+ end
60
+ end