dwaite-cucumber 0.3.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. data/History.txt +1067 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en/Rakefile +6 -0
  46. data/examples/i18n/en/features/addition.feature +17 -0
  47. data/examples/i18n/en/features/division.feature +10 -0
  48. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  49. data/examples/i18n/en/lib/calculator.rb +14 -0
  50. data/examples/i18n/en-lol/Rakefile +6 -0
  51. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  52. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  53. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  54. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  55. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter/a.html +183 -0
  279. data/features/html_formatter.feature +7 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber/ast/background.rb +63 -0
  315. data/lib/cucumber/ast/comment.rb +31 -0
  316. data/lib/cucumber/ast/examples.rb +32 -0
  317. data/lib/cucumber/ast/feature.rb +81 -0
  318. data/lib/cucumber/ast/feature_element.rb +61 -0
  319. data/lib/cucumber/ast/features.rb +40 -0
  320. data/lib/cucumber/ast/outline_table.rb +146 -0
  321. data/lib/cucumber/ast/py_string.rb +57 -0
  322. data/lib/cucumber/ast/scenario.rb +108 -0
  323. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  324. data/lib/cucumber/ast/step.rb +116 -0
  325. data/lib/cucumber/ast/step_collection.rb +76 -0
  326. data/lib/cucumber/ast/step_invocation.rb +166 -0
  327. data/lib/cucumber/ast/table.rb +626 -0
  328. data/lib/cucumber/ast/tags.rb +44 -0
  329. data/lib/cucumber/ast/visitor.rb +115 -0
  330. data/lib/cucumber/ast.rb +29 -0
  331. data/lib/cucumber/broadcaster.rb +13 -0
  332. data/lib/cucumber/cli/configuration.rb +190 -0
  333. data/lib/cucumber/cli/drb_client.rb +26 -0
  334. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  335. data/lib/cucumber/cli/main.rb +116 -0
  336. data/lib/cucumber/cli/options.rb +394 -0
  337. data/lib/cucumber/cli/profile_loader.rb +70 -0
  338. data/lib/cucumber/constantize.rb +28 -0
  339. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  340. data/lib/cucumber/core_ext/proc.rb +29 -0
  341. data/lib/cucumber/core_ext/string.rb +48 -0
  342. data/lib/cucumber/feature_file.rb +54 -0
  343. data/lib/cucumber/filter.rb +52 -0
  344. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  345. data/lib/cucumber/formatter/color_io.rb +23 -0
  346. data/lib/cucumber/formatter/console.rb +185 -0
  347. data/lib/cucumber/formatter/cucumber.css +132 -0
  348. data/lib/cucumber/formatter/cucumber.sass +139 -0
  349. data/lib/cucumber/formatter/duration.rb +13 -0
  350. data/lib/cucumber/formatter/html.rb +261 -0
  351. data/lib/cucumber/formatter/junit.rb +121 -0
  352. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  353. data/lib/cucumber/formatter/pdf.rb +217 -0
  354. data/lib/cucumber/formatter/pretty.rb +222 -0
  355. data/lib/cucumber/formatter/profile.rb +78 -0
  356. data/lib/cucumber/formatter/progress.rb +67 -0
  357. data/lib/cucumber/formatter/rerun.rb +46 -0
  358. data/lib/cucumber/formatter/steps.rb +50 -0
  359. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  360. data/lib/cucumber/formatter/unicode.rb +35 -0
  361. data/lib/cucumber/formatter/usage.rb +86 -0
  362. data/lib/cucumber/formatters/unicode.rb +7 -0
  363. data/lib/cucumber/language_support/language_methods.rb +75 -0
  364. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  365. data/lib/cucumber/language_support.rb +30 -0
  366. data/lib/cucumber/languages.yml +561 -0
  367. data/lib/cucumber/parser/feature.rb +1838 -0
  368. data/lib/cucumber/parser/feature.tt +351 -0
  369. data/lib/cucumber/parser/i18n.tt +42 -0
  370. data/lib/cucumber/parser/natural_language.rb +72 -0
  371. data/lib/cucumber/parser/table.rb +417 -0
  372. data/lib/cucumber/parser/table.tt +71 -0
  373. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  374. data/lib/cucumber/parser.rb +6 -0
  375. data/lib/cucumber/platform.rb +27 -0
  376. data/lib/cucumber/py_support/py_dsl.py +8 -0
  377. data/lib/cucumber/py_support/py_language.py +2 -0
  378. data/lib/cucumber/py_support/py_language.rb +68 -0
  379. data/lib/cucumber/rails/rspec.rb +10 -0
  380. data/lib/cucumber/rails/world.rb +100 -0
  381. data/lib/cucumber/rake/task.rb +241 -0
  382. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  383. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  384. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  386. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  387. data/lib/cucumber/rspec_neuter.rb +23 -0
  388. data/lib/cucumber/step_match.rb +61 -0
  389. data/lib/cucumber/step_mother.rb +307 -0
  390. data/lib/cucumber/version.rb +10 -0
  391. data/lib/cucumber/webrat/element_locator.rb +87 -0
  392. data/lib/cucumber/webrat/table_locator.rb +1 -0
  393. data/lib/cucumber.rb +10 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -0,0 +1,115 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Base class for formatters. This class just walks the tree depth first.
4
+ # Just override the methods you care about. Remember to call super if you
5
+ # override a method.
6
+ class Visitor
7
+ attr_accessor :options #:nodoc:
8
+ attr_reader :step_mother #:nodoc:
9
+
10
+ def initialize(step_mother)
11
+ @options = {}
12
+ @step_mother = step_mother
13
+ end
14
+
15
+ def visit_features(features)
16
+ features.accept(self)
17
+ end
18
+
19
+ def visit_feature(feature)
20
+ feature.accept(self)
21
+ end
22
+
23
+ def visit_comment(comment)
24
+ comment.accept(self)
25
+ end
26
+
27
+ def visit_comment_line(comment_line)
28
+ end
29
+
30
+ def visit_tags(tags)
31
+ tags.accept(self)
32
+ end
33
+
34
+ def visit_tag_name(tag_name)
35
+ end
36
+
37
+ def visit_feature_name(name)
38
+ end
39
+
40
+ # +feature_element+ is either Scenario or ScenarioOutline
41
+ def visit_feature_element(feature_element)
42
+ feature_element.accept(self)
43
+ end
44
+
45
+ def visit_background(background)
46
+ background.accept(self)
47
+ end
48
+
49
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
50
+ end
51
+
52
+ def visit_examples_array(examples_array)
53
+ examples_array.accept(self)
54
+ end
55
+
56
+ def visit_examples(examples)
57
+ examples.accept(self)
58
+ end
59
+
60
+ def visit_examples_name(keyword, name)
61
+ end
62
+
63
+ def visit_outline_table(outline_table)
64
+ @table = outline_table
65
+ outline_table.accept(self)
66
+ end
67
+
68
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
69
+ end
70
+
71
+ def visit_steps(steps)
72
+ steps.accept(self)
73
+ end
74
+
75
+ def visit_step(step)
76
+ step.accept(self)
77
+ end
78
+
79
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
80
+ visit_step_name(keyword, step_match, status, source_indent, background)
81
+ visit_multiline_arg(multiline_arg) if multiline_arg
82
+ visit_exception(exception, status) if exception
83
+ end
84
+
85
+ def visit_step_name(keyword, step_match, status, source_indent, background) #:nodoc:
86
+ end
87
+
88
+ def visit_multiline_arg(multiline_arg) #:nodoc:
89
+ multiline_arg.accept(self)
90
+ end
91
+
92
+ def visit_exception(exception, status) #:nodoc:
93
+ end
94
+
95
+ def visit_py_string(string)
96
+ end
97
+
98
+ def visit_table_row(table_row)
99
+ table_row.accept(self)
100
+ end
101
+
102
+ def visit_table_cell(table_cell)
103
+ table_cell.accept(self)
104
+ end
105
+
106
+ def visit_table_cell_value(value, status)
107
+ end
108
+
109
+ # Print +announcement+. This method can be called from within StepDefinitions.
110
+ def announce(announcement)
111
+ end
112
+
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,29 @@
1
+ require 'cucumber/ast/comment'
2
+ require 'cucumber/ast/tags'
3
+ require 'cucumber/ast/features'
4
+ require 'cucumber/ast/feature'
5
+ require 'cucumber/ast/background'
6
+ require 'cucumber/ast/scenario'
7
+ require 'cucumber/ast/scenario_outline'
8
+ require 'cucumber/ast/step_invocation'
9
+ require 'cucumber/ast/step_collection'
10
+ require 'cucumber/ast/step'
11
+ require 'cucumber/ast/table'
12
+ require 'cucumber/ast/py_string'
13
+ require 'cucumber/ast/outline_table'
14
+ require 'cucumber/ast/examples'
15
+ require 'cucumber/ast/visitor'
16
+
17
+ module Cucumber
18
+ # Classes in this module represent the Abstract Syntax Tree (AST)
19
+ # that gets built when feature files are parsed.
20
+ #
21
+ # AST classes don't expose any internal data directly. This is
22
+ # in order to encourage a less coupled design in the classes
23
+ # that operate on the AST. The only public method is #accept.
24
+ #
25
+ # The AST can be traversed with a visitor. See Cucumber::Format::Pretty
26
+ # for an example.
27
+ module Ast
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ module Cucumber
2
+ class Broadcaster #:nodoc:
3
+ def initialize(receivers = [])
4
+ @receivers = receivers
5
+ end
6
+
7
+ def method_missing(method_name, *args)
8
+ @receivers.map do |receiver|
9
+ receiver.__send__(method_name, *args)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,190 @@
1
+ require 'logger'
2
+ require 'cucumber/cli/options'
3
+ require 'cucumber/constantize'
4
+
5
+ module Cucumber
6
+ module Cli
7
+ class YmlLoadError < StandardError; end
8
+ class ProfilesNotDefinedError < YmlLoadError; end
9
+ class ProfileNotFound < StandardError; end
10
+
11
+ class Configuration
12
+ include Constantize
13
+
14
+ attr_reader :options, :out_stream
15
+
16
+ def initialize(out_stream = STDOUT, error_stream = STDERR)
17
+ @out_stream = out_stream
18
+ @error_stream = error_stream
19
+ @options = Options.new(@out_stream, @error_stream, :default_profile => 'default')
20
+ end
21
+
22
+ def parse!(args)
23
+ @args = args
24
+ @options.parse!(args)
25
+ arrange_formats
26
+ raise("You can't use both --strict and --wip") if strict? && wip?
27
+
28
+ return @args.replace(@options.expanded_args_without_drb) if drb?
29
+
30
+ set_environment_variables
31
+ end
32
+
33
+ def verbose?
34
+ @options[:verbose]
35
+ end
36
+
37
+ def strict?
38
+ @options[:strict]
39
+ end
40
+
41
+ def wip?
42
+ @options[:wip]
43
+ end
44
+
45
+ def guess?
46
+ @options[:guess]
47
+ end
48
+
49
+ def diff_enabled?
50
+ @options[:diff_enabled]
51
+ end
52
+
53
+ def drb?
54
+ @options[:drb]
55
+ end
56
+
57
+ def drb_port
58
+ @options[:drb_port].to_i if @options[:drb_port]
59
+ end
60
+
61
+ def build_formatter_broadcaster(step_mother)
62
+ return Formatter::Pretty.new(step_mother, nil, @options) if @options[:autoformat]
63
+ formatters = @options[:formats].map do |format_and_out|
64
+ format = format_and_out[0]
65
+ out = format_and_out[1]
66
+ if String === out # file name
67
+ unless File.directory?(out)
68
+ out = File.open(out, Cucumber.file_mode('w'))
69
+ at_exit do
70
+ out.flush
71
+ out.close
72
+ end
73
+ end
74
+ end
75
+
76
+ begin
77
+ formatter_class = formatter_class(format)
78
+ formatter_class.new(step_mother, out, @options)
79
+ rescue Exception => e
80
+ e.message << "\nError creating formatter: #{format}"
81
+ raise e
82
+ end
83
+ end
84
+
85
+ broadcaster = Broadcaster.new(formatters)
86
+ broadcaster.options = @options
87
+ return broadcaster
88
+ end
89
+
90
+ def formatter_class(format)
91
+ if(builtin = Options::BUILTIN_FORMATS[format])
92
+ constantize(builtin[0])
93
+ else
94
+ constantize(format)
95
+ end
96
+ end
97
+
98
+ def all_files_to_load
99
+ requires = @options[:require].empty? ? require_dirs : @options[:require]
100
+ files = requires.map do |path|
101
+ path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
102
+ path = path.gsub(/\/$/, '') # Strip trailing slash.
103
+ File.directory?(path) ? Dir["#{path}/**/*"] : path
104
+ end.flatten.uniq
105
+ remove_excluded_files_from(files)
106
+ files.reject! {|f| !File.file?(f)}
107
+ files.reject! {|f| File.extname(f) == '.feature' }
108
+ files.reject! {|f| f =~ /^http/}
109
+ files
110
+ end
111
+
112
+ def step_defs_to_load
113
+ all_files_to_load.reject {|f| f =~ %r{/support/} }
114
+ end
115
+
116
+ def support_to_load
117
+ support_files = all_files_to_load.select {|f| f =~ %r{/support/} }
118
+ env_files = support_files.select {|f| f =~ %r{/support/env\..*} }
119
+ other_files = support_files - env_files
120
+ @options[:dry_run] ? other_files : env_files + other_files
121
+ end
122
+
123
+ def feature_files
124
+ potential_feature_files = paths.map do |path|
125
+ path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
126
+ path = path.chomp('/')
127
+ if File.directory?(path)
128
+ Dir["#{path}/**/*.feature"]
129
+ elsif path[0..0] == '@' and # @listfile.txt
130
+ File.file?(path[1..-1]) # listfile.txt is a file
131
+ IO.read(path[1..-1]).split
132
+ else
133
+ path
134
+ end
135
+ end.flatten.uniq
136
+ remove_excluded_files_from(potential_feature_files)
137
+ potential_feature_files
138
+ end
139
+
140
+ def feature_dirs
141
+ paths.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
142
+ end
143
+
144
+ def log
145
+ logger = Logger.new(@out_stream)
146
+ logger.formatter = LogFormatter.new
147
+ logger.level = Logger::INFO
148
+ logger.level = Logger::DEBUG if self.verbose?
149
+ logger
150
+ end
151
+
152
+ private
153
+
154
+ class LogFormatter < ::Logger::Formatter
155
+ def call(severity, time, progname, msg)
156
+ msg
157
+ end
158
+ end
159
+
160
+ def paths
161
+ @options[:paths].empty? ? ['features'] : @options[:paths]
162
+ end
163
+
164
+ def set_environment_variables
165
+ @options[:env_vars].each do |var, value|
166
+ ENV[var] = value
167
+ end
168
+ end
169
+
170
+ def arrange_formats
171
+ @options[:formats] << ['pretty', @out_stream] if @options[:formats].empty?
172
+ @options[:formats] = @options[:formats].sort_by{|f| f[1] == @out_stream ? -1 : 1}
173
+ streams = @options[:formats].map { |(_, stream)| stream }
174
+ if streams != streams.uniq
175
+ raise "All but one formatter must use --out, only one can print to each stream (or STDOUT)"
176
+ end
177
+ end
178
+
179
+ def remove_excluded_files_from(files)
180
+ files.reject! {|path| @options[:excludes].detect {|pattern| path =~ pattern } }
181
+ end
182
+
183
+ def require_dirs
184
+ feature_dirs + Dir['vendor/{gems,plugins}/*/cucumber']
185
+ end
186
+
187
+ end
188
+
189
+ end
190
+ end
@@ -0,0 +1,26 @@
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
+ DRb.start_service("druby://localhost:0")
17
+ feature_server = DRbObject.new_with_uri("druby://127.0.0.1:#{port}")
18
+ 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
19
+ args.each { |arg| cloned_args << arg }
20
+ feature_server.run(cloned_args, error_stream, out_stream)
21
+ rescue DRb::DRbConnError => e
22
+ raise DRbClientError, "No DRb server is running."
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,61 @@
1
+ require 'cucumber/formatter/pretty'
2
+ require 'cucumber/parser/natural_language'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ class LanguageHelpFormatter < Formatter::Pretty
7
+ INCOMPLETE = %{
8
+ The Cucumber grammar has evolved since this translation was written.
9
+ Please help us complete the translation by translating the missing words in
10
+
11
+ #{Cucumber::LANGUAGE_FILE}
12
+
13
+ Then contribute back to the Cucumber project. Details here:
14
+ http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
15
+ }
16
+
17
+ def self.list_languages(io)
18
+ raw = Cucumber::LANGUAGES.keys.sort.map do |lang|
19
+ [lang, Cucumber::LANGUAGES[lang]['name'], Cucumber::LANGUAGES[lang]['native']]
20
+ end
21
+ table = Ast::Table.new(raw)
22
+ new(nil, io, {:check_lang=>true}).visit_multiline_arg(table)
23
+ end
24
+
25
+ def self.list_keywords(io, lang)
26
+ language = Parser::NaturalLanguage.get(nil, lang)
27
+ raw = Parser::NaturalLanguage::KEYWORD_KEYS.map do |key|
28
+ [key, language.keywords(key)]
29
+ end
30
+ table = Ast::Table.new(raw)
31
+ new(nil, io, {:incomplete => language.incomplete?}).visit_multiline_arg(table)
32
+ end
33
+
34
+ def visit_multiline_arg(table)
35
+ if @options[:incomplete]
36
+ @io.puts(format_string(INCOMPLETE, :failed))
37
+ end
38
+ super
39
+ end
40
+
41
+ def visit_table_row(table_row)
42
+ @col = 1
43
+ super
44
+ end
45
+
46
+ def visit_table_cell_value(value, status)
47
+ if @col == 1
48
+ if(@options[:check_lang])
49
+ @incomplete = Parser::NaturalLanguage.get(nil, value).incomplete?
50
+ end
51
+ status = :comment
52
+ elsif @incomplete
53
+ status = :undefined
54
+ end
55
+
56
+ @col += 1
57
+ super(value, status)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -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