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,116 @@
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
+
12
+ module Cucumber
13
+ module Cli
14
+ class Main
15
+ FAILURE = 1
16
+
17
+ class << self
18
+ def step_mother
19
+ @step_mother ||= StepMother.new
20
+ end
21
+
22
+ def execute(args)
23
+ new(args).execute!(step_mother)
24
+ end
25
+ end
26
+
27
+ def initialize(args, out_stream = STDOUT, error_stream = STDERR)
28
+ @args = args
29
+ @out_stream = out_stream == STDOUT ? Formatter::ColorIO.new : out_stream
30
+ @error_stream = error_stream
31
+ end
32
+
33
+ def execute!(step_mother)
34
+ trap_interrupt
35
+ if configuration.drb?
36
+ begin
37
+ return DRbClient.run(@args, @error_stream, @out_stream, configuration.drb_port)
38
+ rescue DRbClientError => e
39
+ @error_stream.puts "WARNING: #{e.message} Running features locally:"
40
+ end
41
+ end
42
+ step_mother.options = configuration.options
43
+ step_mother.log = configuration.log
44
+
45
+ step_mother.load_code_files(configuration.support_to_load)
46
+ step_mother.after_configuration(configuration)
47
+ features = step_mother.load_plain_text_features(configuration.feature_files)
48
+ step_mother.load_code_files(configuration.step_defs_to_load)
49
+ enable_diffing
50
+
51
+ visitor = configuration.build_formatter_broadcaster(step_mother)
52
+ step_mother.visitor = visitor # Needed to support World#announce
53
+ visitor.visit_features(features)
54
+
55
+ failure = if exceeded_tag_limts?(features)
56
+ FAILURE
57
+ elsif configuration.wip?
58
+ step_mother.scenarios(:passed).any?
59
+ else
60
+ step_mother.scenarios(:failed).any? ||
61
+ (configuration.strict? && (step_mother.steps(:undefined).any? || step_mother.steps(:pending).any?))
62
+ end
63
+ rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
64
+ @error_stream.puts e.message
65
+ true
66
+ end
67
+
68
+ def exceeded_tag_limts?(features)
69
+ exceeded = false
70
+ configuration.options[:include_tags].each do |tag, limit|
71
+ unless limit.nil?
72
+ tag_count = features.tag_count(tag)
73
+ if tag_count > limit.to_i
74
+ exceeded = true
75
+ end
76
+ end
77
+ end
78
+ exceeded
79
+ end
80
+
81
+ def configuration
82
+ return @configuration if @configuration
83
+
84
+ @configuration = Configuration.new(@out_stream, @error_stream)
85
+ @configuration.parse!(@args)
86
+ @configuration
87
+ end
88
+
89
+ private
90
+
91
+ def enable_diffing
92
+ if configuration.diff_enabled?
93
+ begin
94
+ require 'spec/expectations'
95
+ begin
96
+ require 'spec/runner/differs/default' # RSpec >=1.2.4
97
+ rescue ::LoadError
98
+ require 'spec/expectations/differs/default' # RSpec <=1.2.3
99
+ end
100
+ options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
101
+ ::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
102
+ rescue ::LoadError => ignore
103
+ end
104
+ end
105
+ end
106
+
107
+ def trap_interrupt
108
+ trap('INT') do
109
+ exit!(1) if $cucumber_interrupted
110
+ $cucumber_interrupted = true
111
+ STDERR.puts "\nExiting... Interrupt again to exit immediately."
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,394 @@
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 if present."],
12
+ 'profile' => ['Cucumber::Formatter::Profile', 'Prints the 10 slowest steps at the end.'],
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.'],
16
+ 'junit' => ['Cucumber::Formatter::Junit', 'Generates a report similar to Ant+JUnit.'],
17
+ 'tag_cloud' => ['Cucumber::Formatter::TagCloud', 'Prints a tag cloud of tag usage.'],
18
+ 'steps' => ['Cucumber::Formatter::Steps', 'Prints location of step definitions.']
19
+ }
20
+ max = BUILTIN_FORMATS.keys.map{|s| s.length}.max
21
+ FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
22
+ " #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
23
+ end) + ["Use --format rerun --out features.txt to rerun failing",
24
+ "failing features in a new run with cucumber @features.txt.",
25
+ "FORMAT can also be the fully qualified class name of",
26
+ "your own custom formatter. If the class isn't loaded,",
27
+ "Cucumber will attempt to require a file with a relative",
28
+ "file name that is the underscore name of the class name.",
29
+ "Example: --format Foo::BarZap -> Cucumber will look for",
30
+ "foo/bar_zap.rb. You can place the file with this relative",
31
+ "path underneath your features/support directory or anywhere",
32
+ "on Ruby's LOAD_PATH, for example in a Ruby gem."
33
+ ]
34
+ DRB_FLAG = '--drb'
35
+ PROFILE_SHORT_FLAG = '-p'
36
+ NO_PROFILE_SHORT_FLAG = '-P'
37
+ PROFILE_LONG_FLAG = '--profile'
38
+ NO_PROFILE_LONG_FLAG = '--no-profile'
39
+
40
+
41
+ def self.parse(args, out_stream, error_stream, options = {})
42
+ new(out_stream, error_stream, options).parse!(args)
43
+ end
44
+
45
+ def initialize(out_stream = STDOUT, error_stream = STDERR, options = {})
46
+ @out_stream = out_stream
47
+ @error_stream = error_stream
48
+
49
+ @default_profile = options[:default_profile]
50
+ @skip_profile_information = options[:skip_profile_information]
51
+ @profiles = []
52
+ @overridden_paths = []
53
+ @options = default_options
54
+ end
55
+
56
+ def [](key)
57
+ @options[key]
58
+ end
59
+
60
+ def []=(key, value)
61
+ @options[key] = value
62
+ end
63
+
64
+ def expanded_args_without_drb
65
+ return @expanded_args_without_drb if @expanded_args_without_drb
66
+ @expanded_args_without_drb = (
67
+ previous_flag_was_profile = false
68
+ @expanded_args.reject do |arg|
69
+ if previous_flag_was_profile
70
+ previous_flag_was_profile = false
71
+ next true
72
+ end
73
+ if [PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG].include?(arg)
74
+ previous_flag_was_profile = true
75
+ next true
76
+ end
77
+ arg == DRB_FLAG || @overridden_paths.include?(arg)
78
+ end
79
+ )
80
+
81
+ @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)
82
+ @expanded_args_without_drb
83
+ end
84
+
85
+ def parse!(args)
86
+ @args = args
87
+ @expanded_args = @args.dup
88
+
89
+ @args.extend(::OptionParser::Arguable)
90
+
91
+ @args.options do |opts|
92
+ opts.banner = ["Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+", "",
93
+ "Examples:",
94
+ "cucumber examples/i18n/en/features",
95
+ "cucumber @features.txt (See --format rerun)",
96
+ "cucumber --language it examples/i18n/it/features/somma.feature:6:98:113",
97
+ "cucumber -s -i http://rubyurl.com/eeCl", "", "",
98
+ ].join("\n")
99
+ opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR",
100
+ "Require files before executing the features. If this",
101
+ "option is not specified, all *.rb files that are",
102
+ "siblings or below the features will be loaded auto-",
103
+ "matically. Automatic loading is disabled when this",
104
+ "option is specified, and all loading becomes explicit.",
105
+ "Files under directories named \"support\" are always",
106
+ "loaded first.",
107
+ "This option can be specified multiple times.") do |v|
108
+ @options[:require] << v
109
+ end
110
+ opts.on("-l LANG", "--language LANG",
111
+ "Specify language for features (Default: #{@options[:lang]})",
112
+ %{Run with "--language help" to see all languages},
113
+ %{Run with "--language LANG help" to list keywords for LANG}) do |v|
114
+ if v == 'help'
115
+ list_languages_and_exit
116
+ elsif args==['help'] # I think this conditional is just cruft and can be removed
117
+ list_keywords_and_exit(v)
118
+ else
119
+ @options[:lang] = v
120
+ end
121
+ end
122
+ opts.on("-f FORMAT", "--format FORMAT",
123
+ "How to format features (Default: pretty). Available formats:",
124
+ *FORMAT_HELP) do |v|
125
+ @options[:formats] << [v, @out_stream]
126
+ end
127
+ opts.on("-o", "--out [FILE|DIR]",
128
+ "Write output to a file/directory instead of STDOUT. This option",
129
+ "applies to the previously specified --format, or the",
130
+ "default format if no format is specified. Check the specific",
131
+ "formatter's docs to see whether to pass a file or a dir.") do |v|
132
+ @options[:formats] << ['pretty', nil] if @options[:formats].empty?
133
+ @options[:formats][-1][1] = v
134
+ end
135
+ opts.on("-t TAGS", "--tags TAGS",
136
+ "Only execute the features or scenarios with the specified tags.",
137
+ "TAGS must be comma-separated without spaces. They can be",
138
+ "specified with or without the @ prefix. Example: --tags dev\n",
139
+ "Negative tags: Prefix tags with ~ to exclude features or scenarios",
140
+ "having that tag.\n",
141
+ "Limit WIP: Positive tags can be given a threshold to limit the",
142
+ "number of occurrences. Example: --tags qa:3 will fail if there",
143
+ "are more than 3 occurrences of the @qa tag.") do |v|
144
+ include_tags, exclude_tags = *parse_tags(v)
145
+ @options[:include_tags].merge!(include_tags)
146
+ @options[:exclude_tags].merge!(exclude_tags)
147
+ end
148
+ opts.on("-n NAME", "--name NAME",
149
+ "Only execute the feature elements which match part of the given name.",
150
+ "If this option is given more than once, it will match against all the",
151
+ "given names.") do |v|
152
+ @options[:name_regexps] << /#{v}/
153
+ end
154
+ opts.on("-e", "--exclude PATTERN", "Don't run feature files or require ruby files matching PATTERN") do |v|
155
+ @options[:excludes] << Regexp.new(v)
156
+ end
157
+ opts.on(PROFILE_SHORT_FLAG, "#{PROFILE_LONG_FLAG} PROFILE",
158
+ "Pull commandline arguments from cucumber.yml which can be defined as",
159
+ "strings or arrays. When a 'default' profile is defined and no profile",
160
+ "is specified it is always used. (Unless disabled, see -P below.)",
161
+ "When feature files are defined in a profile and on the command line",
162
+ "then only the ones from the command line are used.") do |v|
163
+ @profiles << v
164
+ end
165
+ opts.on(NO_PROFILE_SHORT_FLAG, NO_PROFILE_LONG_FLAG,
166
+ "Disables all profile laoding to avoid using the 'default' profile.") do |v|
167
+ @disable_profile_loading = true
168
+ end
169
+ opts.on("-c", "--[no-]color",
170
+ "Whether or not to use ANSI color in the output. Cucumber decides",
171
+ "based on your platform and the output destination if not specified.") do |v|
172
+ Term::ANSIColor.coloring = v
173
+ end
174
+ opts.on("-d", "--dry-run", "Invokes formatters without executing the steps.",
175
+ "This also omits the loading of your support/env.rb file if it exists.",
176
+ "Implies --quiet.") do
177
+ @options[:dry_run] = true
178
+ @quiet = true
179
+ end
180
+ opts.on("-a", "--autoformat DIRECTORY",
181
+ "Reformats (pretty prints) feature files and write them to DIRECTORY.",
182
+ "Be careful if you choose to overwrite the originals.",
183
+ "Implies --dry-run --formatter pretty.") do |directory|
184
+ @options[:autoformat] = directory
185
+ Term::ANSIColor.coloring = false
186
+ @options[:dry_run] = true
187
+ @quiet = true
188
+ end
189
+
190
+ opts.on("-m", "--no-multiline",
191
+ "Don't print multiline strings and tables under steps.") do
192
+ @options[:no_multiline] = true
193
+ end
194
+ opts.on("-s", "--no-source",
195
+ "Don't print the file and line of the step definition with the steps.") do
196
+ @options[:source] = false
197
+ end
198
+ opts.on("-i", "--no-snippets", "Don't print snippets for pending steps.") do
199
+ @options[:snippets] = false
200
+ end
201
+ opts.on("-q", "--quiet", "Alias for --no-snippets --no-source.") do
202
+ @quiet = true
203
+ end
204
+ opts.on("-b", "--backtrace", "Show full backtrace for all errors.") do
205
+ Cucumber.use_full_backtrace = true
206
+ end
207
+ opts.on("-S", "--strict", "Fail if there are any undefined steps.") do
208
+ @options[:strict] = true
209
+ end
210
+ opts.on("-w", "--wip", "Fail if there are any passing scenarios.") do
211
+ @options[:wip] = true
212
+ end
213
+ opts.on("-v", "--verbose", "Show the files and features loaded.") do
214
+ @options[:verbose] = true
215
+ end
216
+ opts.on("-g", "--guess", "Guess best match for Ambiguous steps.") do
217
+ @options[:guess] = true
218
+ end
219
+ opts.on("-x", "--expand", "Expand Scenario Outline Tables in output.") do
220
+ @options[:expand] = true
221
+ end
222
+ opts.on("--no-diff", "Disable diff output on failing expectations.") do
223
+ @options[:diff_enabled] = false
224
+ end
225
+ opts.on(DRB_FLAG, "Run features against a DRb server. (i.e. with the spork gem)") do
226
+ @options[:drb] = true
227
+ end
228
+ opts.on("--port PORT", "Specify DRb port. Ignored without --drb") do |port|
229
+ @options[:drb_port] = port
230
+ end
231
+ opts.on_tail("--version", "Show version.") do
232
+ @out_stream.puts VERSION::STRING
233
+ Kernel.exit
234
+ end
235
+ opts.on_tail("-h", "--help", "You're looking at it.") do
236
+ @out_stream.puts opts.help
237
+ Kernel.exit
238
+ end
239
+ end.parse!
240
+
241
+ if @quiet
242
+ @options[:snippets] = @options[:source] = false
243
+ else
244
+ @options[:snippets] = true if @options[:snippets].nil?
245
+ @options[:source] = true if @options[:source].nil?
246
+ end
247
+
248
+ extract_environment_variables
249
+ @options[:paths] = @args.dup #whatver is left over
250
+
251
+ merge_profiles
252
+ print_profile_information
253
+
254
+ self
255
+ end
256
+
257
+ protected
258
+
259
+ attr_reader :options, :profiles, :expanded_args
260
+ protected :options, :profiles, :expanded_args
261
+
262
+ def non_stdout_formats
263
+ @options[:formats].select {|format, output| output != @out_stream }
264
+ end
265
+
266
+ private
267
+
268
+ def extract_environment_variables
269
+ @args.delete_if do |arg|
270
+ if arg =~ /^(\w+)=(.*)$/
271
+ @options[:env_vars][$1] = $2
272
+ true
273
+ end
274
+ end
275
+ end
276
+
277
+ def parse_tags(tag_string)
278
+ tag_names = tag_string.split(",")
279
+ excludes, includes = tag_names.partition{|tag| tag =~ /^~/}
280
+ excludes = excludes.map{|tag| tag[1..-1]}
281
+
282
+ # Strip @
283
+ includes = includes.map{|tag| Ast::Tags.strip_prefix(tag)}
284
+ excludes = excludes.map{|tag| Ast::Tags.strip_prefix(tag)}
285
+ [parse_tag_limits(includes), parse_tag_limits(excludes)]
286
+ end
287
+
288
+ def parse_tag_limits(includes)
289
+ dict = {}
290
+ includes.each do |tag|
291
+ tag, limit = tag.split(':')
292
+ dict[tag] = limit.nil? ? limit : limit.to_i
293
+ end
294
+ dict
295
+ end
296
+
297
+ def disable_profile_loading?
298
+ @disable_profile_loading
299
+ end
300
+
301
+ def merge_profiles
302
+ if @disable_profile_loading
303
+ @out_stream.puts "Disabling profiles..."
304
+ return
305
+ end
306
+
307
+ @profiles << @default_profile if default_profile_should_be_used?
308
+
309
+ @profiles.each do |profile|
310
+ profile_args = profile_loader.args_from(profile)
311
+ reverse_merge(
312
+ Options.parse(profile_args, @out_stream, @error_stream, :skip_profile_information => true)
313
+ )
314
+ end
315
+
316
+ end
317
+
318
+ def default_profile_should_be_used?
319
+ @profiles.empty? &&
320
+ profile_loader.cucumber_yml_defined? &&
321
+ profile_loader.has_profile?(@default_profile)
322
+ end
323
+
324
+ def profile_loader
325
+ @profile_loader ||= ProfileLoader.new
326
+ end
327
+
328
+ def reverse_merge(other_options)
329
+ @options = other_options.options.merge(@options)
330
+ @options[:require] += other_options[:require]
331
+ @options[:include_tags].merge! other_options[:include_tags]
332
+ @options[:exclude_tags].merge! other_options[:exclude_tags]
333
+ @options[:env_vars] = other_options[:env_vars].merge(@options[:env_vars])
334
+ if @options[:paths].empty?
335
+ @options[:paths] = other_options[:paths]
336
+ else
337
+ @overridden_paths += (other_options[:paths] - @options[:paths])
338
+ end
339
+ @options[:source] &= other_options[:source]
340
+ @options[:snippets] &= other_options[:snippets]
341
+
342
+ @profiles += other_options.profiles
343
+ @expanded_args += other_options.expanded_args
344
+
345
+ if @options[:formats].empty?
346
+ @options[:formats] = other_options[:formats]
347
+ else
348
+ @options[:formats] += other_options.non_stdout_formats
349
+ end
350
+
351
+ self
352
+ end
353
+
354
+ # TODO: Move to Language
355
+ def list_keywords_and_exit(lang)
356
+ unless Cucumber::LANGUAGES[lang]
357
+ raise("No language with key #{lang}")
358
+ end
359
+ LanguageHelpFormatter.list_keywords(@out_stream, lang)
360
+ Kernel.exit
361
+ end
362
+
363
+ def list_languages_and_exit
364
+ LanguageHelpFormatter.list_languages(@out_stream)
365
+ Kernel.exit
366
+ end
367
+
368
+ def print_profile_information
369
+ return if @skip_profile_information || @profiles.empty?
370
+ profiles_sentence = ''
371
+ profiles_sentence = @profiles.size == 1 ? @profiles.first :
372
+ "#{@profiles[0...-1].join(', ')} and #{@profiles.last}"
373
+
374
+ @out_stream.puts "Using the #{profiles_sentence} profile#{'s' if @profiles.size> 1}..."
375
+ end
376
+
377
+ def default_options
378
+ {
379
+ :strict => false,
380
+ :require => [],
381
+ :dry_run => false,
382
+ :formats => [],
383
+ :excludes => [],
384
+ :include_tags => {},
385
+ :exclude_tags => {},
386
+ :name_regexps => [],
387
+ :env_vars => {},
388
+ :diff_enabled => true
389
+ }
390
+ end
391
+ end
392
+
393
+ end
394
+ end