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,6 @@
1
+ require 'autotest/rails'
2
+ require 'autotest/cucumber_mixin'
3
+
4
+ class Autotest::CucumberRails < Autotest::Rails
5
+ include CucumberMixin
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'autotest/cucumber_mixin'
2
+ require 'autotest/rails_rspec'
3
+
4
+ class Autotest::CucumberRailsRspec < Autotest::RailsRspec
5
+ include CucumberMixin
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'autotest/cucumber_mixin'
2
+ require 'autotest/rspec'
3
+
4
+ class Autotest::CucumberRspec < Autotest::Rspec
5
+ include CucumberMixin
6
+ end
@@ -0,0 +1,9 @@
1
+ Autotest.add_discovery do
2
+ if File.directory?('features')
3
+ if ENV['AUTOFEATURE'] =~ /true/i
4
+ "cucumber"
5
+ else
6
+ puts "(Not running features. To run features in autotest, set AUTOFEATURE=true.)"
7
+ end
8
+ end
9
+ end
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,29 @@
1
+ require 'cucumber/ast/comment'
2
+ require 'cucumber/ast/tags'
3
+ require 'cucumber/ast/features'
4
+ require 'cucumber/ast/feature'
5
+ require 'cucumber/ast/background'
6
+ require 'cucumber/ast/scenario'
7
+ require 'cucumber/ast/scenario_outline'
8
+ require 'cucumber/ast/step_invocation'
9
+ require 'cucumber/ast/step_collection'
10
+ require 'cucumber/ast/step'
11
+ require 'cucumber/ast/table'
12
+ require 'cucumber/ast/py_string'
13
+ require 'cucumber/ast/outline_table'
14
+ require 'cucumber/ast/examples'
15
+ require 'cucumber/ast/visitor'
16
+
17
+ module Cucumber
18
+ # Classes in this module represent the Abstract Syntax Tree (AST)
19
+ # that gets built when feature files are parsed.
20
+ #
21
+ # AST classes don't expose any internal data directly. This is
22
+ # in order to encourage a less coupled design in the classes
23
+ # that operate on the AST. The only public method is #accept.
24
+ #
25
+ # The AST can be traversed with a visitor. See Cucumber::Format::Pretty
26
+ # for an example.
27
+ module Ast
28
+ end
29
+ end
@@ -0,0 +1,63 @@
1
+ require 'cucumber/ast/feature_element'
2
+
3
+ module Cucumber
4
+ module Ast
5
+ class Background #:nodoc:
6
+ include FeatureElement
7
+ attr_reader :feature_elements
8
+
9
+ def initialize(comment, line, keyword, name, steps)
10
+ @comment, @line, @keyword, @name, @steps = comment, line, keyword, name, StepCollection.new(steps)
11
+ attach_steps(steps)
12
+ @step_invocations = @steps.step_invocations(true)
13
+ @feature_elements = []
14
+ end
15
+
16
+ def step_collection(step_invocations)
17
+ unless(@first_collection_created)
18
+ @first_collection_created = true
19
+ @step_invocations.dup(step_invocations)
20
+ else
21
+ @steps.step_invocations(true).dup(step_invocations)
22
+ end
23
+ end
24
+
25
+ def accept(visitor)
26
+ return if $cucumber_interrupted
27
+ visitor.visit_comment(@comment) unless @comment.empty?
28
+ visitor.visit_background_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
29
+ visitor.step_mother.before(hook_context)
30
+ visitor.visit_steps(@step_invocations)
31
+ @failed = @step_invocations.detect{|step_invocation| step_invocation.exception}
32
+ visitor.step_mother.after(hook_context) if @failed || @feature_elements.empty?
33
+ end
34
+
35
+ def accept_hook?(hook)
36
+ if hook_context != self
37
+ hook_context.accept_hook?(hook)
38
+ else
39
+ # We have no scenarios, just ask our feature
40
+ @feature.accept_hook?(hook)
41
+ end
42
+ end
43
+
44
+ def failed?
45
+ @failed
46
+ end
47
+
48
+ def hook_context
49
+ @feature_elements.first || self
50
+ end
51
+
52
+ def to_sexp
53
+ sexp = [:background, @line, @keyword]
54
+ sexp += [@name] unless @name.empty?
55
+ comment = @comment.to_sexp
56
+ sexp += [comment] if comment
57
+ steps = @steps.to_sexp
58
+ sexp += steps if steps.any?
59
+ sexp
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,31 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Holds the value of a comment parsed from a feature file:
4
+ #
5
+ # # Lorem ipsum
6
+ # # dolor sit amet
7
+ #
8
+ # This gets parsed into a Comment with value <tt>"# Lorem ipsum\n# dolor sit amet\n"</tt>
9
+ #
10
+ class Comment #:nodoc:
11
+ def initialize(value)
12
+ @value = value
13
+ end
14
+
15
+ def empty?
16
+ @value.nil? || @value == ""
17
+ end
18
+
19
+ def accept(visitor)
20
+ return if $cucumber_interrupted
21
+ @value.strip.split("\n").each do |line|
22
+ visitor.visit_comment_line(line.strip)
23
+ end
24
+ end
25
+
26
+ def to_sexp
27
+ (@value.nil? || @value == '') ? nil : [:comment, @value]
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ module Cucumber
2
+ module Ast
3
+ class Examples #:nodoc:
4
+ def initialize(comment, line, keyword, name, outline_table)
5
+ @comment, @keyword, @name, @outline_table = comment, keyword, name, outline_table
6
+ end
7
+
8
+ def accept(visitor)
9
+ return if $cucumber_interrupted
10
+ visitor.visit_comment(@comment) unless @comment.empty?
11
+ visitor.visit_examples_name(@keyword, @name)
12
+ visitor.visit_outline_table(@outline_table)
13
+ end
14
+
15
+ def skip_invoke!
16
+ @outline_table.skip_invoke!
17
+ end
18
+
19
+ def each_example_row(&proc)
20
+ @outline_table.cells_rows[1..-1].each(&proc)
21
+ end
22
+
23
+ def to_sexp
24
+ sexp = [:examples, @keyword, @name]
25
+ comment = @comment.to_sexp
26
+ sexp += [comment] if comment
27
+ sexp += [@outline_table.to_sexp]
28
+ sexp
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,81 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Represents the root node of a parsed feature.
4
+ class Feature #:nodoc:
5
+ attr_accessor :file, :language
6
+ attr_writer :features
7
+ attr_reader :name
8
+
9
+ def initialize(background, comment, tags, name, feature_elements)
10
+ @background, @comment, @tags, @name, @feature_elements = background, comment, tags, name.strip, feature_elements
11
+
12
+ background.feature = self if background
13
+ @feature_elements.each do |feature_element|
14
+ feature_element.feature = self
15
+ end
16
+ end
17
+
18
+ def accept(visitor)
19
+ return if $cucumber_interrupted
20
+ visitor.visit_comment(@comment) unless @comment.empty?
21
+ visitor.visit_tags(@tags)
22
+ visitor.visit_feature_name(@name)
23
+ visitor.visit_background(@background) if @background
24
+ @feature_elements.each do |feature_element|
25
+ visitor.visit_feature_element(feature_element)
26
+ end
27
+ end
28
+
29
+ def accept_hook?(hook)
30
+ @tags.accept_hook?(hook)
31
+ end
32
+
33
+ def next_feature_element(feature_element, &proc)
34
+ index = @feature_elements.index(feature_element)
35
+ next_one = @feature_elements[index+1]
36
+ proc.call(next_one) if next_one
37
+ end
38
+
39
+ def backtrace_line(step_name, line)
40
+ "#{file_colon_line(line)}:in `#{step_name}'"
41
+ end
42
+
43
+ def file_colon_line(line)
44
+ "#{@file}:#{line}"
45
+ end
46
+
47
+ def tag_count(tag)
48
+ if @tags.respond_to?(:count)
49
+ @tags.count(tag) # 1.9
50
+ else
51
+ @tags.select{|t| t == tag}.length # 1.8
52
+ end
53
+ end
54
+
55
+ def feature_and_children_tag_count(tag)
56
+ children_tag_count = @feature_elements.inject(0){|count, feature_element| count += feature_element.tag_count(tag)}
57
+ children_tag_count + tag_count(tag)
58
+ end
59
+
60
+ def short_name
61
+ first_line = name.split(/\n/)[0]
62
+ if first_line =~ /#{language.keywords('feature', true)}:(.*)/
63
+ $1.strip
64
+ else
65
+ first_line
66
+ end
67
+ end
68
+
69
+ def to_sexp
70
+ sexp = [:feature, @file, @name]
71
+ comment = @comment.to_sexp
72
+ sexp += [comment] if comment
73
+ tags = @tags.to_sexp
74
+ sexp += tags if tags.any?
75
+ sexp += [@background.to_sexp] if @background
76
+ sexp += @feature_elements.map{|fe| fe.to_sexp}
77
+ sexp
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,61 @@
1
+ require 'enumerator'
2
+
3
+ module Cucumber
4
+ module FeatureElement #:nodoc:
5
+ attr_accessor :feature
6
+
7
+ def attach_steps(steps)
8
+ steps.each {|step| step.feature_element = self}
9
+ end
10
+
11
+ def file_colon_line(line = @line)
12
+ @feature.file_colon_line(line) if @feature
13
+ end
14
+
15
+ def text_length
16
+ name_line_lengths.max
17
+ end
18
+
19
+ def first_line_length
20
+ name_line_lengths[0]
21
+ end
22
+
23
+ def name_line_lengths
24
+ if @name.strip.empty?
25
+ [@keyword.jlength]
26
+ else
27
+ @name.split("\n").enum_for(:each_with_index).map do |line, line_number|
28
+ line_number == 0 ? @keyword.jlength + line.jlength : line.jlength + Ast::Step::INDENT - 1 # We -1 as names which are not keyword lines are missing a space between keyword and name
29
+ end
30
+ end
31
+ end
32
+
33
+ def matches_scenario_names?(scenario_name_regexps)
34
+ scenario_name_regexps.detect{|name| name =~ @name}
35
+ end
36
+
37
+ def backtrace_line(name = "#{@keyword} #{@name}", line = @line)
38
+ @feature.backtrace_line(name, line) if @feature
39
+ end
40
+
41
+ def source_indent(text_length)
42
+ max_line_length - text_length
43
+ end
44
+
45
+ def max_line_length
46
+ @steps.max_line_length(self)
47
+ end
48
+
49
+ def accept_hook?(hook)
50
+ @tags.accept_hook?(hook) || @feature.accept_hook?(hook)
51
+ end
52
+
53
+ def tag_count(tag)
54
+ @feature.tag_count(tag) == 0 ? @tags.count(tag) : @feature.tag_count(tag)
55
+ end
56
+
57
+ def language
58
+ @feature.language
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,40 @@
1
+ module Cucumber
2
+ module Ast
3
+ class Features #:nodoc:
4
+ include Enumerable
5
+
6
+ attr_reader :duration
7
+
8
+ def initialize
9
+ @features = []
10
+ end
11
+
12
+ def [](index)
13
+ @features[index]
14
+ end
15
+
16
+ def each(&proc)
17
+ @features.each(&proc)
18
+ end
19
+
20
+ def add_feature(feature)
21
+ feature.features = self
22
+ @features << feature
23
+ end
24
+
25
+ def accept(visitor)
26
+ return if $cucumber_interrupted
27
+ start = Time.now
28
+ self.each do |feature|
29
+ visitor.visit_feature(feature)
30
+ end
31
+ @duration = Time.now - start
32
+ end
33
+
34
+ def tag_count(tag)
35
+ @features.inject(0){|count, feature| count += feature.feature_and_children_tag_count(tag)}
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,146 @@
1
+ module Cucumber
2
+ module Ast
3
+ class OutlineTable < Table #:nodoc:
4
+ def initialize(raw, scenario_outline)
5
+ super(raw)
6
+ @scenario_outline = scenario_outline
7
+ @cells_class = ExampleRow
8
+ create_step_invocations_for_example_rows!(scenario_outline)
9
+ end
10
+
11
+ def accept(visitor)
12
+ return if $cucumber_interrupted
13
+ cells_rows.each_with_index do |row, n|
14
+ if(visitor.options[:expand])
15
+ row.accept(visitor)
16
+ else
17
+ visitor.visit_table_row(row)
18
+ end
19
+ end
20
+ nil
21
+ end
22
+
23
+ def accept_hook?(hook)
24
+ @scenario_outline.accept_hook?(hook)
25
+ end
26
+
27
+ def skip_invoke!
28
+ example_rows.each do |cells|
29
+ cells.skip_invoke!
30
+ end
31
+ end
32
+
33
+ def create_step_invocations_for_example_rows!(scenario_outline)
34
+ example_rows.each do |cells|
35
+ cells.create_step_invocations!(scenario_outline)
36
+ end
37
+ end
38
+
39
+ def example_rows
40
+ cells_rows[1..-1]
41
+ end
42
+
43
+ def visit_scenario_name(visitor, row)
44
+ @scenario_outline.visit_scenario_name(visitor, row)
45
+ end
46
+
47
+ class ExampleRow < Cells #:nodoc:
48
+ attr_reader :scenario_outline # https://rspec.lighthouseapp.com/projects/16211/tickets/342
49
+
50
+ def create_step_invocations!(scenario_outline)
51
+ @scenario_outline = scenario_outline
52
+ @step_invocations = scenario_outline.step_invocations(self)
53
+ end
54
+
55
+ def skip_invoke!
56
+ @step_invocations.each do |step_invocation|
57
+ step_invocation.skip_invoke!
58
+ end
59
+ end
60
+
61
+ def accept(visitor)
62
+ return if $cucumber_interrupted
63
+ visitor.options[:expand] ? accept_expand(visitor) : accept_plain(visitor)
64
+ end
65
+
66
+ def accept_plain(visitor)
67
+ if header?
68
+ @cells.each do |cell|
69
+ cell.status = :skipped_param
70
+ visitor.visit_table_cell(cell)
71
+ end
72
+ else
73
+ visitor.step_mother.before_and_after(self) do
74
+ @step_invocations.each do |step_invocation|
75
+ step_invocation.invoke(visitor.step_mother, visitor.options)
76
+ @exception ||= step_invocation.reported_exception
77
+ end
78
+
79
+ @cells.each do |cell|
80
+ visitor.visit_table_cell(cell)
81
+ end
82
+
83
+ visitor.visit_exception(@scenario_exception, :failed) if @scenario_exception
84
+ end
85
+ end
86
+ end
87
+
88
+ def accept_expand(visitor)
89
+ if header?
90
+ else
91
+ visitor.step_mother.before_and_after(self) do
92
+ @table.visit_scenario_name(visitor, self)
93
+ @step_invocations.each do |step_invocation|
94
+ step_invocation.invoke(visitor.step_mother, visitor.options)
95
+ @exception ||= step_invocation.reported_exception
96
+ step_invocation.visit_step_result(visitor)
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ def accept_hook?(hook)
103
+ @table.accept_hook?(hook)
104
+ end
105
+
106
+ def exception
107
+ @exception || @scenario_exception
108
+ end
109
+
110
+ def fail!(exception)
111
+ @scenario_exception = exception
112
+ end
113
+
114
+ # Returns true if one or more steps failed
115
+ def failed?
116
+ @step_invocations.failed? || !!@scenario_exception
117
+ end
118
+
119
+ # Returns true if all steps passed
120
+ def passed?
121
+ !failed?
122
+ end
123
+
124
+ # Returns the status
125
+ def status
126
+ return :failed if @scenario_exception
127
+ @step_invocations.status
128
+ end
129
+
130
+ def backtrace_line
131
+ @scenario_outline.backtrace_line(name, line)
132
+ end
133
+
134
+ def name
135
+ "| #{@cells.collect{|c| c.value }.join(' | ')} |"
136
+ end
137
+
138
+ private
139
+
140
+ def header?
141
+ index == 0
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end