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,75 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'cucumber/formatter/io'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # The formatter used for <tt>--format progress</tt>
7
+ class Progress
8
+ include Console
9
+ include Io
10
+ attr_reader :step_mother
11
+
12
+ def initialize(step_mother, path_or_io, options)
13
+ @step_mother, @io, @options = step_mother, ensure_io(path_or_io, "progress"), options
14
+ end
15
+
16
+ def after_features(features)
17
+ @io.puts
18
+ @io.puts
19
+ print_summary(features)
20
+ end
21
+
22
+ def before_feature_element(feature_element)
23
+ record_tag_occurrences(feature_element, @options)
24
+ end
25
+
26
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
27
+ progress(status)
28
+ @status = status
29
+ end
30
+
31
+ def before_outline_table(outline_table)
32
+ @outline_table = outline_table
33
+ end
34
+
35
+ def after_outline_table(outline_table)
36
+ @outline_table = nil
37
+ end
38
+
39
+ def table_cell_value(value, status)
40
+ return unless @outline_table
41
+ status ||= @status
42
+ progress(status) unless table_header_cell?(status)
43
+ end
44
+
45
+ private
46
+
47
+ def print_summary(features)
48
+ print_steps(:pending)
49
+ print_steps(:failed)
50
+ print_stats(features)
51
+ print_snippets(@options)
52
+ print_passing_wip(@options)
53
+ print_tag_limit_warnings(@options)
54
+ end
55
+
56
+ CHARS = {
57
+ :passed => '.',
58
+ :failed => 'F',
59
+ :undefined => 'U',
60
+ :pending => 'P',
61
+ :skipped => '-'
62
+ }
63
+
64
+ def progress(status)
65
+ char = CHARS[status]
66
+ @io.print(format_string(char, status))
67
+ @io.flush
68
+ end
69
+
70
+ def table_header_cell?(status)
71
+ status == :skipped_param
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,50 @@
1
+ module Cucumber
2
+ module Formatter
3
+ # The formatter used for <tt>--format rerun</tt>
4
+ #
5
+ # This formatter keeps track of all failing features and print out their location.
6
+ # Example:
7
+ #
8
+ # features/foo.feature:34 features/bar.feature:11:76:81
9
+ #
10
+ # This formatter is used by AutoTest - it will use the output to decide what
11
+ # to run the next time, simply passing the output string on the command line.
12
+ #
13
+ class Rerun
14
+ include Io
15
+
16
+ def initialize(step_mother, path_or_io, options)
17
+ @io = ensure_io(path_or_io, "rerun")
18
+ @options = options
19
+ @file_names = []
20
+ @file_colon_lines = Hash.new{|h,k| h[k] = []}
21
+ end
22
+
23
+ # features() is never executed at all... ?
24
+ def after_features(features)
25
+ files = @file_names.uniq.map do |file|
26
+ lines = @file_colon_lines[file]
27
+ "#{file}:#{lines.join(':')}"
28
+ end
29
+ @io.puts files.join(' ')
30
+
31
+ # Flusing output to rerun tempfile here...
32
+ @io.flush
33
+ @io.close
34
+ end
35
+
36
+ # feature_element() is never executed at all, either... ?
37
+ def after_feature_element(feature_element)
38
+ if feature_element.failed?
39
+ file, line = *feature_element.file_colon_line.split(':')
40
+ @file_colon_lines[file] << line
41
+ @file_names << file
42
+ end
43
+ end
44
+
45
+ def step_name(keyword, step_match, status, source_indent, background)
46
+ @rerun = true if [:failed].index(status)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ require 'cucumber/formatter/usage'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ class Stepdefs < Usage
6
+ def print_steps(stepdef_key)
7
+ end
8
+
9
+ def max_step_length
10
+ 0
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,49 @@
1
+ module Cucumber
2
+ module Formatter
3
+ # The formatter used for <tt>--format steps</tt>
4
+ class Steps
5
+
6
+ def initialize(step_mother, path_or_io, options)
7
+ @io = ensure_io(path_or_io, "steps")
8
+ @options = options
9
+ @step_definition_files = collect_steps(step_mother)
10
+ end
11
+
12
+ def after_features(features)
13
+ print_summary
14
+ end
15
+
16
+ private
17
+
18
+ def print_summary
19
+ count = 0
20
+ @step_definition_files.keys.sort.each do |step_definition_file|
21
+ @io.puts step_definition_file
22
+
23
+ sources = @step_definition_files[step_definition_file]
24
+ source_indent = source_indent(sources)
25
+ sources.sort.each do |file_colon_line, regexp_source|
26
+ @io.print regexp_source.indent(2)
27
+ @io.print " # #{file_colon_line}".indent(source_indent - regexp_source.jlength)
28
+ @io.puts
29
+ end
30
+ @io.puts
31
+ count += sources.size
32
+ end
33
+ @io.puts "#{count} step definition(s) in #{@step_definition_files.size} source file(s)."
34
+ end
35
+
36
+ def collect_steps(step_mother)
37
+ step_mother.step_definitions.inject({}) do |step_definitions, step_definition|
38
+ step_definitions[step_definition.file] ||= []
39
+ step_definitions[step_definition.file] << [ step_definition.file_colon_line, step_definition.regexp_source ]
40
+ step_definitions
41
+ end
42
+ end
43
+
44
+ def source_indent(sources)
45
+ sources.map { |file_colon_line, regexp| regexp.size }.max + 1
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,35 @@
1
+ module Cucumber
2
+ module Formatter
3
+ module Summary
4
+
5
+ def scenario_summary(step_mother, &block)
6
+ scenarios_proc = lambda{|status| step_mother.scenarios(status)}
7
+ dump_count(step_mother.scenarios.length, "scenario") + dump_status_counts(scenarios_proc, &block)
8
+ end
9
+
10
+ def step_summary(step_mother, &block)
11
+ steps_proc = lambda{|status| step_mother.steps(status)}
12
+ dump_count(step_mother.steps.length, "step") + dump_status_counts(steps_proc, &block)
13
+ end
14
+
15
+ private
16
+
17
+ def dump_status_counts(find_elements_proc)
18
+ counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
19
+ elements = find_elements_proc.call(status)
20
+ elements.any? ? yield("#{elements.length} #{status.to_s}", status) : nil
21
+ end.compact
22
+ if counts.any?
23
+ " (#{counts.join(', ')})"
24
+ else
25
+ ""
26
+ end
27
+ end
28
+
29
+ def dump_count(count, what, state=nil)
30
+ [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ require 'cucumber/formatter/io'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ # The formatter used for <tt>--format tag_cloud</tt>
6
+ # Custom formatter that prints a tag cloud as a table.
7
+ class TagCloud
8
+ include Io
9
+
10
+ def initialize(step_mother, path_or_io, options)
11
+ @io = ensure_io(path_or_io, "tag_cloud")
12
+ @options = options
13
+ @counts = Hash.new{|h,k| h[k] = 0}
14
+ end
15
+
16
+ def after_features(features)
17
+ print_summary(features)
18
+ end
19
+
20
+ def tag_name(tag_name)
21
+ @counts[tag_name] += 1
22
+ end
23
+
24
+ private
25
+
26
+ def print_summary(features)
27
+ matrix = @counts.to_a.sort{|paira, pairb| paira[0] <=> pairb[0]}.transpose
28
+ table = Cucumber::Ast::Table.new(matrix)
29
+ formatter = Cucumber::Formatter::Pretty.new(@step_mother, @io, {})
30
+ Cucumber::Ast::TreeWalker.new(@step_mother, [formatter], {}).visit_multiline_arg(table)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ # Require this file if you need Unicode support.
2
+ require 'cucumber/platform'
3
+ require 'cucumber/formatter/ansicolor'
4
+
5
+ $KCODE='u' unless Cucumber::RUBY_1_9
6
+
7
+ if Cucumber::WINDOWS_MRI && `chcp` =~ /(\d+)/
8
+ codepage = $1.to_i
9
+ codepages = (1251..1252)
10
+
11
+ if codepages.include?(codepage)
12
+ Cucumber::CODEPAGE = "cp#{codepage}"
13
+
14
+ require 'iconv'
15
+ module Kernel #:nodoc:
16
+ alias cucumber_print print
17
+ def print(*a)
18
+ begin
19
+ cucumber_print(*Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a))
20
+ rescue Iconv::IllegalSequence
21
+ cucumber_print(*a)
22
+ end
23
+ end
24
+
25
+ alias cucumber_puts puts
26
+ def puts(*a)
27
+ begin
28
+ cucumber_puts(*Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a))
29
+ rescue Iconv::IllegalSequence
30
+ cucumber_puts(*a)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,127 @@
1
+ require 'cucumber/formatter/progress'
2
+ require 'cucumber/step_definition_light'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ class Usage < Progress
7
+ include Console
8
+
9
+ class StepDefKey < StepDefinitionLight
10
+ attr_accessor :mean_duration, :status
11
+ end
12
+
13
+ def initialize(step_mother, path_or_io, options)
14
+ @step_mother = step_mother
15
+ @io = ensure_io(path_or_io, "usage")
16
+ @options = options
17
+ @stepdef_to_match = Hash.new{|h,stepdef_key| h[stepdef_key] = []}
18
+ end
19
+
20
+ def before_step(step)
21
+ @step = step
22
+ @start_time = Time.now
23
+ end
24
+
25
+ def before_step_result(*args)
26
+ @duration = Time.now - @start_time
27
+ end
28
+
29
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
30
+ if step_match.name.nil? # nil if it's from a scenario outline
31
+ stepdef_key = StepDefKey.new(step_match.step_definition.regexp_source, step_match.step_definition.file_colon_line)
32
+
33
+ @stepdef_to_match[stepdef_key] << {
34
+ :keyword => keyword,
35
+ :step_match => step_match,
36
+ :status => status,
37
+ :file_colon_line => @step.file_colon_line,
38
+ :duration => @duration
39
+ }
40
+ end
41
+ super
42
+ end
43
+
44
+ def print_summary(features)
45
+ add_unused_stepdefs
46
+ aggregate_info
47
+
48
+ if @options[:dry_run]
49
+ keys = @stepdef_to_match.keys.sort {|a,b| a.regexp_source <=> b.regexp_source}
50
+ else
51
+ keys = @stepdef_to_match.keys.sort {|a,b| a.mean_duration <=> b.mean_duration}.reverse
52
+ end
53
+
54
+ keys.each do |stepdef_key|
55
+ print_step_definition(stepdef_key)
56
+
57
+ if @stepdef_to_match[stepdef_key].any?
58
+ print_steps(stepdef_key)
59
+ else
60
+ @io.puts(" " + format_string("NOT MATCHED BY ANY STEPS", :failed))
61
+ end
62
+ end
63
+ @io.puts
64
+ super
65
+ end
66
+
67
+ def print_step_definition(stepdef_key)
68
+ @io.print format_string(sprintf("%.7f", stepdef_key.mean_duration), :skipped) + " " unless @options[:dry_run]
69
+ @io.print format_string(stepdef_key.regexp_source, stepdef_key.status)
70
+ if @options[:source]
71
+ indent = max_length - stepdef_key.regexp_source.jlength
72
+ line_comment = " # #{stepdef_key.file_colon_line}".indent(indent)
73
+ @io.print(format_string(line_comment, :comment))
74
+ end
75
+ @io.puts
76
+ end
77
+
78
+ def print_steps(stepdef_key)
79
+ @stepdef_to_match[stepdef_key].each do |step|
80
+ @io.print " "
81
+ @io.print format_string(sprintf("%.7f", step[:duration]), :skipped) + " " unless @options[:dry_run]
82
+ @io.print format_step(step[:keyword], step[:step_match], step[:status], nil)
83
+ if @options[:source]
84
+ indent = max_length - (step[:keyword].jlength + step[:step_match].format_args.jlength)
85
+ line_comment = " # #{step[:file_colon_line]}".indent(indent)
86
+ @io.print(format_string(line_comment, :comment))
87
+ end
88
+ @io.puts
89
+ end
90
+ end
91
+
92
+ def max_length
93
+ [max_stepdef_length, max_step_length].compact.max
94
+ end
95
+
96
+ def max_stepdef_length
97
+ @stepdef_to_match.keys.flatten.map{|key| key.regexp_source.jlength}.max
98
+ end
99
+
100
+ def max_step_length
101
+ @stepdef_to_match.values.flatten.map do |step|
102
+ step[:keyword].jlength + step[:step_match].format_args.jlength
103
+ end.max
104
+ end
105
+
106
+ def aggregate_info
107
+ @stepdef_to_match.each do |key, steps|
108
+ if steps.empty?
109
+ key.status = :skipped
110
+ key.mean_duration = 0
111
+ else
112
+ key.status = Ast::StepInvocation.worst_status(steps.map{|step| step[:status]})
113
+ total_duration = steps.inject(0) {|sum, step| step[:duration] + sum}
114
+ key.mean_duration = total_duration / steps.length
115
+ end
116
+ end
117
+ end
118
+
119
+ def add_unused_stepdefs
120
+ @step_mother.unmatched_step_definitions.each do |step_definition|
121
+ stepdef_key = StepDefKey.new(step_definition.regexp_source, step_definition.file_colon_line)
122
+ @stepdef_to_match[stepdef_key] = []
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,30 @@
1
+ module Cucumber
2
+ # This module defines the API for programming panguage support in Cucumber.
3
+ # While Cucumber itself is written in Ruby, any programming language can
4
+ # be supported by implementing this API.
5
+ #
6
+ # For the sake of illustration we'll consider an imaginary language called
7
+ # _why. _why files have the .why extension, so we need to put support for
8
+ # this language in the <tt>Cucumber::WhySupport::WhyLanguage</tt>. This
9
+ # class must be defined in a file called <tt>cucumber/why_support/why_language.rb</tt>
10
+ # and be available on Ruby's <tt>$LOAD_PATH</tt>:
11
+ #
12
+ # module Cucumber
13
+ # module WhySupport
14
+ # class WhyLanguage
15
+ #
16
+ # # Uses whatever available language bridge to load
17
+ # # +why_file+ and returns an Array of StepDefinition.
18
+ # def load_code_file(why_file)
19
+ # end
20
+ # end
21
+ # end
22
+ # end
23
+ #
24
+ # Each language implementation manages its own hooks, and must execute them
25
+ # at appropriate times.
26
+ #
27
+ #
28
+ module LanguageSupport
29
+ end
30
+ end