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,20 @@
1
+ module Cucumber
2
+ # Only used for keeping track of available and invoked step definitions
3
+ # in a way that also works for other programming languages (i.e. cuke4duke)
4
+ # Used for reporting purposes only (usage formatter).
5
+ class StepDefinitionLight
6
+ attr_reader :regexp_source, :file_colon_line
7
+
8
+ def initialize(regexp_source, file_colon_line)
9
+ @regexp_source, @file_colon_line = regexp_source, file_colon_line
10
+ end
11
+
12
+ def eql?(o)
13
+ regexp_source == o.regexp_source && file_colon_line == o.file_colon_line
14
+ end
15
+
16
+ def hash
17
+ regexp_source.hash + 31*file_colon_line.hash
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,107 @@
1
+ module Cucumber
2
+ class StepMatch #:nodoc:
3
+ attr_reader :step_definition
4
+
5
+ # Creates a new StepMatch. The +name_to_report+ argument is what's reported, unless it's is,
6
+ # in which case +name_to_report+ is used instead.
7
+ #
8
+ def initialize(step_definition, name_to_match, name_to_report, step_arguments)
9
+ raise "name_to_match can't be nil" if name_to_match.nil?
10
+ @step_definition, @name_to_match, @name_to_report, @step_arguments = step_definition, name_to_match, name_to_report, step_arguments
11
+ end
12
+
13
+ def args
14
+ @step_arguments.map{|g| g.val}
15
+ end
16
+
17
+ def name
18
+ @name_to_report
19
+ end
20
+
21
+ def invoke(multiline_arg)
22
+ all_args = args
23
+ all_args << multiline_arg.dup if multiline_arg
24
+ @step_definition.invoke(all_args)
25
+ end
26
+
27
+ # Formats the matched arguments of the associated Step. This method
28
+ # is usually called from visitors, which render output.
29
+ #
30
+ # The +format+ can either be a String or a Proc.
31
+ #
32
+ # If it is a String it should be a format string according to
33
+ # <tt>Kernel#sprinf</tt>, for example:
34
+ #
35
+ # '<span class="param">%s</span></tt>'
36
+ #
37
+ # If it is a Proc, it should take one argument and return the formatted
38
+ # argument, for example:
39
+ #
40
+ # lambda { |param| "[#{param}]" }
41
+ #
42
+ def format_args(format = lambda{|a| a}, &proc)
43
+ @name_to_report || replace_arguments(@name_to_match, @step_arguments, format, &proc)
44
+ end
45
+
46
+ def file_colon_line
47
+ @step_definition.file_colon_line
48
+ end
49
+
50
+ def backtrace_line
51
+ "#{file_colon_line}:in `#{@step_definition.regexp_source}'"
52
+ end
53
+
54
+ def text_length
55
+ @step_definition.regexp_source.jlength
56
+ end
57
+
58
+ def replace_arguments(string, step_arguments, format, &proc)
59
+ s = string.dup
60
+ offset = 0
61
+ step_arguments.each do |step_argument|
62
+ next if step_argument.pos.nil?
63
+ replacement = if block_given?
64
+ proc.call(step_argument.val)
65
+ elsif Proc === format
66
+ format.call(step_argument.val)
67
+ else
68
+ format % step_argument.val
69
+ end
70
+
71
+ s[step_argument.pos + offset, step_argument.val.length] = replacement
72
+ offset += replacement.jlength - step_argument.val.jlength
73
+ end
74
+ s
75
+ end
76
+
77
+ def inspect #:nodoc:
78
+ sprintf("#<%s:0x%x>", self.class, self.object_id)
79
+ end
80
+ end
81
+
82
+ class NoStepMatch #:nodoc:
83
+ attr_reader :step_definition, :name
84
+
85
+ def initialize(step, name)
86
+ @step = step
87
+ @name = name
88
+ end
89
+
90
+ def format_args(format)
91
+ @name
92
+ end
93
+
94
+ def file_colon_line
95
+ raise "No file:line for #{@step}" unless @step.file_colon_line
96
+ @step.file_colon_line
97
+ end
98
+
99
+ def backtrace_line
100
+ @step.backtrace_line
101
+ end
102
+
103
+ def text_length
104
+ @step.text_length
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,350 @@
1
+ require 'cucumber/constantize'
2
+ require 'cucumber/core_ext/instance_exec'
3
+ require 'cucumber/parser/natural_language'
4
+ require 'cucumber/language_support/language_methods'
5
+ require 'cucumber/formatter/duration'
6
+
7
+ module Cucumber
8
+ # Raised when there is no matching StepDefinition for a step.
9
+ class Undefined < StandardError
10
+ attr_reader :step_name
11
+
12
+ def initialize(step_name)
13
+ super %{Undefined step: "#{step_name}"}
14
+ @step_name = step_name
15
+ end
16
+
17
+ def nested!
18
+ @nested = true
19
+ end
20
+
21
+ def nested?
22
+ @nested
23
+ end
24
+ end
25
+
26
+ # Raised when a StepDefinition's block invokes World#pending
27
+ class Pending < StandardError
28
+ end
29
+
30
+ # Raised when a step matches 2 or more StepDefinitions
31
+ class Ambiguous < StandardError
32
+ def initialize(step_name, step_definitions, used_guess)
33
+ message = "Ambiguous match of \"#{step_name}\":\n\n"
34
+ message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
35
+ message << "\n\n"
36
+ message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
37
+ super(message)
38
+ end
39
+ end
40
+
41
+ # This is the meaty part of Cucumber that ties everything together.
42
+ class StepMother
43
+ include Constantize
44
+ include Formatter::Duration
45
+ attr_writer :options, :visitor, :log
46
+
47
+ def initialize
48
+ @unsupported_programming_languages = []
49
+ @programming_languages = []
50
+ @language_map = {}
51
+ load_natural_language('en')
52
+ @current_scenario = nil
53
+ end
54
+
55
+ def load_plain_text_features(feature_files)
56
+ features = Ast::Features.new
57
+
58
+ start = Time.new
59
+ log.debug("Features:\n")
60
+ feature_files.each do |f|
61
+ feature_file = FeatureFile.new(f)
62
+ feature = feature_file.parse(self, options)
63
+ if feature
64
+ features.add_feature(feature)
65
+ log.debug(" * #{f}\n")
66
+ end
67
+ end
68
+ duration = Time.now - start
69
+ log.debug("Parsing feature files took #{format_duration(duration)}\n\n")
70
+ features
71
+ end
72
+
73
+ def load_code_files(step_def_files)
74
+ log.debug("Code:\n")
75
+ step_def_files.each do |step_def_file|
76
+ load_code_file(step_def_file)
77
+ end
78
+ log.debug("\n")
79
+ end
80
+
81
+ def load_code_file(step_def_file)
82
+ if programming_language = programming_language_for(step_def_file)
83
+ log.debug(" * #{step_def_file}\n")
84
+ programming_language.load_code_file(step_def_file)
85
+ else
86
+ log.debug(" * #{step_def_file} [NOT SUPPORTED]\n")
87
+ end
88
+ end
89
+
90
+ # Loads and registers programming language implementation.
91
+ # Instances are cached, so calling with the same argument
92
+ # twice will return the same instance.
93
+ #
94
+ def load_programming_language(ext)
95
+ return @language_map[ext] if @language_map[ext]
96
+ programming_language_class = constantize("Cucumber::#{ext.capitalize}Support::#{ext.capitalize}Language")
97
+ programming_language = programming_language_class.new(self)
98
+ programming_language.alias_adverbs(@adverbs || [])
99
+ @programming_languages << programming_language
100
+ @language_map[ext] = programming_language
101
+ programming_language
102
+ end
103
+
104
+ # Loads a natural language. This has the effect of aliasing
105
+ # Step Definition keywords for all of the registered programming
106
+ # languages (if they support aliasing). See #load_programming_language
107
+ #
108
+ def load_natural_language(lang)
109
+ Parser::NaturalLanguage.get(self, lang)
110
+ end
111
+
112
+ # Returns the options passed on the command line.
113
+ def options
114
+ @options ||= {}
115
+ end
116
+
117
+ def step_visited(step) #:nodoc:
118
+ steps << step unless steps.index(step)
119
+ end
120
+
121
+ def steps(status = nil) #:nodoc:
122
+ @steps ||= []
123
+ if(status)
124
+ @steps.select{|step| step.status == status}
125
+ else
126
+ @steps
127
+ end
128
+ end
129
+
130
+ # Output +announcement+ alongside the formatted output.
131
+ # This is an alternative to using Kernel#puts - it will display
132
+ # nicer, and in all outputs (in case you use several formatters)
133
+ #
134
+ # Beware that the output will be printed *before* the corresponding
135
+ # step. This is because the step itself will not be printed until
136
+ # after it has run, so it can be coloured according to its status.
137
+ #
138
+ def announce(msg)
139
+ @visitor.announce(msg)
140
+ end
141
+
142
+ # Embed +file+ of MIME type +mime_type+ into the output. This may or may
143
+ # not be ignored, depending on what kind of formatter(s) are active.
144
+ #
145
+ def embed(file, mime_type)
146
+ @visitor.embed(file, mime_type)
147
+ end
148
+
149
+ def scenarios(status = nil) #:nodoc:
150
+ @scenarios ||= []
151
+ if(status)
152
+ @scenarios.select{|scenario| scenario.status == status}
153
+ else
154
+ @scenarios
155
+ end
156
+ end
157
+
158
+ def invoke(step_name, multiline_argument=nil)
159
+ begin
160
+ step_match(step_name).invoke(multiline_argument)
161
+ rescue Exception => e
162
+ e.nested! if Undefined === e
163
+ raise e
164
+ end
165
+ end
166
+
167
+ # Invokes a series of steps +steps_text+. Example:
168
+ #
169
+ # invoke(%Q{
170
+ # Given I have 8 cukes in my belly
171
+ # Then I should not be thirsty
172
+ # })
173
+ def invoke_steps(steps_text, natural_language)
174
+ ored_keywords = natural_language.step_keywords.map{|kw| Regexp.escape(kw)}.join("|")
175
+ # TODO Gherkin:
176
+ # This a bit hacky and fragile. When we move to Gherkin we should replace this entire method body
177
+ # with a call to the parser - parsing the body of a scenario. We may need to put the parser/policy in the
178
+ # appropriate state (the same state it's in after parsing a Scenario: line).
179
+ steps_text.strip.split(/(?=^\s*(?:#{ored_keywords}))/).map { |step| step.strip }.each do |step|
180
+ output = step.match(/^\s*(#{ored_keywords})([^\n]+)(\n.*)?$/m)
181
+
182
+ action, step_name, table_or_string = output[1], output[2], output[3]
183
+ if table_or_string.to_s.strip =~ /^\|/
184
+ table_or_string = table(table_or_string)
185
+ elsif table_or_string.to_s.strip =~ /^"""/
186
+ table_or_string = py_string(table_or_string.gsub(/^\n/, ""))
187
+ end
188
+ args = [step_name, table_or_string].compact
189
+ invoke(*args)
190
+ end
191
+ end
192
+
193
+ # Returns a Cucumber::Ast::Table for +text_or_table+, which can either
194
+ # be a String:
195
+ #
196
+ # table(%{
197
+ # | account | description | amount |
198
+ # | INT-100 | Taxi | 114 |
199
+ # | CUC-101 | Peeler | 22 |
200
+ # })
201
+ #
202
+ # or a 2D Array:
203
+ #
204
+ # table([
205
+ # %w{ account description amount },
206
+ # %w{ INT-100 Taxi 114 },
207
+ # %w{ CUC-101 Peeler 22 }
208
+ # ])
209
+ #
210
+ def table(text_or_table, file=nil, line_offset=0)
211
+ if Array === text_or_table
212
+ Ast::Table.new(text_or_table)
213
+ else
214
+ @table_parser ||= Parser::TableParser.new
215
+ @table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
216
+ end
217
+ end
218
+
219
+ # Returns a regular String for +string_with_triple_quotes+. Example:
220
+ #
221
+ # """
222
+ # hello
223
+ # world
224
+ # """
225
+ #
226
+ # Is retured as: " hello\nworld"
227
+ #
228
+ def py_string(string_with_triple_quotes, file=nil, line_offset=0)
229
+ @py_string_parser ||= Parser::PyStringParser.new
230
+ @py_string_parser.parse_or_fail(string_with_triple_quotes, file, line_offset).to_s
231
+ end
232
+
233
+ def step_match(step_name, name_to_report=nil) #:nodoc:
234
+ matches = @programming_languages.map do |programming_language|
235
+ programming_language.step_matches(step_name, name_to_report)
236
+ end.flatten
237
+ raise Undefined.new(step_name) if matches.empty?
238
+ matches = best_matches(step_name, matches) if matches.size > 1 && options[:guess]
239
+ raise Ambiguous.new(step_name, matches, options[:guess]) if matches.size > 1
240
+ matches[0]
241
+ end
242
+
243
+ def best_matches(step_name, step_matches) #:nodoc:
244
+ no_groups = step_matches.select {|step_match| step_match.args.length == 0}
245
+ max_arg_length = step_matches.map {|step_match| step_match.args.length }.max
246
+ top_groups = step_matches.select {|step_match| step_match.args.length == max_arg_length }
247
+
248
+ if no_groups.any?
249
+ longest_regexp_length = no_groups.map {|step_match| step_match.text_length }.max
250
+ no_groups.select {|step_match| step_match.text_length == longest_regexp_length }
251
+ elsif top_groups.any?
252
+ shortest_capture_length = top_groups.map {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } }.min
253
+ top_groups.select {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } == shortest_capture_length }
254
+ else
255
+ top_groups
256
+ end
257
+ end
258
+
259
+ def unmatched_step_definitions
260
+ @programming_languages.map do |programming_language|
261
+ programming_language.unmatched_step_definitions
262
+ end.flatten
263
+ end
264
+
265
+ def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
266
+ load_programming_language('rb') if unknown_programming_language?
267
+ @programming_languages.map do |programming_language|
268
+ programming_language.snippet_text(step_keyword, step_name, multiline_arg_class)
269
+ end.join("\n")
270
+ end
271
+
272
+ def unknown_programming_language?
273
+ @programming_languages.empty?
274
+ end
275
+
276
+ def before_and_after(scenario, skip_hooks=false) #:nodoc:
277
+ before(scenario) unless skip_hooks
278
+ yield scenario
279
+ after(scenario) unless skip_hooks
280
+ scenario_visited(scenario)
281
+ end
282
+
283
+ def register_adverbs(adverbs) #:nodoc:
284
+ @adverbs ||= []
285
+ @adverbs += adverbs
286
+ @adverbs.uniq!
287
+ @programming_languages.each do |programming_language|
288
+ programming_language.alias_adverbs(@adverbs)
289
+ end
290
+ end
291
+
292
+ def before(scenario) #:nodoc:
293
+ return if options[:dry_run] || @current_scenario
294
+ @current_scenario = scenario
295
+ @programming_languages.each do |programming_language|
296
+ programming_language.before(scenario)
297
+ end
298
+ end
299
+
300
+ def after(scenario) #:nodoc:
301
+ @current_scenario = nil
302
+ return if options[:dry_run]
303
+ @programming_languages.each do |programming_language|
304
+ programming_language.after(scenario)
305
+ end
306
+ end
307
+
308
+ def after_step #:nodoc:
309
+ return if options[:dry_run]
310
+ @programming_languages.each do |programming_language|
311
+ programming_language.execute_after_step(@current_scenario)
312
+ end
313
+ end
314
+
315
+ def after_configuration(configuration) #:nodoc
316
+ @programming_languages.each do |programming_language|
317
+ programming_language.after_configuration(configuration)
318
+ end
319
+ end
320
+
321
+ private
322
+
323
+ def programming_language_for(step_def_file) #:nodoc:
324
+ if ext = File.extname(step_def_file)[1..-1]
325
+ return nil if @unsupported_programming_languages.index(ext)
326
+ begin
327
+ load_programming_language(ext)
328
+ rescue LoadError => e
329
+ log.debug("Failed to load '#{ext}' programming language for file #{step_def_file}: #{e.message}\n")
330
+ @unsupported_programming_languages << ext
331
+ nil
332
+ end
333
+ else
334
+ nil
335
+ end
336
+ end
337
+
338
+ def max_step_definition_length #:nodoc:
339
+ @max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
340
+ end
341
+
342
+ def scenario_visited(scenario) #:nodoc:
343
+ scenarios << scenario unless scenarios.index(scenario)
344
+ end
345
+
346
+ def log
347
+ @log ||= Logger.new(STDOUT)
348
+ end
349
+ end
350
+ end