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,93 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ # All steps are run in the context of an object that extends this module.
4
+ module RbWorld
5
+ class << self
6
+ def alias_adverb(adverb)
7
+ alias_method adverb, :__cucumber_invoke
8
+ end
9
+ end
10
+
11
+ attr_writer :__cucumber_step_mother
12
+
13
+ # Call a step from within a step definition. This method is aliased to
14
+ # the same i18n as RbDsl.
15
+ def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
16
+ begin
17
+ step_match = @__cucumber_step_mother.step_match(name)
18
+ step_match.invoke(multiline_argument)
19
+ rescue Exception => e
20
+ e.nested! if Undefined === e
21
+ raise e
22
+ end
23
+ end
24
+
25
+ # Returns a Cucumber::Ast::Table for +text_or_table+, which can either
26
+ # be a String:
27
+ #
28
+ # table(%{
29
+ # | account | description | amount |
30
+ # | INT-100 | Taxi | 114 |
31
+ # | CUC-101 | Peeler | 22 |
32
+ # })
33
+ #
34
+ # or a 2D Array:
35
+ #
36
+ # table([
37
+ # %w{ account description amount },
38
+ # %w{ INT-100 Taxi 114 },
39
+ # %w{ CUC-101 Peeler 22 }
40
+ # ])
41
+ #
42
+ def table(text_or_table, file=nil, line_offset=0)
43
+ if Array === text_or_table
44
+ Ast::Table.new(text_or_table)
45
+ else
46
+ @table_parser ||= Parser::TableParser.new
47
+ @table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
48
+ end
49
+ end
50
+
51
+ # Output +announcement+ alongside the formatted output.
52
+ # This is an alternative to using Kernel#puts - it will display
53
+ # nicer, and in all outputs (in case you use several formatters)
54
+ #
55
+ # Beware that the output will be printed *before* the corresponding
56
+ # step. This is because the step itself will not be printed until
57
+ # after it has run, so it can be coloured according to its status.
58
+ def announce(announcement)
59
+ @__cucumber_step_mother.announce(announcement)
60
+ end
61
+
62
+ # Mark the matched step as pending.
63
+ def pending(message = "TODO")
64
+ if block_given?
65
+ begin
66
+ yield
67
+ rescue Exception => e
68
+ raise Pending.new(message)
69
+ end
70
+ raise Pending.new("Expected pending '#{message}' to fail. No Error was raised. No longer pending?")
71
+ else
72
+ raise Pending.new(message)
73
+ end
74
+ end
75
+
76
+ # The default implementation of Object#inspect recursively
77
+ # traverses all instance variables and invokes inspect.
78
+ # This can be time consuming if the object graph is large.
79
+ #
80
+ # This can cause unnecessary delays when certain exceptions
81
+ # occur. For example, MRI internally invokes #inspect on an
82
+ # object that raises a NoMethodError. (JRuby does not do this).
83
+ #
84
+ # A World object can have many references created by the user
85
+ # or frameworks (Rails), so to avoid long waiting times on
86
+ # such errors in World we define it to just return a simple String.
87
+ #
88
+ def inspect #:nodoc:
89
+ sprintf("#<%s:0x%x>", self.class, self.object_id)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,23 @@
1
+ require 'optparse'
2
+
3
+ module Spec #:nodoc:
4
+ module Runner #:nodoc:
5
+ # Neuters RSpec's option parser.
6
+ # (RSpec's option parser tries to parse ARGV, which
7
+ # will fail when running cucumber)
8
+ class OptionParser < ::OptionParser #:nodoc:
9
+ NEUTERED_RSPEC = Object.new
10
+ def NEUTERED_RSPEC.method_missing(m, *args); self; end
11
+
12
+ def self.method_added(m)
13
+ unless @__neutering_rspec
14
+ @__neutering_rspec = true
15
+ define_method(m) do |*a|
16
+ NEUTERED_RSPEC
17
+ end
18
+ @__neutering_rspec = false
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ module Cucumber
2
+ class StepMatch #:nodoc:
3
+ attr_reader :step_definition, :args
4
+
5
+ def initialize(step_definition, step_name, formatted_step_name, args)
6
+ @step_definition, @step_name, @formatted_step_name, @args = step_definition, step_name, formatted_step_name, args
7
+ end
8
+
9
+ def name
10
+ @formatted_step_name
11
+ end
12
+
13
+ def invoke(multiline_arg)
14
+ all_args = @args.dup
15
+ all_args << multiline_arg if multiline_arg
16
+ @step_definition.invoke(all_args)
17
+ end
18
+
19
+ def format_args(format = lambda{|a| a})
20
+ @formatted_step_name || @step_definition.format_args(@step_name, format)
21
+ end
22
+
23
+ def file_colon_line
24
+ @step_definition.file_colon_line
25
+ end
26
+
27
+ def backtrace_line
28
+ @step_definition.backtrace_line
29
+ end
30
+
31
+ def text_length
32
+ @step_definition.text_length
33
+ end
34
+ end
35
+
36
+ class NoStepMatch #:nodoc:
37
+ attr_reader :step_definition, :name
38
+
39
+ def initialize(step, name)
40
+ @step = step
41
+ @name = name
42
+ end
43
+
44
+ def format_args(format)
45
+ @name
46
+ end
47
+
48
+ def file_colon_line
49
+ raise "No file:line for #{@step}" unless @step.file_colon_line
50
+ @step.file_colon_line
51
+ end
52
+
53
+ def backtrace_line
54
+ @step.backtrace_line
55
+ end
56
+
57
+ def text_length
58
+ @step.text_length
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,307 @@
1
+ require 'cucumber/constantize'
2
+ require 'cucumber/core_ext/instance_exec'
3
+ require 'cucumber/parser/natural_language'
4
+ require 'cucumber/language_support/language_methods'
5
+ require 'cucumber/language_support/step_definition_methods'
6
+
7
+ module Cucumber
8
+ # Raised when there is no matching StepDefinition for a step.
9
+ class Undefined < StandardError
10
+ attr_reader :step_name
11
+
12
+ def initialize(step_name)
13
+ super %{Undefined step: "#{step_name}"}
14
+ @step_name = step_name
15
+ end
16
+
17
+ def nested!
18
+ @nested = true
19
+ end
20
+
21
+ def nested?
22
+ @nested
23
+ end
24
+ end
25
+
26
+ # Raised when a StepDefinition's block invokes World#pending
27
+ class Pending < StandardError
28
+ end
29
+
30
+ # Raised when a step matches 2 or more StepDefinitions
31
+ class Ambiguous < StandardError
32
+ def initialize(step_name, step_definitions, used_guess)
33
+ message = "Ambiguous match of \"#{step_name}\":\n\n"
34
+ message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
35
+ message << "\n\n"
36
+ message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
37
+ super(message)
38
+ end
39
+ end
40
+
41
+ # Raised when 2 or more StepDefinition have the same Regexp
42
+ class Redundant < StandardError
43
+ def initialize(step_def_1, step_def_2)
44
+ message = "Multiple step definitions have the same Regexp:\n\n"
45
+ message << step_def_1.backtrace_line << "\n"
46
+ message << step_def_2.backtrace_line << "\n\n"
47
+ super(message)
48
+ end
49
+ end
50
+
51
+ # This is the meaty part of Cucumber that ties everything together.
52
+ class StepMother
53
+ include Constantize
54
+ @@transforms = []
55
+ StepArgumentTransform = Struct.new(:pattern, :transformer)
56
+ attr_writer :options, :visitor, :log
57
+
58
+ def initialize
59
+ @unsupported_programming_languages = []
60
+ @programming_languages = []
61
+ @language_map = {}
62
+ load_natural_language('en')
63
+ end
64
+
65
+ def self.register_transform(pattern, &transformer)
66
+ raise Cucumber::ArityMismatchError.new('Transform must be registered with at least a one-argument block') if !block_given? || transformer.arity < 1
67
+ @@transforms.unshift StepArgumentTransform.new(Regexp.new(pattern), transformer.to_proc)
68
+ end
69
+
70
+ def self.transform_arguments(step_args)
71
+ matched = nil
72
+ step_args.map do |step_arg|
73
+ if transform = @@transforms.detect {|t| matched = t.pattern.match(step_arg) if step_arg.is_a?(String) }
74
+ if matched.captures.empty?
75
+ unless transform.transformer.arity == 1
76
+ raise Cucumber::ArityMismatchError.new("Transforms without Regexp captures only accept a single argument (the step argument)")
77
+ end
78
+ transform.transformer.call(step_arg)
79
+ else
80
+ if transform.transformer.arity != matched.captures.size
81
+ raise Cucumber::ArityMismatchError.new("Number of arguments in Transform (#{transform.transformer.arity}) does not match number of Regexp captures (#{matched.captures.size})")
82
+ end
83
+ transform.transformer.call(*matched.captures)
84
+ end
85
+ else
86
+ step_arg
87
+ end
88
+ end
89
+ end
90
+
91
+ def load_plain_text_features(feature_files)
92
+ features = Ast::Features.new
93
+
94
+ log.debug("Features:\n")
95
+ feature_files.each do |f|
96
+ feature_file = FeatureFile.new(f)
97
+ feature = feature_file.parse(self, options)
98
+ if feature
99
+ features.add_feature(feature)
100
+ log.debug(" * #{f}\n")
101
+ end
102
+ end
103
+ log.debug("\n")
104
+ features
105
+ end
106
+
107
+ def load_code_files(step_def_files)
108
+ log.debug("Code:\n")
109
+ step_def_files.each do |step_def_file|
110
+ load_code_file(step_def_file)
111
+ end
112
+ log.debug("\n")
113
+ end
114
+
115
+ def load_code_file(step_def_file)
116
+ if programming_language = programming_language_for(step_def_file)
117
+ log.debug(" * #{step_def_file}\n")
118
+ step_definitions = programming_language.step_definitions_for(step_def_file)
119
+ register_step_definitions(step_definitions)
120
+ else
121
+ log.debug(" * #{step_def_file} [NOT SUPPORTED]\n")
122
+ end
123
+ end
124
+
125
+ def register_step_definitions(step_definitions)
126
+ step_definitions.each{|step_definition| register_step_definition(step_definition)}
127
+ end
128
+
129
+ # Loads and registers programming language implementation.
130
+ # Instances are cached, so calling with the same argument
131
+ # twice will return the same instance.
132
+ #
133
+ def load_programming_language(ext)
134
+ return @language_map[ext] if @language_map[ext]
135
+ programming_language_class = constantize("Cucumber::#{ext.capitalize}Support::#{ext.capitalize}Language")
136
+ programming_language = programming_language_class.new(self)
137
+ programming_language.alias_adverbs(@adverbs || [])
138
+ @programming_languages << programming_language
139
+ @language_map[ext] = programming_language
140
+ programming_language
141
+ end
142
+
143
+ # Loads a natural language. This has the effect of aliasing
144
+ # Step Definition keywords for all of the registered programming
145
+ # languages (if they support aliasing). See #load_programming_language
146
+ #
147
+ def load_natural_language(lang)
148
+ Parser::NaturalLanguage.get(self, lang)
149
+ end
150
+
151
+ # Returns the options passed on the command line.
152
+ def options
153
+ @options ||= {}
154
+ end
155
+
156
+ def step_visited(step) #:nodoc:
157
+ steps << step unless steps.index(step)
158
+ end
159
+
160
+ def steps(status = nil) #:nodoc:
161
+ @steps ||= []
162
+ if(status)
163
+ @steps.select{|step| step.status == status}
164
+ else
165
+ @steps
166
+ end
167
+ end
168
+
169
+ def announce(msg) #:nodoc:
170
+ @visitor.announce(msg)
171
+ end
172
+
173
+ def scenarios(status = nil) #:nodoc:
174
+ @scenarios ||= []
175
+ if(status)
176
+ @scenarios.select{|scenario| scenario.status == status}
177
+ else
178
+ @scenarios
179
+ end
180
+ end
181
+
182
+ def step_match(step_name, formatted_step_name=nil) #:nodoc:
183
+ matches = step_definitions.map { |d| d.step_match(step_name, formatted_step_name) }.compact
184
+ raise Undefined.new(step_name) if matches.empty?
185
+ matches = best_matches(step_name, matches) if matches.size > 1 && options[:guess]
186
+ raise Ambiguous.new(step_name, matches, options[:guess]) if matches.size > 1
187
+ matches[0]
188
+ end
189
+
190
+ def best_matches(step_name, step_matches) #:nodoc:
191
+ no_groups = step_matches.select {|step_match| step_match.args.length == 0}
192
+ max_arg_length = step_matches.map {|step_match| step_match.args.length }.max
193
+ top_groups = step_matches.select {|step_match| step_match.args.length == max_arg_length }
194
+
195
+ if no_groups.any?
196
+ longest_regexp_length = no_groups.map {|step_match| step_match.text_length }.max
197
+ no_groups.select {|step_match| step_match.text_length == longest_regexp_length }
198
+ elsif top_groups.any?
199
+ shortest_capture_length = top_groups.map {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } }.min
200
+ top_groups.select {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } == shortest_capture_length }
201
+ else
202
+ top_groups
203
+ end
204
+ end
205
+
206
+ def clear! #:nodoc:
207
+ step_definitions.clear
208
+ hooks.clear
209
+ steps.clear
210
+ scenarios.clear
211
+ end
212
+
213
+ def step_definitions #:nodoc:
214
+ @step_definitions ||= []
215
+ end
216
+
217
+ def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
218
+ @programming_languages.map do |programming_language|
219
+ programming_language.snippet_text(step_keyword, step_name, multiline_arg_class)
220
+ end.join("\n")
221
+ end
222
+
223
+ def before_and_after(scenario, skip_hooks=false) #:nodoc:
224
+ before(scenario) unless skip_hooks
225
+ yield scenario
226
+ after(scenario) unless skip_hooks
227
+ scenario_visited(scenario)
228
+ end
229
+
230
+ def register_adverbs(adverbs) #:nodoc:
231
+ @adverbs ||= []
232
+ @adverbs += adverbs
233
+ @adverbs.uniq!
234
+ @programming_languages.each do |programming_language|
235
+ programming_language.alias_adverbs(@adverbs)
236
+ end
237
+ end
238
+
239
+ def before(scenario) #:nodoc:
240
+ return if options[:dry_run] || @current_scenario
241
+ @current_scenario = scenario
242
+ @programming_languages.each do |programming_language|
243
+ programming_language.before(scenario)
244
+ end
245
+ end
246
+
247
+ def after(scenario) #:nodoc:
248
+ @current_scenario = nil
249
+ return if options[:dry_run]
250
+ @programming_languages.each do |programming_language|
251
+ programming_language.after(scenario)
252
+ end
253
+ end
254
+
255
+ def after_step #:nodoc:
256
+ return if options[:dry_run]
257
+ @programming_languages.each do |programming_language|
258
+ programming_language.execute_after_step(@current_scenario)
259
+ end
260
+ end
261
+
262
+ def after_configuration(configuration) #:nodoc
263
+ @programming_languages.each do |programming_language|
264
+ programming_language.after_configuration(configuration)
265
+ end
266
+ end
267
+
268
+ private
269
+
270
+ # Registers a StepDefinition. This can be a Ruby StepDefintion,
271
+ # or any other kind of object that implements the StepDefintion
272
+ # contract (API).
273
+ def register_step_definition(step_definition)
274
+ step_definitions.each do |already|
275
+ raise Redundant.new(already, step_definition) if already.same_regexp?(step_definition.regexp)
276
+ end
277
+ step_definitions << step_definition
278
+ step_definition
279
+ end
280
+
281
+ def programming_language_for(step_def_file) #:nodoc:
282
+ if ext = File.extname(step_def_file)[1..-1]
283
+ return nil if @unsupported_programming_languages.index(ext)
284
+ begin
285
+ load_programming_language(ext)
286
+ rescue LoadError
287
+ @unsupported_programming_languages << ext
288
+ nil
289
+ end
290
+ else
291
+ nil
292
+ end
293
+ end
294
+
295
+ def max_step_definition_length #:nodoc:
296
+ @max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
297
+ end
298
+
299
+ def scenario_visited(scenario) #:nodoc:
300
+ scenarios << scenario unless scenarios.index(scenario)
301
+ end
302
+
303
+ def log
304
+ @log ||= Logger.new(STDOUT)
305
+ end
306
+ end
307
+ end
@@ -0,0 +1,10 @@
1
+ module Cucumber #:nodoc:
2
+ class VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 3
5
+ TINY = 101
6
+ PATCH = nil # Set to nil for official release
7
+
8
+ STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
9
+ end
10
+ end
@@ -0,0 +1,87 @@
1
+ module Webrat
2
+ class Element
3
+ # Returns an Array of Array of String where each String is a
4
+ # "cell" in the table-like structure represented by this Element.
5
+ #
6
+ # Supported elements are table, dl, ol and ul. Different conversion
7
+ # strategies are used depending on the kind of element:
8
+ #
9
+ # * table : Each tr becomes a row. The innerHTML of each td or th inside becomes a cell. The number
10
+ # of columns is determined by the number of cells in the first row.
11
+ # * dl : Each dt becomes a row with 2 cells. The innerHTML of the dt itself and the next dd become cells.
12
+ # * ul or ol : Each li becomes a row with one cell, the innerHTML of the li.
13
+ #
14
+ def to_table
15
+ case element.name
16
+ when 'table'
17
+ table_from_table
18
+ when 'dl'
19
+ table_from_dl
20
+ when /ul|ol/
21
+ table_from_list
22
+ else
23
+ raise "#to_table not supported for #{element.name} elements"
24
+ end
25
+ end
26
+
27
+ def table_from_table #:nodoc:
28
+ col_count = nil
29
+ Webrat::XML.css_search(element, 'tr').map do |row|
30
+ cols = Webrat::XML.css_search(row, 'th,td')
31
+ col_count ||= cols.length
32
+ cols[0...col_count].map do |col|
33
+ col.inner_html
34
+ end
35
+ end
36
+ end
37
+
38
+ def table_from_dl #:nodoc:
39
+ Webrat::XML.css_search(@element, 'dt').map do |dt|
40
+ next_node = dt.next_sibling
41
+ while next_node.name != 'dd'
42
+ next_node = next_node.next_sibling
43
+ end
44
+ [dt.inner_html, next_node.inner_html]
45
+ end
46
+ end
47
+
48
+ def table_from_list #:nodoc:
49
+ Webrat::XML.css_search(@element, 'li').map do |li|
50
+ [li.inner_html]
51
+ end
52
+ end
53
+
54
+ alias to_a to_table # Backwards compatibility with Cucumber
55
+ end
56
+
57
+ module Locators
58
+ class ElementLocator < Locator #:nodoc:
59
+ def locate
60
+ Element.load(@session, table_element)
61
+ end
62
+
63
+ def table_element
64
+ Webrat::XML.css_search(@dom, @value)[0]
65
+ end
66
+
67
+ def error_message
68
+ "Could not find anything matching '#{@value}'"
69
+ end
70
+ end
71
+
72
+ # Returns a Webrat DOM element located by +css_selector+.
73
+ def element_at(css_selector)
74
+ ElementLocator.new(@session, dom, css_selector).locate!
75
+ end
76
+
77
+ alias table_at element_at # Backwards compatibility with Cucumber
78
+ end
79
+
80
+ module Methods #:nodoc:
81
+ delegate_to_session :element_at, :table_at
82
+ end
83
+
84
+ class Session #:nodoc:
85
+ def_delegators :current_scope, :element_at, :table_at
86
+ end
87
+ end
@@ -0,0 +1 @@
1
+ require 'cucumber/webrat/element_locator'
data/lib/cucumber.rb ADDED
@@ -0,0 +1,10 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'yaml'
5
+ require 'cucumber/platform'
6
+ require 'cucumber/parser'
7
+ require 'cucumber/version'
8
+ require 'cucumber/step_mother'
9
+ require 'cucumber/cli/main'
10
+ require 'cucumber/broadcaster'
@@ -0,0 +1,11 @@
1
+ Description:
2
+ Sets up Cucumber in your Rails project. After running this generator you will
3
+ get a new rake task called features.
4
+
5
+ This also generates the necessary files in the features directory.
6
+
7
+ Also see the feature generator, which you can use to generate skeletons
8
+ for new features.
9
+
10
+ Examples:
11
+ `./script/generate cucumber`
@@ -0,0 +1,70 @@
1
+ require 'rbconfig'
2
+ require 'cucumber/version'
3
+
4
+ # This generator bootstraps a Rails project for use with Cucumber
5
+ class CucumberGenerator < Rails::Generator::Base
6
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
7
+ Config::CONFIG['ruby_install_name'])
8
+
9
+ attr_accessor :framework
10
+
11
+ def manifest
12
+ record do |m|
13
+ m.directory 'features/step_definitions'
14
+ m.template 'webrat_steps.rb', 'features/step_definitions/webrat_steps.rb'
15
+ m.template 'cucumber_environment.rb', 'config/environments/cucumber.rb',
16
+ :assigns => { :cucumber_version => ::Cucumber::VERSION::STRING }
17
+
18
+ m.gsub_file 'config/database.yml', /test:.*\n/, "test: &TEST\n"
19
+ m.gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *TEST"
20
+
21
+ m.directory 'features/support'
22
+
23
+ if spork?
24
+ m.template 'spork_env.rb', 'features/support/env.rb'
25
+ else
26
+ m.template 'env.rb', 'features/support/env.rb'
27
+ end
28
+
29
+ m.file 'paths.rb', 'features/support/paths.rb'
30
+
31
+ m.directory 'lib/tasks'
32
+ m.template 'cucumber.rake', 'lib/tasks/cucumber.rake'
33
+
34
+ m.file 'cucumber', 'script/cucumber', {
35
+ :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang]
36
+ }
37
+ end
38
+ end
39
+
40
+ def framework
41
+ options[:framework] || :rspec
42
+ end
43
+
44
+ def spork?
45
+ options[:spork]
46
+ end
47
+
48
+ protected
49
+
50
+ def banner
51
+ "Usage: #{$0} cucumber"
52
+ end
53
+
54
+ def add_options!(opt)
55
+ opt.separator ''
56
+ opt.separator 'Options:'
57
+ opt.on('--rspec', 'Setup cucumber for use with RSpec (default)') do |value|
58
+ options[:framework] = :rspec
59
+ end
60
+
61
+ opt.on('--testunit', 'Setup cucumber for use with test/unit') do |value|
62
+ options[:framework] = :testunit
63
+ end
64
+
65
+ opt.on('--spork', 'Setup cucumber for use with Spork') do |value|
66
+ options[:spork] = true
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+ load File.expand_path(File.dirname(__FILE__) + "/../vendor/plugins/cucumber/bin/cucumber")
4
+ rescue LoadError => e
5
+ raise unless e.to_s =~ /cucumber/
6
+ require 'rubygems'
7
+ require 'cucumber'
8
+ load Cucumber::BINARY
9
+ end