kbaum-cucumber 0.4.5.pre

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 (511) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +18 -0
  3. data/Caliper.yml +5 -0
  4. data/History.txt +1292 -0
  5. data/LICENSE +22 -0
  6. data/README.rdoc +26 -0
  7. data/Rakefile +63 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/cucumber +16 -0
  10. data/cucumber.gemspec +741 -0
  11. data/cucumber.yml +10 -0
  12. data/examples/dos_line_endings/Rakefile +6 -0
  13. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  14. data/examples/i18n/README.textile +18 -0
  15. data/examples/i18n/Rakefile +32 -0
  16. data/examples/i18n/ar/Rakefile +6 -0
  17. data/examples/i18n/ar/features/addition.feature +17 -0
  18. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  19. data/examples/i18n/ar/lib/calculator.rb +11 -0
  20. data/examples/i18n/bg/Rakefile +6 -0
  21. data/examples/i18n/bg/features/addition.feature +12 -0
  22. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  23. data/examples/i18n/bg/features/division.feature +17 -0
  24. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  25. data/examples/i18n/bg/features/support/env.rb +6 -0
  26. data/examples/i18n/bg/features/support/world.rb +8 -0
  27. data/examples/i18n/bg/lib/calculator.rb +24 -0
  28. data/examples/i18n/cat/Rakefile +6 -0
  29. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  30. data/examples/i18n/cat/features/suma.feature +17 -0
  31. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  32. data/examples/i18n/da/Rakefile +6 -0
  33. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  34. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  35. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  36. data/examples/i18n/de/.gitignore +1 -0
  37. data/examples/i18n/de/Rakefile +6 -0
  38. data/examples/i18n/de/features/addition.feature +17 -0
  39. data/examples/i18n/de/features/division.feature +10 -0
  40. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  41. data/examples/i18n/de/lib/calculator.rb +14 -0
  42. data/examples/i18n/en-lol/Rakefile +4 -0
  43. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  44. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  45. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  46. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  47. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  48. data/examples/i18n/en/.gitignore +1 -0
  49. data/examples/i18n/en/Rakefile +6 -0
  50. data/examples/i18n/en/features/addition.feature +17 -0
  51. data/examples/i18n/en/features/division.feature +10 -0
  52. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  53. data/examples/i18n/en/lib/calculator.rb +14 -0
  54. data/examples/i18n/es/Rakefile +6 -0
  55. data/examples/i18n/es/features/adicion.feature +17 -0
  56. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  57. data/examples/i18n/es/lib/calculador.rb +14 -0
  58. data/examples/i18n/et/Rakefile +6 -0
  59. data/examples/i18n/et/features/jagamine.feature +10 -0
  60. data/examples/i18n/et/features/liitmine.feature +17 -0
  61. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  62. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  63. data/examples/i18n/fi/.gitignore +1 -0
  64. data/examples/i18n/fi/Rakefile +6 -0
  65. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  66. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  67. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  68. data/examples/i18n/fi/lib/laskin.rb +14 -0
  69. data/examples/i18n/fr/Rakefile +6 -0
  70. data/examples/i18n/fr/features/addition.feature +18 -0
  71. data/examples/i18n/fr/features/addition2.feature +17 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +38 -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/.gitignore +1 -0
  80. data/examples/i18n/hu/Rakefile +6 -0
  81. data/examples/i18n/hu/features/addition.feature +17 -0
  82. data/examples/i18n/hu/features/division.feature +10 -0
  83. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  84. data/examples/i18n/hu/lib/calculator.rb +14 -0
  85. data/examples/i18n/id/.gitignore +1 -0
  86. data/examples/i18n/id/Rakefile +6 -0
  87. data/examples/i18n/id/features/addition.feature +17 -0
  88. data/examples/i18n/id/features/division.feature +10 -0
  89. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  90. data/examples/i18n/id/lib/calculator.rb +14 -0
  91. data/examples/i18n/it/Rakefile +6 -0
  92. data/examples/i18n/it/features/somma.feature +11 -0
  93. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  94. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  95. data/examples/i18n/ja/.gitignore +1 -0
  96. data/examples/i18n/ja/Rakefile +6 -0
  97. data/examples/i18n/ja/features/addition.feature +17 -0
  98. data/examples/i18n/ja/features/division.feature +10 -0
  99. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  100. data/examples/i18n/ja/lib/calculator.rb +14 -0
  101. data/examples/i18n/ko/.gitignore +1 -0
  102. data/examples/i18n/ko/Rakefile +6 -0
  103. data/examples/i18n/ko/features/addition.feature +17 -0
  104. data/examples/i18n/ko/features/division.feature +11 -0
  105. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  106. data/examples/i18n/ko/lib/calculator.rb +14 -0
  107. data/examples/i18n/lt/.gitignore +1 -0
  108. data/examples/i18n/lt/Rakefile +6 -0
  109. data/examples/i18n/lt/features/addition.feature +17 -0
  110. data/examples/i18n/lt/features/division.feature +10 -0
  111. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lt/lib/calculator.rb +14 -0
  113. data/examples/i18n/lv/Rakefile +6 -0
  114. data/examples/i18n/lv/features/addition.feature +17 -0
  115. data/examples/i18n/lv/features/division.feature +10 -0
  116. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  117. data/examples/i18n/lv/lib/calculator.rb +14 -0
  118. data/examples/i18n/no/Rakefile +6 -0
  119. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  120. data/examples/i18n/no/features/summering.feature +19 -0
  121. data/examples/i18n/no/features/support/env.rb +6 -0
  122. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  123. data/examples/i18n/pl/.gitignore +1 -0
  124. data/examples/i18n/pl/Rakefile +6 -0
  125. data/examples/i18n/pl/features/addition.feature +17 -0
  126. data/examples/i18n/pl/features/division.feature +10 -0
  127. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  128. data/examples/i18n/pl/features/support/env.rb +6 -0
  129. data/examples/i18n/pl/lib/calculator.rb +14 -0
  130. data/examples/i18n/pt/Rakefile +6 -0
  131. data/examples/i18n/pt/features/adicao.feature +11 -0
  132. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  133. data/examples/i18n/pt/features/support/env.rb +6 -0
  134. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  135. data/examples/i18n/ro/Rakefile +6 -0
  136. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  137. data/examples/i18n/ro/features/suma.feature +11 -0
  138. data/examples/i18n/ro/lib/calculator.rb +11 -0
  139. data/examples/i18n/ru/Rakefile +6 -0
  140. data/examples/i18n/ru/features/addition.feature +11 -0
  141. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  142. data/examples/i18n/ru/features/division.feature +16 -0
  143. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  144. data/examples/i18n/ru/features/support/env.rb +6 -0
  145. data/examples/i18n/ru/features/support/world.rb +8 -0
  146. data/examples/i18n/ru/lib/calculator.rb +24 -0
  147. data/examples/i18n/se/Rakefile +6 -0
  148. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  149. data/examples/i18n/se/features/summering.feature +18 -0
  150. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  151. data/examples/i18n/sk/.gitignore +1 -0
  152. data/examples/i18n/sk/Rakefile +6 -0
  153. data/examples/i18n/sk/features/addition.feature +17 -0
  154. data/examples/i18n/sk/features/division.feature +10 -0
  155. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  156. data/examples/i18n/sk/lib/calculator.rb +14 -0
  157. data/examples/i18n/sr-latn/Rakefile +6 -0
  158. data/examples/i18n/sr-latn/features/sabiranje.feature +18 -0
  159. data/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb +24 -0
  160. data/examples/i18n/sr-latn/lib/calculator.rb +12 -0
  161. data/examples/i18n/sr/Rakefile +6 -0
  162. data/examples/i18n/sr/features/sabiranje.feature +18 -0
  163. data/examples/i18n/sr/features/step_definitons/calculator_steps.rb +24 -0
  164. data/examples/i18n/sr/lib/calculator.rb +12 -0
  165. data/examples/i18n/tr/.gitignore +1 -0
  166. data/examples/i18n/tr/Rakefile +6 -0
  167. data/examples/i18n/tr/features/bolme.feature +10 -0
  168. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  169. data/examples/i18n/tr/features/toplama.feature +18 -0
  170. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  171. data/examples/i18n/uz/Rakefile +6 -0
  172. data/examples/i18n/uz/features/addition.feature +10 -0
  173. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  174. data/examples/i18n/uz/features/division.feature +17 -0
  175. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  176. data/examples/i18n/uz/features/support/env.rb +6 -0
  177. data/examples/i18n/uz/features/support/world.rb +8 -0
  178. data/examples/i18n/uz/lib/calculator.rb +24 -0
  179. data/examples/i18n/zh-CN/Rakefile +4 -0
  180. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  181. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  182. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  183. data/examples/i18n/zh-TW/.gitignore +1 -0
  184. data/examples/i18n/zh-TW/Rakefile +4 -0
  185. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  186. data/examples/i18n/zh-TW/features/division.feature +11 -0
  187. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  188. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  189. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  190. data/examples/junit/features/pending.feature +5 -0
  191. data/examples/junit/features/step_definitions/steps.rb +11 -0
  192. data/examples/python/features/fibonacci.feature +19 -0
  193. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  194. data/examples/python/lib/.gitignore +1 -0
  195. data/examples/python/lib/fib.py +7 -0
  196. data/examples/ramaze/README.textile +7 -0
  197. data/examples/ramaze/Rakefile +6 -0
  198. data/examples/ramaze/app.rb +21 -0
  199. data/examples/ramaze/features/add.feature +11 -0
  200. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  201. data/examples/ramaze/features/support/env.rb +32 -0
  202. data/examples/ramaze/layout/default.html.erb +8 -0
  203. data/examples/ramaze/view/index.html.erb +5 -0
  204. data/examples/ruby2python/features/fibonacci.feature +19 -0
  205. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  206. data/examples/ruby2python/features/support/env.rb +21 -0
  207. data/examples/ruby2python/lib/.gitignore +1 -0
  208. data/examples/ruby2python/lib/fib.py +7 -0
  209. data/examples/selenium/Rakefile +6 -0
  210. data/examples/selenium/features/search.feature +9 -0
  211. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  212. data/examples/selenium/features/support/env.rb +19 -0
  213. data/examples/selenium_webrat/Rakefile +6 -0
  214. data/examples/selenium_webrat/config.ru +0 -0
  215. data/examples/selenium_webrat/features/search.feature +9 -0
  216. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  217. data/examples/selenium_webrat/features/support/env.rb +45 -0
  218. data/examples/self_test/.gitignore +1 -0
  219. data/examples/self_test/README.textile +6 -0
  220. data/examples/self_test/Rakefile +6 -0
  221. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  222. data/examples/self_test/features/background/background_with_name.feature +7 -0
  223. data/examples/self_test/features/background/failing_background.feature +12 -0
  224. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  225. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  226. data/examples/self_test/features/background/passing_background.feature +10 -0
  227. data/examples/self_test/features/background/pending_background.feature +10 -0
  228. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  229. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  230. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  231. data/examples/self_test/features/failing_expectation.feature +4 -0
  232. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  233. data/examples/self_test/features/multiline_name.feature +27 -0
  234. data/examples/self_test/features/outline_sample.feature +15 -0
  235. data/examples/self_test/features/sample.feature +21 -0
  236. data/examples/self_test/features/search_sample.feature +32 -0
  237. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  238. data/examples/self_test/features/support/env.rb +18 -0
  239. data/examples/self_test/features/tags_sample.feature +17 -0
  240. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  241. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  242. data/examples/self_test/list-of-features.txt +1 -0
  243. data/examples/sinatra/README.textile +13 -0
  244. data/examples/sinatra/Rakefile +6 -0
  245. data/examples/sinatra/app.rb +14 -0
  246. data/examples/sinatra/features/add.feature +11 -0
  247. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  248. data/examples/sinatra/features/support/env.rb +30 -0
  249. data/examples/sinatra/views/add.erb +5 -0
  250. data/examples/sinatra/views/layout.erb +8 -0
  251. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  252. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  253. data/examples/tcl/README.textile +11 -0
  254. data/examples/tcl/Rakefile +6 -0
  255. data/examples/tcl/features/fibonnacci.feature +17 -0
  256. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  257. data/examples/tcl/features/support/env.rb +6 -0
  258. data/examples/tcl/src/fib.tcl +3 -0
  259. data/examples/test_unit/Rakefile +6 -0
  260. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  261. data/examples/test_unit/features/test_unit.feature +9 -0
  262. data/examples/tickets/Rakefile +20 -0
  263. data/examples/tickets/features.html +138 -0
  264. data/examples/tickets/features/172.feature +28 -0
  265. data/examples/tickets/features/177/1.feature +28 -0
  266. data/examples/tickets/features/177/2.feature +20 -0
  267. data/examples/tickets/features/177/3.feature +18 -0
  268. data/examples/tickets/features/180.feature +7 -0
  269. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  270. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  271. data/examples/tickets/features/236.feature +13 -0
  272. data/examples/tickets/features/241.feature +12 -0
  273. data/examples/tickets/features/246.feature +4 -0
  274. data/examples/tickets/features/248.feature +11 -0
  275. data/examples/tickets/features/270/back.feature +14 -0
  276. data/examples/tickets/features/270/back.steps.rb +14 -0
  277. data/examples/tickets/features/272/hooks.feature +26 -0
  278. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  279. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  280. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  281. data/examples/tickets/features/279/wrong.feature_ +11 -0
  282. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  283. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  284. data/examples/tickets/features/306/only_background.feature +4 -0
  285. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  286. data/examples/tickets/features/lib/pantry.rb +20 -0
  287. data/examples/tickets/features/scenario_outline.feature +95 -0
  288. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  289. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  290. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  291. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  292. data/examples/tickets/features/table_diffing.feature +13 -0
  293. data/examples/tickets/features/tickets.feature +28 -0
  294. data/examples/watir/README.textile +16 -0
  295. data/examples/watir/Rakefile +10 -0
  296. data/examples/watir/features/search.feature +12 -0
  297. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  298. data/examples/watir/features/support/env.rb +32 -0
  299. data/examples/watir/features/support/screenshots.rb +44 -0
  300. data/examples/webrat/features/search.feature +12 -0
  301. data/examples/webrat/features/step_definitions/kvasir_steps.rb +14 -0
  302. data/examples/webrat/features/support/env.rb +17 -0
  303. data/features/announce.feature +122 -0
  304. data/features/background.feature +308 -0
  305. data/features/bug_371.feature +32 -0
  306. data/features/bug_464.feature +16 -0
  307. data/features/bug_475.feature +43 -0
  308. data/features/call_many_steps.feature +124 -0
  309. data/features/cucumber_cli.feature +654 -0
  310. data/features/cucumber_cli_diff_disabled.feature +52 -0
  311. data/features/cucumber_cli_outlines.feature +105 -0
  312. data/features/custom_formatter.feature +47 -0
  313. data/features/default_snippets.feature +42 -0
  314. data/features/drb_server_integration.feature +174 -0
  315. data/features/exception_in_after_block.feature +100 -0
  316. data/features/exception_in_after_step_block.feature +102 -0
  317. data/features/exception_in_before_block.feature +78 -0
  318. data/features/exclude_files.feature +20 -0
  319. data/features/expand.feature +60 -0
  320. data/features/html_formatter.feature +7 -0
  321. data/features/html_formatter/a.html +400 -0
  322. data/features/junit_formatter.feature +88 -0
  323. data/features/language_from_header.feature +30 -0
  324. data/features/language_help.feature +68 -0
  325. data/features/listener_debugger_formatter.feature +41 -0
  326. data/features/multiline_names.feature +43 -0
  327. data/features/negative_tagged_hooks.feature +61 -0
  328. data/features/post_configuration_hook.feature +37 -0
  329. data/features/profiles.feature +112 -0
  330. data/features/rake_task.feature +152 -0
  331. data/features/report_called_undefined_steps.feature +34 -0
  332. data/features/simplest.feature +11 -0
  333. data/features/snippet.feature +22 -0
  334. data/features/step_definitions/cucumber_steps.rb +154 -0
  335. data/features/step_definitions/extra_steps.rb +2 -0
  336. data/features/step_definitions/simplest_steps.rb +3 -0
  337. data/features/step_definitions/wire_steps.rb +14 -0
  338. data/features/support/env.rb +141 -0
  339. data/features/support/env.rb.simplest +7 -0
  340. data/features/support/fake_wire_server.rb +63 -0
  341. data/features/table_diffing.feature +45 -0
  342. data/features/table_mapping.feature +35 -0
  343. data/features/tag_logic.feature +258 -0
  344. data/features/transform.feature +245 -0
  345. data/features/unicode_table.feature +35 -0
  346. data/features/usage_and_stepdefs_formatter.feature +169 -0
  347. data/features/wire_protocol.feature +177 -0
  348. data/features/work_in_progress.feature +156 -0
  349. data/gem_tasks/contributors.rake +13 -0
  350. data/gem_tasks/environment.rake +7 -0
  351. data/gem_tasks/features.rake +18 -0
  352. data/gem_tasks/fix_cr_lf.rake +10 -0
  353. data/gem_tasks/flog.rake +4 -0
  354. data/gem_tasks/rspec.rake +15 -0
  355. data/gem_tasks/sass.rake +4 -0
  356. data/gem_tasks/sdoc.rake +12 -0
  357. data/lib/README.rdoc +12 -0
  358. data/lib/autotest/cucumber.rb +6 -0
  359. data/lib/autotest/cucumber_mixin.rb +131 -0
  360. data/lib/autotest/cucumber_rails.rb +6 -0
  361. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  362. data/lib/autotest/cucumber_rspec.rb +6 -0
  363. data/lib/autotest/discover.rb +9 -0
  364. data/lib/cucumber.rb +15 -0
  365. data/lib/cucumber/ast.rb +30 -0
  366. data/lib/cucumber/ast/background.rb +75 -0
  367. data/lib/cucumber/ast/comment.rb +31 -0
  368. data/lib/cucumber/ast/examples.rb +36 -0
  369. data/lib/cucumber/ast/feature.rb +85 -0
  370. data/lib/cucumber/ast/feature_element.rb +68 -0
  371. data/lib/cucumber/ast/features.rb +40 -0
  372. data/lib/cucumber/ast/outline_table.rb +166 -0
  373. data/lib/cucumber/ast/py_string.rb +59 -0
  374. data/lib/cucumber/ast/scenario.rb +111 -0
  375. data/lib/cucumber/ast/scenario_outline.rb +100 -0
  376. data/lib/cucumber/ast/step.rb +121 -0
  377. data/lib/cucumber/ast/step_collection.rb +76 -0
  378. data/lib/cucumber/ast/step_invocation.rb +190 -0
  379. data/lib/cucumber/ast/table.rb +655 -0
  380. data/lib/cucumber/ast/tags.rb +122 -0
  381. data/lib/cucumber/ast/tree_walker.rb +201 -0
  382. data/lib/cucumber/ast/visitor.rb +11 -0
  383. data/lib/cucumber/broadcaster.rb +13 -0
  384. data/lib/cucumber/cli/configuration.rb +180 -0
  385. data/lib/cucumber/cli/drb_client.rb +32 -0
  386. data/lib/cucumber/cli/language_help_formatter.rb +72 -0
  387. data/lib/cucumber/cli/main.rb +121 -0
  388. data/lib/cucumber/cli/options.rb +404 -0
  389. data/lib/cucumber/cli/profile_loader.rb +82 -0
  390. data/lib/cucumber/constantize.rb +34 -0
  391. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  392. data/lib/cucumber/core_ext/proc.rb +30 -0
  393. data/lib/cucumber/core_ext/string.rb +16 -0
  394. data/lib/cucumber/feature_file.rb +54 -0
  395. data/lib/cucumber/filter.rb +41 -0
  396. data/lib/cucumber/formatter/ansicolor.rb +157 -0
  397. data/lib/cucumber/formatter/color_io.rb +23 -0
  398. data/lib/cucumber/formatter/console.rb +205 -0
  399. data/lib/cucumber/formatter/cucumber.css +248 -0
  400. data/lib/cucumber/formatter/cucumber.sass +241 -0
  401. data/lib/cucumber/formatter/debug.rb +33 -0
  402. data/lib/cucumber/formatter/duration.rb +13 -0
  403. data/lib/cucumber/formatter/html.rb +545 -0
  404. data/lib/cucumber/formatter/io.rb +33 -0
  405. data/lib/cucumber/formatter/junit.rb +149 -0
  406. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  407. data/lib/cucumber/formatter/pdf.rb +234 -0
  408. data/lib/cucumber/formatter/pretty.rb +237 -0
  409. data/lib/cucumber/formatter/progress.rb +75 -0
  410. data/lib/cucumber/formatter/rerun.rb +50 -0
  411. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  412. data/lib/cucumber/formatter/steps.rb +49 -0
  413. data/lib/cucumber/formatter/summary.rb +35 -0
  414. data/lib/cucumber/formatter/tag_cloud.rb +34 -0
  415. data/lib/cucumber/formatter/unicode.rb +35 -0
  416. data/lib/cucumber/formatter/usage.rb +127 -0
  417. data/lib/cucumber/language_support.rb +30 -0
  418. data/lib/cucumber/language_support/language_methods.rb +110 -0
  419. data/lib/cucumber/languages.yml +535 -0
  420. data/lib/cucumber/parser.rb +8 -0
  421. data/lib/cucumber/parser/common.rb +170 -0
  422. data/lib/cucumber/parser/common.tt +21 -0
  423. data/lib/cucumber/parser/feature.rb +1783 -0
  424. data/lib/cucumber/parser/feature.tt +317 -0
  425. data/lib/cucumber/parser/i18n.tt +34 -0
  426. data/lib/cucumber/parser/natural_language.rb +108 -0
  427. data/lib/cucumber/parser/py_string.rb +276 -0
  428. data/lib/cucumber/parser/py_string.tt +45 -0
  429. data/lib/cucumber/parser/table.rb +305 -0
  430. data/lib/cucumber/parser/table.tt +60 -0
  431. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  432. data/lib/cucumber/platform.rb +31 -0
  433. data/lib/cucumber/py_support/py_dsl.py +10 -0
  434. data/lib/cucumber/py_support/py_language.py +10 -0
  435. data/lib/cucumber/py_support/py_language.rb +81 -0
  436. data/lib/cucumber/rake/task.rb +166 -0
  437. data/lib/cucumber/rb_support/rb_dsl.rb +102 -0
  438. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  439. data/lib/cucumber/rb_support/rb_language.rb +179 -0
  440. data/lib/cucumber/rb_support/rb_step_definition.rb +75 -0
  441. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  442. data/lib/cucumber/rb_support/rb_world.rb +81 -0
  443. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  444. data/lib/cucumber/rspec_neuter.rb +23 -0
  445. data/lib/cucumber/step_argument.rb +9 -0
  446. data/lib/cucumber/step_definition_light.rb +20 -0
  447. data/lib/cucumber/step_match.rb +107 -0
  448. data/lib/cucumber/step_mother.rb +350 -0
  449. data/lib/cucumber/webrat/element_locator.rb +93 -0
  450. data/lib/cucumber/webrat/table_locator.rb +1 -0
  451. data/lib/cucumber/wire_support/connection.rb +42 -0
  452. data/lib/cucumber/wire_support/request_handler.rb +19 -0
  453. data/lib/cucumber/wire_support/wire_exception.rb +10 -0
  454. data/lib/cucumber/wire_support/wire_language.rb +52 -0
  455. data/lib/cucumber/wire_support/wire_packet.rb +34 -0
  456. data/lib/cucumber/wire_support/wire_protocol.rb +64 -0
  457. data/lib/cucumber/wire_support/wire_step_definition.rb +21 -0
  458. data/spec/cucumber/ast/background_spec.rb +54 -0
  459. data/spec/cucumber/ast/feature_element_spec.rb +41 -0
  460. data/spec/cucumber/ast/feature_factory.rb +62 -0
  461. data/spec/cucumber/ast/feature_spec.rb +44 -0
  462. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  463. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  464. data/spec/cucumber/ast/scenario_outline_spec.rb +73 -0
  465. data/spec/cucumber/ast/scenario_spec.rb +45 -0
  466. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  467. data/spec/cucumber/ast/step_spec.rb +66 -0
  468. data/spec/cucumber/ast/table_spec.rb +422 -0
  469. data/spec/cucumber/ast/tags_spec.rb +29 -0
  470. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  471. data/spec/cucumber/broadcaster_spec.rb +15 -0
  472. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  473. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  474. data/spec/cucumber/cli/main_spec.rb +172 -0
  475. data/spec/cucumber/cli/options_spec.rb +335 -0
  476. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  477. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  478. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  479. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  480. data/spec/cucumber/formatter/console_spec.rb +20 -0
  481. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  482. data/spec/cucumber/formatter/html_spec.rb +213 -0
  483. data/spec/cucumber/formatter/junit_spec.rb +110 -0
  484. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  485. data/spec/cucumber/formatter/spec_helper.rb +50 -0
  486. data/spec/cucumber/parser/feature_parser_spec.rb +400 -0
  487. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  488. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +132 -0
  489. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  490. data/spec/cucumber/sell_cucumbers.feature +19 -0
  491. data/spec/cucumber/step_match_spec.rb +56 -0
  492. data/spec/cucumber/step_mother_spec.rb +270 -0
  493. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  494. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  495. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  496. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  497. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  498. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  499. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  500. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  501. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  502. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  503. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  504. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  505. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  506. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  507. data/spec/cucumber/wire_support/wire_packet_spec.rb +26 -0
  508. data/spec/cucumber/world/pending_spec.rb +46 -0
  509. data/spec/spec.opts +4 -0
  510. data/spec/spec_helper.rb +18 -0
  511. metadata +813 -0
@@ -0,0 +1,32 @@
1
+ require "drb/drb"
2
+ # This code was taken from the RSpec project and slightly modified.
3
+
4
+ module Cucumber
5
+ module Cli
6
+ class DRbClientError < StandardError
7
+ end
8
+ # Runs features on a DRB server, originally created with Spork compatibility in mind.
9
+ class DRbClient
10
+ DEFAULT_PORT = 8990
11
+
12
+ def self.run(args, error_stream, out_stream, port = nil)
13
+ port ||= ENV["CUCUMBER_DRB"] || DEFAULT_PORT
14
+
15
+ # See http://redmine.ruby-lang.org/issues/show/496 as to why we specify localhost:0
16
+ begin
17
+ DRb.start_service("druby://localhost:0")
18
+ rescue SocketError
19
+ # Ruby-1.8.7 on snow leopard doesn't like localhost:0 - but just :0
20
+ # seems to work just fine
21
+ DRb.start_service("druby://:0")
22
+ end
23
+ feature_server = DRbObject.new_with_uri("druby://127.0.0.1:#{port}")
24
+ cloned_args = [] # I have no idea why this is needed, but if the regular args are sent then DRb magically transforms it into a DRb object - not an array
25
+ args.each { |arg| cloned_args << arg }
26
+ feature_server.run(cloned_args, error_stream, out_stream)
27
+ rescue DRb::DRbConnError => e
28
+ raise DRbClientError, "No DRb server is running."
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,72 @@
1
+ require 'cucumber/formatter/pretty'
2
+ require 'cucumber/parser/natural_language'
3
+ require 'cucumber/formatter/unicode'
4
+
5
+ module Cucumber
6
+ module Cli
7
+ class LanguageHelpFormatter < Formatter::Pretty
8
+ INCOMPLETE = %{
9
+ The Cucumber grammar has evolved since this translation was written.
10
+ Please help us complete the translation by translating the missing words in
11
+
12
+ #{Cucumber::LANGUAGE_FILE}
13
+
14
+ Then contribute back to the Cucumber project. Details here:
15
+ http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
16
+ }
17
+
18
+ class << self
19
+ def list_languages(io)
20
+ raw = Cucumber::LANGUAGES.keys.sort.map do |lang|
21
+ [
22
+ lang,
23
+ Cucumber::LANGUAGES[lang]['name'],
24
+ Cucumber::LANGUAGES[lang]['native']
25
+ ]
26
+ end
27
+
28
+ print_table io, raw, :check_lang => true
29
+ end
30
+
31
+ def list_keywords(io, lang)
32
+ language = Parser::NaturalLanguage.get(nil, lang)
33
+ raw = Parser::NaturalLanguage::KEYWORD_KEYS.map do |key|
34
+ [key, language.keywords(key).join(" / ")]
35
+ end
36
+
37
+ print_table io, raw, :incomplete => language.incomplete?
38
+ end
39
+
40
+ private
41
+ def print_table(io, raw, options)
42
+ table = Ast::Table.new(raw)
43
+ formatter = new(nil, io, options)
44
+ Ast::TreeWalker.new(nil, [formatter]).visit_multiline_arg(table)
45
+ end
46
+ end
47
+
48
+ def before_visit_multiline_arg(table)
49
+ if @options[:incomplete]
50
+ @io.puts(format_string(INCOMPLETE, :failed))
51
+ end
52
+ end
53
+
54
+ def before_visit_table_row(table_row)
55
+ @col = 1
56
+ end
57
+
58
+ def before_visit_table_cell_value(value, status)
59
+ if @col == 1
60
+ if(@options[:check_lang])
61
+ @incomplete = Parser::NaturalLanguage.get(nil, value).incomplete?
62
+ end
63
+ status = :comment
64
+ elsif @incomplete
65
+ status = :undefined
66
+ end
67
+
68
+ @col += 1
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,121 @@
1
+ require 'optparse'
2
+ require 'cucumber'
3
+ require 'ostruct'
4
+ require 'logger'
5
+ require 'cucumber/parser'
6
+ require 'cucumber/feature_file'
7
+ require 'cucumber/formatter/color_io'
8
+ require 'cucumber/cli/language_help_formatter'
9
+ require 'cucumber/cli/configuration'
10
+ require 'cucumber/cli/drb_client'
11
+ require 'cucumber/ast/tags'
12
+
13
+ module Cucumber
14
+ module Cli
15
+ class Main
16
+ FAILURE = 1
17
+
18
+ class << self
19
+ def step_mother
20
+ @step_mother ||= StepMother.new
21
+ end
22
+
23
+ def execute(args)
24
+ new(args).execute!(step_mother)
25
+ end
26
+ end
27
+
28
+ def initialize(args, out_stream = STDOUT, error_stream = STDERR)
29
+ @args = args
30
+ @out_stream = out_stream == STDOUT ? Formatter::ColorIO.new : out_stream
31
+ @error_stream = error_stream
32
+ @configuration = nil
33
+ end
34
+
35
+ def execute!(step_mother)
36
+ trap_interrupt
37
+ if configuration.drb?
38
+ begin
39
+ return DRbClient.run(@args, @error_stream, @out_stream, configuration.drb_port)
40
+ rescue DRbClientError => e
41
+ @error_stream.puts "WARNING: #{e.message} Running features locally:"
42
+ end
43
+ end
44
+ step_mother.options = configuration.options
45
+ step_mother.log = configuration.log
46
+
47
+ step_mother.load_code_files(configuration.support_to_load)
48
+ step_mother.after_configuration(configuration)
49
+ features = step_mother.load_plain_text_features(configuration.feature_files)
50
+ step_mother.load_code_files(configuration.step_defs_to_load)
51
+
52
+ enable_diffing
53
+
54
+ runner = configuration.build_runner(step_mother, @out_stream)
55
+ step_mother.visitor = runner # Needed to support World#announce
56
+ runner.visit_features(features)
57
+
58
+ failure = if exceeded_tag_limts?(features)
59
+ FAILURE
60
+ elsif configuration.wip?
61
+ step_mother.scenarios(:passed).any?
62
+ else
63
+ step_mother.scenarios(:failed).any? ||
64
+ (configuration.strict? && (step_mother.steps(:undefined).any? || step_mother.steps(:pending).any?))
65
+ end
66
+ rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
67
+ @error_stream.puts e.message
68
+ true
69
+ end
70
+
71
+ def exceeded_tag_limts?(features)
72
+ exceeded = false
73
+ configuration.options[:tag_names].each do |tag_list|
74
+ tag_list.each do |tag_name, limit|
75
+ if !Ast::Tags.exclude_tag?(tag_name) && limit
76
+ tag_count = features.tag_count(tag_name)
77
+ if tag_count > limit.to_i
78
+ exceeded = true
79
+ end
80
+ end
81
+ end
82
+ end
83
+ exceeded
84
+ end
85
+
86
+ def configuration
87
+ return @configuration if @configuration
88
+
89
+ @configuration = Configuration.new(@out_stream, @error_stream)
90
+ @configuration.parse!(@args)
91
+ @configuration
92
+ end
93
+
94
+ private
95
+
96
+ def enable_diffing
97
+ if configuration.diff_enabled?
98
+ begin
99
+ require 'spec/expectations'
100
+ begin
101
+ require 'spec/runner/differs/default' # RSpec >=1.2.4
102
+ rescue ::LoadError
103
+ require 'spec/expectations/differs/default' # RSpec <=1.2.3
104
+ end
105
+ options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
106
+ ::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
107
+ rescue ::LoadError => ignore
108
+ end
109
+ end
110
+ end
111
+
112
+ def trap_interrupt
113
+ trap('INT') do
114
+ exit!(1) if Cucumber.wants_to_quit
115
+ Cucumber.wants_to_quit = true
116
+ STDERR.puts "\nExiting... Interrupt again to exit immediately."
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,404 @@
1
+ require 'cucumber/cli/profile_loader'
2
+ module Cucumber
3
+ module Cli
4
+
5
+ class Options
6
+ BUILTIN_FORMATS = {
7
+ 'html' => ['Cucumber::Formatter::Html', 'Generates a nice looking HTML report.'],
8
+ 'pretty' => ['Cucumber::Formatter::Pretty', 'Prints the feature as is - in colours.'],
9
+ 'pdf' => ['Cucumber::Formatter::Pdf', "Generates a PDF report. You need to have the\n" +
10
+ "#{' ' * 51}prawn gem installed. Will pick up logo from\n" +
11
+ "#{' ' * 51}features/support/logo.png or\n" +
12
+ "#{' ' * 51}features/support/logo.jpg if present."],
13
+ 'progress' => ['Cucumber::Formatter::Progress', 'Prints one character per scenario.'],
14
+ 'rerun' => ['Cucumber::Formatter::Rerun', 'Prints failing files with line numbers.'],
15
+ 'usage' => ['Cucumber::Formatter::Usage', "Prints where step definitions are used.\n" +
16
+ "#{' ' * 51}The slowest step definitions (with duration) are\n" +
17
+ "#{' ' * 51}listed first. If --dry-run is used the duration\n" +
18
+ "#{' ' * 51}is not shown, and step definitions are sorted by\n" +
19
+ "#{' ' * 51}filename instead."],
20
+ 'stepdefs' => ['Cucumber::Formatter::Stepdefs', "Prints All step definitions with their locations. Same as\n" +
21
+ "#{' ' * 51}the usage formatter, except that steps are not printed."],
22
+ 'junit' => ['Cucumber::Formatter::Junit', 'Generates a report similar to Ant+JUnit.'],
23
+ 'tag_cloud' => ['Cucumber::Formatter::TagCloud', 'Prints a tag cloud of tag usage.'],
24
+ 'debug' => ['Cucumber::Formatter::Debug', 'For developing formatters - prints the calls made to the listeners.']
25
+ }
26
+ max = BUILTIN_FORMATS.keys.map{|s| s.length}.max
27
+ FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
28
+ " #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
29
+ end) + ["Use --format rerun --out features.txt to write out failing",
30
+ "features. You can rerun them with cucumber @features.txt.",
31
+ "FORMAT can also be the fully qualified class name of",
32
+ "your own custom formatter. If the class isn't loaded,",
33
+ "Cucumber will attempt to require a file with a relative",
34
+ "file name that is the underscore name of the class name.",
35
+ "Example: --format Foo::BarZap -> Cucumber will look for",
36
+ "foo/bar_zap.rb. You can place the file with this relative",
37
+ "path underneath your features/support directory or anywhere",
38
+ "on Ruby's LOAD_PATH, for example in a Ruby gem."
39
+ ]
40
+ DRB_FLAG = '--drb'
41
+ PROFILE_SHORT_FLAG = '-p'
42
+ NO_PROFILE_SHORT_FLAG = '-P'
43
+ PROFILE_LONG_FLAG = '--profile'
44
+ NO_PROFILE_LONG_FLAG = '--no-profile'
45
+
46
+
47
+ def self.parse(args, out_stream, error_stream, options = {})
48
+ new(out_stream, error_stream, options).parse!(args)
49
+ end
50
+
51
+ def initialize(out_stream = STDOUT, error_stream = STDERR, options = {})
52
+ @out_stream = out_stream
53
+ @error_stream = error_stream
54
+
55
+ @default_profile = options[:default_profile]
56
+ @skip_profile_information = options[:skip_profile_information]
57
+ @profiles = []
58
+ @overridden_paths = []
59
+ @options = default_options
60
+
61
+ @quiet = @disable_profile_loading = nil
62
+ end
63
+
64
+ def [](key)
65
+ @options[key]
66
+ end
67
+
68
+ def []=(key, value)
69
+ @options[key] = value
70
+ end
71
+
72
+ def expanded_args_without_drb
73
+ return @expanded_args_without_drb if @expanded_args_without_drb
74
+ @expanded_args_without_drb = (
75
+ previous_flag_was_profile = false
76
+ @expanded_args.reject do |arg|
77
+ if previous_flag_was_profile
78
+ previous_flag_was_profile = false
79
+ next true
80
+ end
81
+ if [PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG].include?(arg)
82
+ previous_flag_was_profile = true
83
+ next true
84
+ end
85
+ arg == DRB_FLAG || @overridden_paths.include?(arg)
86
+ end
87
+ )
88
+
89
+ @expanded_args_without_drb.push("--no-profile") unless @expanded_args_without_drb.include?(NO_PROFILE_LONG_FLAG) || @expanded_args_without_drb.include?(NO_PROFILE_SHORT_FLAG)
90
+ @expanded_args_without_drb
91
+ end
92
+
93
+ def parse!(args)
94
+ @args = args
95
+ @expanded_args = @args.dup
96
+
97
+ @args.extend(::OptionParser::Arguable)
98
+
99
+ @args.options do |opts|
100
+ opts.banner = ["Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+", "",
101
+ "Examples:",
102
+ "cucumber examples/i18n/en/features",
103
+ "cucumber @features.txt (See --format rerun)",
104
+ "cucumber examples/i18n/it/features/somma.feature:6:98:113",
105
+ "cucumber -s -i http://rubyurl.com/eeCl", "", "",
106
+ ].join("\n")
107
+ opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR",
108
+ "Require files before executing the features. If this",
109
+ "option is not specified, all *.rb files that are",
110
+ "siblings or below the features will be loaded auto-",
111
+ "matically. Automatic loading is disabled when this",
112
+ "option is specified, and all loading becomes explicit.",
113
+ "Files under directories named \"support\" are always",
114
+ "loaded first.",
115
+ "This option can be specified multiple times.") do |v|
116
+ @options[:require] << v
117
+ end
118
+ opts.on("-l LANG", "--language LANG (DEPRECATED)",
119
+ "Specify language for features (Default: #{@options[:lang]})",
120
+ %{Run with "--language help" to see all languages},
121
+ %{Run with "--language LANG help" to list keywords for LANG}) do |v|
122
+ if v == 'help'
123
+ list_languages_and_exit
124
+ elsif args==['help']
125
+ list_keywords_and_exit(v)
126
+ else
127
+ warn("\nWARNING: --language is deprecated and will be removed in version 0.5.\nSee http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages")
128
+ @options[:lang] = v
129
+ end
130
+ end
131
+ opts.on("-f FORMAT", "--format FORMAT",
132
+ "How to format features (Default: pretty). Available formats:",
133
+ *FORMAT_HELP) do |v|
134
+ @options[:formats] << [v, @out_stream]
135
+ end
136
+ opts.on("-o", "--out [FILE|DIR]",
137
+ "Write output to a file/directory instead of STDOUT. This option",
138
+ "applies to the previously specified --format, or the",
139
+ "default format if no format is specified. Check the specific",
140
+ "formatter's docs to see whether to pass a file or a dir.") do |v|
141
+ @options[:formats] << ['pretty', nil] if @options[:formats].empty?
142
+ @options[:formats][-1][1] = v
143
+ end
144
+ opts.on("-t TAGS", "--tags TAGS",
145
+ "Only execute the features or scenarios with the specified tags.",
146
+ "TAGS must be comma-separated without spaces. Example: --tags @dev\n",
147
+ "You can select tags using logical AND or logical OR:",
148
+ "To execute anything that is tagged with both @dev AND @prod\n",
149
+ "Example: --tags @dev,@prod",
150
+ "To execute anything that is tagged with @dev OR @prod\n",
151
+ "Example: --tags @dev --tags @prod\n",
152
+ "Negative tags: Prefix tags with ~ to exclude features or scenarios",
153
+ "having that tag. Example: --tags ~@slow\n",
154
+ "Limit WIP: Positive tags can be given a threshold to limit the",
155
+ "number of occurrences. Example: --tags @qa:3 will fail if there",
156
+ "are more than 3 occurrences of the @qa tag.") do |v|
157
+ tag_names = parse_tags(v)
158
+ @options[:tag_names] << tag_names
159
+ end
160
+ opts.on("-n NAME", "--name NAME",
161
+ "Only execute the feature elements which match part of the given name.",
162
+ "If this option is given more than once, it will match against all the",
163
+ "given names.") do |v|
164
+ @options[:name_regexps] << /#{v}/
165
+ end
166
+ opts.on("-e", "--exclude PATTERN", "Don't run feature files or require ruby files matching PATTERN") do |v|
167
+ @options[:excludes] << Regexp.new(v)
168
+ end
169
+ opts.on(PROFILE_SHORT_FLAG, "#{PROFILE_LONG_FLAG} PROFILE",
170
+ "Pull commandline arguments from cucumber.yml which can be defined as",
171
+ "strings or arrays. When a 'default' profile is defined and no profile",
172
+ "is specified it is always used. (Unless disabled, see -P below.)",
173
+ "When feature files are defined in a profile and on the command line",
174
+ "then only the ones from the command line are used.") do |v|
175
+ @profiles << v
176
+ end
177
+ opts.on(NO_PROFILE_SHORT_FLAG, NO_PROFILE_LONG_FLAG,
178
+ "Disables all profile laoding to avoid using the 'default' profile.") do |v|
179
+ @disable_profile_loading = true
180
+ end
181
+ opts.on("-c", "--[no-]color",
182
+ "Whether or not to use ANSI color in the output. Cucumber decides",
183
+ "based on your platform and the output destination if not specified.") do |v|
184
+ Term::ANSIColor.coloring = v
185
+ end
186
+ opts.on("-d", "--dry-run", "Invokes formatters without executing the steps.",
187
+ "This also omits the loading of your support/env.rb file if it exists.",
188
+ "Implies --no-snippets.") do
189
+ @options[:dry_run] = true
190
+ @options[:snippets] = false
191
+ end
192
+ opts.on("-a", "--autoformat DIR",
193
+ "Reformats (pretty prints) feature files and write them to DIRECTORY.",
194
+ "Be careful if you choose to overwrite the originals.",
195
+ "Implies --dry-run --formatter pretty.") do |directory|
196
+ @options[:autoformat] = directory
197
+ Term::ANSIColor.coloring = false
198
+ @options[:dry_run] = true
199
+ @quiet = true
200
+ end
201
+
202
+ opts.on("-m", "--no-multiline",
203
+ "Don't print multiline strings and tables under steps.") do
204
+ @options[:no_multiline] = true
205
+ end
206
+ opts.on("-s", "--no-source",
207
+ "Don't print the file and line of the step definition with the steps.") do
208
+ @options[:source] = false
209
+ end
210
+ opts.on("-i", "--no-snippets", "Don't print snippets for pending steps.") do
211
+ @options[:snippets] = false
212
+ end
213
+ opts.on("-q", "--quiet", "Alias for --no-snippets --no-source.") do
214
+ @quiet = true
215
+ end
216
+ opts.on("-b", "--backtrace", "Show full backtrace for all errors.") do
217
+ Cucumber.use_full_backtrace = true
218
+ end
219
+ opts.on("-S", "--strict", "Fail if there are any undefined steps.") do
220
+ @options[:strict] = true
221
+ end
222
+ opts.on("-w", "--wip", "Fail if there are any passing scenarios.") do
223
+ @options[:wip] = true
224
+ end
225
+ opts.on("-v", "--verbose", "Show the files and features loaded.") do
226
+ @options[:verbose] = true
227
+ end
228
+ opts.on("-g", "--guess", "Guess best match for Ambiguous steps.") do
229
+ @options[:guess] = true
230
+ end
231
+ opts.on("-x", "--expand", "Expand Scenario Outline Tables in output.") do
232
+ @options[:expand] = true
233
+ end
234
+ opts.on("--no-diff", "Disable diff output on failing expectations.") do
235
+ @options[:diff_enabled] = false
236
+ end
237
+ opts.on(DRB_FLAG, "Run features against a DRb server. (i.e. with the spork gem)") do
238
+ @options[:drb] = true
239
+ end
240
+ opts.on("--port PORT", "Specify DRb port. Ignored without --drb") do |port|
241
+ @options[:drb_port] = port
242
+ end
243
+ opts.on_tail("--version", "Show version.") do
244
+ @out_stream.puts Cucumber::VERSION
245
+ Kernel.exit(0)
246
+ end
247
+ opts.on_tail("-h", "--help", "You're looking at it.") do
248
+ @out_stream.puts opts.help
249
+ Kernel.exit(0)
250
+ end
251
+ end.parse!
252
+
253
+ if @quiet
254
+ @options[:snippets] = @options[:source] = false
255
+ else
256
+ @options[:snippets] = true if @options[:snippets].nil?
257
+ @options[:source] = true if @options[:source].nil?
258
+ end
259
+
260
+ extract_environment_variables
261
+ @options[:paths] = @args.dup #whatver is left over
262
+
263
+ merge_profiles
264
+ print_profile_information
265
+
266
+ self
267
+ end
268
+
269
+ protected
270
+
271
+ attr_reader :options, :profiles, :expanded_args
272
+ protected :options, :profiles, :expanded_args
273
+
274
+ private
275
+
276
+ def non_stdout_formats
277
+ @options[:formats].select {|format, output| output != @out_stream }
278
+ end
279
+
280
+ def stdout_formats
281
+ @options[:formats].select {|format, output| output == @out_stream }
282
+ end
283
+
284
+ def extract_environment_variables
285
+ @args.delete_if do |arg|
286
+ if arg =~ /^(\w+)=(.*)$/
287
+ @options[:env_vars][$1] = $2
288
+ true
289
+ end
290
+ end
291
+ end
292
+
293
+ def parse_tags(tag_string)
294
+ tag_names = Ast::Tags.parse_tags(tag_string)
295
+ parse_tag_limits(tag_names)
296
+ end
297
+
298
+ def parse_tag_limits(tag_names)
299
+ tag_names.inject({}) do |dict, tag|
300
+ tag, limit = tag.split(':')
301
+ dict[tag] = limit.nil? ? limit : limit.to_i
302
+ dict
303
+ end
304
+ end
305
+
306
+ def disable_profile_loading?
307
+ @disable_profile_loading
308
+ end
309
+
310
+ def merge_profiles
311
+ if @disable_profile_loading
312
+ @out_stream.puts "Disabling profiles..."
313
+ return
314
+ end
315
+
316
+ @profiles << @default_profile if default_profile_should_be_used?
317
+
318
+ @profiles.each do |profile|
319
+ profile_args = profile_loader.args_from(profile)
320
+ reverse_merge(
321
+ Options.parse(profile_args, @out_stream, @error_stream, :skip_profile_information => true)
322
+ )
323
+ end
324
+
325
+ end
326
+
327
+ def default_profile_should_be_used?
328
+ @profiles.empty? &&
329
+ profile_loader.cucumber_yml_defined? &&
330
+ profile_loader.has_profile?(@default_profile)
331
+ end
332
+
333
+ def profile_loader
334
+ @profile_loader ||= ProfileLoader.new
335
+ end
336
+
337
+ def reverse_merge(other_options)
338
+ @options = other_options.options.merge(@options)
339
+ @options[:require] += other_options[:require]
340
+ @options[:excludes] += other_options[:excludes]
341
+ @options[:name_regexps] += other_options[:name_regexps]
342
+ @options[:tag_names] += other_options[:tag_names]
343
+ @options[:env_vars] = other_options[:env_vars].merge(@options[:env_vars])
344
+ if @options[:paths].empty?
345
+ @options[:paths] = other_options[:paths]
346
+ else
347
+ @overridden_paths += (other_options[:paths] - @options[:paths])
348
+ end
349
+ @options[:source] &= other_options[:source]
350
+ @options[:snippets] &= other_options[:snippets]
351
+
352
+ @profiles += other_options.profiles
353
+ @expanded_args += other_options.expanded_args
354
+
355
+ if @options[:formats].empty?
356
+ @options[:formats] = other_options[:formats]
357
+ else
358
+ @options[:formats] += other_options[:formats]
359
+ @options[:formats] = stdout_formats[0..0] + non_stdout_formats
360
+ end
361
+
362
+ self
363
+ end
364
+
365
+ # TODO: Move to Language
366
+ def list_keywords_and_exit(lang)
367
+ unless Cucumber::LANGUAGES[lang]
368
+ raise("No language with key #{lang}")
369
+ end
370
+ LanguageHelpFormatter.list_keywords(@out_stream, lang)
371
+ Kernel.exit(0)
372
+ end
373
+
374
+ def list_languages_and_exit
375
+ LanguageHelpFormatter.list_languages(@out_stream)
376
+ Kernel.exit(0)
377
+ end
378
+
379
+ def print_profile_information
380
+ return if @skip_profile_information || @profiles.empty?
381
+ profiles_sentence = ''
382
+ profiles_sentence = @profiles.size == 1 ? @profiles.first :
383
+ "#{@profiles[0...-1].join(', ')} and #{@profiles.last}"
384
+
385
+ @out_stream.puts "Using the #{profiles_sentence} profile#{'s' if @profiles.size> 1}..."
386
+ end
387
+
388
+ def default_options
389
+ {
390
+ :strict => false,
391
+ :require => [],
392
+ :dry_run => false,
393
+ :formats => [],
394
+ :excludes => [],
395
+ :tag_names => [],
396
+ :name_regexps => [],
397
+ :env_vars => {},
398
+ :diff_enabled => true
399
+ }
400
+ end
401
+ end
402
+
403
+ end
404
+ end