engineyard-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 +1073 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en-lol/Rakefile +6 -0
  46. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  47. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  48. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  49. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  50. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  51. data/examples/i18n/en/Rakefile +6 -0
  52. data/examples/i18n/en/features/addition.feature +17 -0
  53. data/examples/i18n/en/features/division.feature +10 -0
  54. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  55. data/examples/i18n/en/lib/calculator.rb +14 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter.feature +7 -0
  279. data/features/html_formatter/a.html +183 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber.rb +10 -0
  315. data/lib/cucumber/ast.rb +29 -0
  316. data/lib/cucumber/ast/background.rb +63 -0
  317. data/lib/cucumber/ast/comment.rb +31 -0
  318. data/lib/cucumber/ast/examples.rb +32 -0
  319. data/lib/cucumber/ast/feature.rb +81 -0
  320. data/lib/cucumber/ast/feature_element.rb +61 -0
  321. data/lib/cucumber/ast/features.rb +40 -0
  322. data/lib/cucumber/ast/outline_table.rb +146 -0
  323. data/lib/cucumber/ast/py_string.rb +57 -0
  324. data/lib/cucumber/ast/scenario.rb +108 -0
  325. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  326. data/lib/cucumber/ast/step.rb +116 -0
  327. data/lib/cucumber/ast/step_collection.rb +76 -0
  328. data/lib/cucumber/ast/step_invocation.rb +166 -0
  329. data/lib/cucumber/ast/table.rb +626 -0
  330. data/lib/cucumber/ast/tags.rb +44 -0
  331. data/lib/cucumber/ast/visitor.rb +115 -0
  332. data/lib/cucumber/broadcaster.rb +13 -0
  333. data/lib/cucumber/cli/configuration.rb +190 -0
  334. data/lib/cucumber/cli/drb_client.rb +26 -0
  335. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  336. data/lib/cucumber/cli/main.rb +116 -0
  337. data/lib/cucumber/cli/options.rb +394 -0
  338. data/lib/cucumber/cli/profile_loader.rb +70 -0
  339. data/lib/cucumber/constantize.rb +28 -0
  340. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  341. data/lib/cucumber/core_ext/proc.rb +29 -0
  342. data/lib/cucumber/core_ext/string.rb +48 -0
  343. data/lib/cucumber/feature_file.rb +54 -0
  344. data/lib/cucumber/filter.rb +52 -0
  345. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  346. data/lib/cucumber/formatter/color_io.rb +23 -0
  347. data/lib/cucumber/formatter/console.rb +185 -0
  348. data/lib/cucumber/formatter/cucumber.css +132 -0
  349. data/lib/cucumber/formatter/cucumber.sass +139 -0
  350. data/lib/cucumber/formatter/duration.rb +13 -0
  351. data/lib/cucumber/formatter/html.rb +261 -0
  352. data/lib/cucumber/formatter/junit.rb +121 -0
  353. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  354. data/lib/cucumber/formatter/pdf.rb +217 -0
  355. data/lib/cucumber/formatter/pretty.rb +222 -0
  356. data/lib/cucumber/formatter/profile.rb +78 -0
  357. data/lib/cucumber/formatter/progress.rb +67 -0
  358. data/lib/cucumber/formatter/rerun.rb +46 -0
  359. data/lib/cucumber/formatter/steps.rb +50 -0
  360. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  361. data/lib/cucumber/formatter/unicode.rb +35 -0
  362. data/lib/cucumber/formatter/usage.rb +86 -0
  363. data/lib/cucumber/formatters/unicode.rb +7 -0
  364. data/lib/cucumber/language_support.rb +30 -0
  365. data/lib/cucumber/language_support/language_methods.rb +75 -0
  366. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  367. data/lib/cucumber/languages.yml +561 -0
  368. data/lib/cucumber/parser.rb +6 -0
  369. data/lib/cucumber/parser/feature.rb +1838 -0
  370. data/lib/cucumber/parser/feature.tt +351 -0
  371. data/lib/cucumber/parser/i18n.tt +42 -0
  372. data/lib/cucumber/parser/natural_language.rb +72 -0
  373. data/lib/cucumber/parser/table.rb +417 -0
  374. data/lib/cucumber/parser/table.tt +71 -0
  375. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  376. data/lib/cucumber/platform.rb +27 -0
  377. data/lib/cucumber/py_support/py_dsl.py +8 -0
  378. data/lib/cucumber/py_support/py_language.py +2 -0
  379. data/lib/cucumber/py_support/py_language.rb +68 -0
  380. data/lib/cucumber/rails/rspec.rb +10 -0
  381. data/lib/cucumber/rails/world.rb +100 -0
  382. data/lib/cucumber/rake/task.rb +241 -0
  383. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  384. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  385. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  386. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  387. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  388. data/lib/cucumber/rspec_neuter.rb +23 -0
  389. data/lib/cucumber/step_match.rb +61 -0
  390. data/lib/cucumber/step_mother.rb +307 -0
  391. data/lib/cucumber/version.rb +10 -0
  392. data/lib/cucumber/webrat/element_locator.rb +87 -0
  393. data/lib/cucumber/webrat/table_locator.rb +1 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -0,0 +1,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
@@ -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