stefl-cucumber 0.10.1

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 (538) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +7 -0
  5. data/History.txt +1613 -0
  6. data/LICENSE +22 -0
  7. data/README.rdoc +26 -0
  8. data/Rakefile +12 -0
  9. data/bin/cucumber +22 -0
  10. data/cucumber.gemspec +50 -0
  11. data/cucumber.yml +20 -0
  12. data/examples/i18n/README.textile +18 -0
  13. data/examples/i18n/Rakefile +33 -0
  14. data/examples/i18n/ar/Rakefile +6 -0
  15. data/examples/i18n/ar/features/addition.feature +17 -0
  16. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  17. data/examples/i18n/ar/lib/calculator.rb +11 -0
  18. data/examples/i18n/bg/Rakefile +6 -0
  19. data/examples/i18n/bg/features/addition.feature +12 -0
  20. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  21. data/examples/i18n/bg/features/division.feature +17 -0
  22. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/bg/features/support/env.rb +5 -0
  24. data/examples/i18n/bg/features/support/world.rb +8 -0
  25. data/examples/i18n/bg/lib/calculator.rb +24 -0
  26. data/examples/i18n/ca/Rakefile +6 -0
  27. data/examples/i18n/ca/features/step_definitons/calculator_steps.rb +21 -0
  28. data/examples/i18n/ca/features/suma.feature +17 -0
  29. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  30. data/examples/i18n/da/Rakefile +6 -0
  31. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  32. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  33. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  34. data/examples/i18n/de/.gitignore +1 -0
  35. data/examples/i18n/de/Rakefile +6 -0
  36. data/examples/i18n/de/features/addition.feature +17 -0
  37. data/examples/i18n/de/features/division.feature +10 -0
  38. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  39. data/examples/i18n/de/lib/calculator.rb +14 -0
  40. data/examples/i18n/en-lol/Rakefile +4 -0
  41. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  42. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  43. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  44. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  45. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  46. data/examples/i18n/en/.gitignore +1 -0
  47. data/examples/i18n/en/Rakefile +6 -0
  48. data/examples/i18n/en/features/addition.feature +17 -0
  49. data/examples/i18n/en/features/division.feature +10 -0
  50. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  51. data/examples/i18n/en/lib/calculator.rb +14 -0
  52. data/examples/i18n/eo/.gitignore +1 -0
  53. data/examples/i18n/eo/Rakefile +6 -0
  54. data/examples/i18n/eo/features/adicio.feature +17 -0
  55. data/examples/i18n/eo/features/divido.feature +10 -0
  56. data/examples/i18n/eo/features/step_definitons/calculator_steps.rb +24 -0
  57. data/examples/i18n/eo/lib/calculator.rb +14 -0
  58. data/examples/i18n/es/Rakefile +6 -0
  59. data/examples/i18n/es/features/adicion.feature +17 -0
  60. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  61. data/examples/i18n/es/lib/calculador.rb +14 -0
  62. data/examples/i18n/et/Rakefile +6 -0
  63. data/examples/i18n/et/features/jagamine.feature +10 -0
  64. data/examples/i18n/et/features/liitmine.feature +17 -0
  65. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  66. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  67. data/examples/i18n/fi/.gitignore +1 -0
  68. data/examples/i18n/fi/Rakefile +6 -0
  69. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  70. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  71. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  72. data/examples/i18n/fi/lib/laskin.rb +14 -0
  73. data/examples/i18n/fr/Rakefile +6 -0
  74. data/examples/i18n/fr/features/addition.feature +18 -0
  75. data/examples/i18n/fr/features/addition2.feature +17 -0
  76. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  77. data/examples/i18n/fr/features/support/env.rb +5 -0
  78. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  79. data/examples/i18n/he/Rakefile +6 -0
  80. data/examples/i18n/he/features/addition.feature +17 -0
  81. data/examples/i18n/he/features/division.feature +10 -0
  82. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  83. data/examples/i18n/he/lib/calculator.rb +15 -0
  84. data/examples/i18n/hu/.gitignore +1 -0
  85. data/examples/i18n/hu/Rakefile +6 -0
  86. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  87. data/examples/i18n/hu/features/osztas.feature +10 -0
  88. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  89. data/examples/i18n/hu/lib/calculator.rb +14 -0
  90. data/examples/i18n/id/.gitignore +1 -0
  91. data/examples/i18n/id/Rakefile +6 -0
  92. data/examples/i18n/id/features/addition.feature +17 -0
  93. data/examples/i18n/id/features/division.feature +10 -0
  94. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  95. data/examples/i18n/id/lib/calculator.rb +14 -0
  96. data/examples/i18n/it/Rakefile +6 -0
  97. data/examples/i18n/it/features/somma.feature +11 -0
  98. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  99. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  100. data/examples/i18n/ja/.gitignore +1 -0
  101. data/examples/i18n/ja/Rakefile +6 -0
  102. data/examples/i18n/ja/features/addition.feature +17 -0
  103. data/examples/i18n/ja/features/division.feature +10 -0
  104. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +19 -0
  105. data/examples/i18n/ja/features/support/env.rb +5 -0
  106. data/examples/i18n/ja/lib/calculator.rb +14 -0
  107. data/examples/i18n/ko/.gitignore +1 -0
  108. data/examples/i18n/ko/Rakefile +6 -0
  109. data/examples/i18n/ko/features/addition.feature +17 -0
  110. data/examples/i18n/ko/features/division.feature +11 -0
  111. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/ko/lib/calculator.rb +14 -0
  113. data/examples/i18n/lt/.gitignore +1 -0
  114. data/examples/i18n/lt/Rakefile +6 -0
  115. data/examples/i18n/lt/features/addition.feature +17 -0
  116. data/examples/i18n/lt/features/division.feature +10 -0
  117. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  118. data/examples/i18n/lt/lib/calculator.rb +14 -0
  119. data/examples/i18n/lv/Rakefile +6 -0
  120. data/examples/i18n/lv/features/addition.feature +17 -0
  121. data/examples/i18n/lv/features/division.feature +10 -0
  122. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  123. data/examples/i18n/lv/lib/calculator.rb +14 -0
  124. data/examples/i18n/no/Rakefile +6 -0
  125. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  126. data/examples/i18n/no/features/summering.feature +19 -0
  127. data/examples/i18n/no/features/support/env.rb +6 -0
  128. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  129. data/examples/i18n/pl/.gitignore +1 -0
  130. data/examples/i18n/pl/Rakefile +6 -0
  131. data/examples/i18n/pl/features/addition.feature +17 -0
  132. data/examples/i18n/pl/features/division.feature +10 -0
  133. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  134. data/examples/i18n/pl/features/support/env.rb +5 -0
  135. data/examples/i18n/pl/lib/calculator.rb +14 -0
  136. data/examples/i18n/pt/Rakefile +6 -0
  137. data/examples/i18n/pt/features/adicao.feature +11 -0
  138. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  139. data/examples/i18n/pt/features/support/env.rb +5 -0
  140. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  141. data/examples/i18n/ro/Rakefile +6 -0
  142. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  143. data/examples/i18n/ro/features/suma.feature +11 -0
  144. data/examples/i18n/ro/lib/calculator.rb +11 -0
  145. data/examples/i18n/ru/Rakefile +6 -0
  146. data/examples/i18n/ru/features/addition.feature +11 -0
  147. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  148. data/examples/i18n/ru/features/division.feature +16 -0
  149. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  150. data/examples/i18n/ru/features/support/env.rb +5 -0
  151. data/examples/i18n/ru/features/support/world.rb +8 -0
  152. data/examples/i18n/ru/lib/calculator.rb +24 -0
  153. data/examples/i18n/sk/.gitignore +1 -0
  154. data/examples/i18n/sk/Rakefile +6 -0
  155. data/examples/i18n/sk/features/addition.feature +17 -0
  156. data/examples/i18n/sk/features/division.feature +10 -0
  157. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/sk/lib/calculator.rb +14 -0
  159. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  160. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  161. data/examples/i18n/sr-Cyrl/features/step_definitons/calculator_steps.rb +20 -0
  162. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  163. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  164. data/examples/i18n/sr-Latn/Rakefile +6 -0
  165. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  166. data/examples/i18n/sr-Latn/features/step_definitons/calculator_steps.rb +24 -0
  167. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  168. data/examples/i18n/sv/Rakefile +6 -0
  169. data/examples/i18n/sv/features/step_definitons/kalkulator_steps.rb +24 -0
  170. data/examples/i18n/sv/features/summering.feature +18 -0
  171. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  172. data/examples/i18n/tr/.gitignore +1 -0
  173. data/examples/i18n/tr/Rakefile +6 -0
  174. data/examples/i18n/tr/features/bolme.feature +10 -0
  175. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  176. data/examples/i18n/tr/features/toplama.feature +18 -0
  177. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  178. data/examples/i18n/uk/Rakefile +6 -0
  179. data/examples/i18n/uk/features/addition.feature +11 -0
  180. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  181. data/examples/i18n/uk/features/division.feature +16 -0
  182. data/examples/i18n/uk/features/step_definitons/calculator_steps.rb +19 -0
  183. data/examples/i18n/uk/features/support/env.rb +5 -0
  184. data/examples/i18n/uk/features/support/world.rb +8 -0
  185. data/examples/i18n/uk/lib/calculator.rb +24 -0
  186. data/examples/i18n/uz/Rakefile +6 -0
  187. data/examples/i18n/uz/features/addition.feature +10 -0
  188. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  189. data/examples/i18n/uz/features/division.feature +17 -0
  190. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  191. data/examples/i18n/uz/features/support/env.rb +5 -0
  192. data/examples/i18n/uz/features/support/world.rb +8 -0
  193. data/examples/i18n/uz/lib/calculator.rb +24 -0
  194. data/examples/i18n/zh-CN/Rakefile +4 -0
  195. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  196. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  197. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  198. data/examples/i18n/zh-TW/.gitignore +1 -0
  199. data/examples/i18n/zh-TW/Rakefile +4 -0
  200. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  201. data/examples/i18n/zh-TW/features/division.feature +11 -0
  202. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  203. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  204. data/examples/python/README.textile +7 -0
  205. data/examples/python/Rakefile +4 -0
  206. data/examples/python/features/fibonacci.feature +19 -0
  207. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  208. data/examples/python/lib/.gitignore +1 -0
  209. data/examples/python/lib/fib.py +7 -0
  210. data/examples/ramaze/README.textile +7 -0
  211. data/examples/ramaze/Rakefile +6 -0
  212. data/examples/ramaze/app.rb +21 -0
  213. data/examples/ramaze/features/add.feature +11 -0
  214. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  215. data/examples/ramaze/features/support/env.rb +32 -0
  216. data/examples/ramaze/layout/default.html.erb +8 -0
  217. data/examples/ramaze/view/index.html.erb +5 -0
  218. data/examples/rspec_doubles/Rakefile +4 -0
  219. data/examples/rspec_doubles/features/mocking.feature +9 -0
  220. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  221. data/examples/rspec_doubles/features/support/env.rb +12 -0
  222. data/examples/ruby2python/README.textile +7 -0
  223. data/examples/ruby2python/Rakefile +4 -0
  224. data/examples/ruby2python/features/fibonacci.feature +19 -0
  225. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  226. data/examples/ruby2python/features/support/env.rb +21 -0
  227. data/examples/ruby2python/lib/.gitignore +1 -0
  228. data/examples/ruby2python/lib/fib.py +7 -0
  229. data/examples/sinatra/README.textile +13 -0
  230. data/examples/sinatra/Rakefile +6 -0
  231. data/examples/sinatra/app.rb +14 -0
  232. data/examples/sinatra/features/add.feature +11 -0
  233. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  234. data/examples/sinatra/features/support/env.rb +10 -0
  235. data/examples/sinatra/views/add.erb +7 -0
  236. data/examples/sinatra/views/layout.erb +8 -0
  237. data/examples/tcl/README.textile +11 -0
  238. data/examples/tcl/Rakefile +6 -0
  239. data/examples/tcl/features/fibonnacci.feature +17 -0
  240. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  241. data/examples/tcl/features/support/env.rb +6 -0
  242. data/examples/tcl/src/fib.tcl +3 -0
  243. data/examples/test_unit/Rakefile +6 -0
  244. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  245. data/examples/test_unit/features/test_unit.feature +9 -0
  246. data/examples/v8/Rakefile +6 -0
  247. data/examples/v8/features/fibonacci.feature +43 -0
  248. data/examples/v8/features/step_definitions/fib_steps.js +49 -0
  249. data/examples/v8/features/support/env.js +14 -0
  250. data/examples/v8/lib/fibonacci.js +19 -0
  251. data/examples/watir/.gitignore +2 -0
  252. data/examples/watir/README.textile +16 -0
  253. data/examples/watir/Rakefile +12 -0
  254. data/examples/watir/cucumber.yml +1 -0
  255. data/examples/watir/features/search.feature +12 -0
  256. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  257. data/examples/watir/features/support/env.rb +32 -0
  258. data/examples/watir/features/support/screenshots.rb +47 -0
  259. data/features/background.feature +498 -0
  260. data/features/custom_formatter.feature +41 -0
  261. data/features/execute_with_tag_filter.feature +63 -0
  262. data/features/hooks.feature +59 -0
  263. data/features/json_formatter.feature +249 -0
  264. data/features/stats_formatters.feature +70 -0
  265. data/features/step_definitions/cucumber_steps.rb +8 -0
  266. data/features/support/env.rb +31 -0
  267. data/features/tagged_hooks.feature +217 -0
  268. data/fixtures/json/features/background.feature +7 -0
  269. data/fixtures/json/features/embed.feature +4 -0
  270. data/fixtures/json/features/one_passing_one_failing.feature +11 -0
  271. data/fixtures/json/features/step_definitions/steps.rb +32 -0
  272. data/fixtures/json/features/tables.feature +13 -0
  273. data/fixtures/junit/features/one_passing_one_failing.feature +8 -0
  274. data/fixtures/junit/features/pending.feature +5 -0
  275. data/fixtures/junit/features/step_definitions/steps.rb +11 -0
  276. data/fixtures/self_test/.gitignore +1 -0
  277. data/fixtures/self_test/README.textile +6 -0
  278. data/fixtures/self_test/Rakefile +6 -0
  279. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  280. data/fixtures/self_test/features/failing_expectation.feature +4 -0
  281. data/fixtures/self_test/features/lots_of_undefined.feature +8 -0
  282. data/fixtures/self_test/features/multiline_name.feature +27 -0
  283. data/fixtures/self_test/features/outline_sample.feature +15 -0
  284. data/fixtures/self_test/features/sample.feature +21 -0
  285. data/fixtures/self_test/features/search_sample.feature +32 -0
  286. data/fixtures/self_test/features/step_definitions/sample_steps.rb +84 -0
  287. data/fixtures/self_test/features/support/env.rb +18 -0
  288. data/fixtures/self_test/features/tags_sample.feature +17 -0
  289. data/fixtures/self_test/features/tons_of_cukes.feature +52 -0
  290. data/fixtures/self_test/features/undefined_multiline_args.feature +12 -0
  291. data/fixtures/self_test/list-of-features.txt +1 -0
  292. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  293. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  294. data/fixtures/tickets/Rakefile +20 -0
  295. data/fixtures/tickets/features.html +138 -0
  296. data/fixtures/tickets/features/172.feature +28 -0
  297. data/fixtures/tickets/features/177/1.feature +28 -0
  298. data/fixtures/tickets/features/177/2.feature +20 -0
  299. data/fixtures/tickets/features/177/3.feature +18 -0
  300. data/fixtures/tickets/features/180.feature +7 -0
  301. data/fixtures/tickets/features/229/tagged_hooks.feature +8 -0
  302. data/fixtures/tickets/features/229/tagged_hooks.rb +14 -0
  303. data/fixtures/tickets/features/236.feature +13 -0
  304. data/fixtures/tickets/features/241.feature +12 -0
  305. data/fixtures/tickets/features/246.feature +4 -0
  306. data/fixtures/tickets/features/248.feature +11 -0
  307. data/fixtures/tickets/features/270/back.feature +14 -0
  308. data/fixtures/tickets/features/270/back.steps.rb +14 -0
  309. data/fixtures/tickets/features/272/hooks.feature +26 -0
  310. data/fixtures/tickets/features/272/hooks_steps.rb +53 -0
  311. data/fixtures/tickets/features/279/py_string_indent.feature +25 -0
  312. data/fixtures/tickets/features/279/py_string_indent.steps.rb +12 -0
  313. data/fixtures/tickets/features/279/wrong.feature_ +11 -0
  314. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  315. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  316. data/fixtures/tickets/features/306/only_background.feature +4 -0
  317. data/fixtures/tickets/features/around_timeout.feature +6 -0
  318. data/fixtures/tickets/features/gherkin_67.feature +12 -0
  319. data/fixtures/tickets/features/gherkin_68.feature +4 -0
  320. data/fixtures/tickets/features/half_manual.feature +11 -0
  321. data/fixtures/tickets/features/lib/eatting_machine.rb +18 -0
  322. data/fixtures/tickets/features/lib/pantry.rb +20 -0
  323. data/fixtures/tickets/features/scenario_outline.feature +95 -0
  324. data/fixtures/tickets/features/step_definitons/246_steps.rb +3 -0
  325. data/fixtures/tickets/features/step_definitons/248_steps.rb +15 -0
  326. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +9 -0
  327. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +11 -0
  328. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  329. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +88 -0
  330. data/fixtures/tickets/features/table_diffing.feature +13 -0
  331. data/fixtures/tickets/features/tickets.feature +28 -0
  332. data/gem_tasks/contributors.rake +15 -0
  333. data/gem_tasks/cucumber.rake +19 -0
  334. data/gem_tasks/environment.rake +7 -0
  335. data/gem_tasks/examples.rake +11 -0
  336. data/gem_tasks/fix_cr_lf.rake +10 -0
  337. data/gem_tasks/flog.rake +4 -0
  338. data/gem_tasks/rspec.rake +8 -0
  339. data/gem_tasks/sass.rake +4 -0
  340. data/gem_tasks/sdoc.rake +12 -0
  341. data/legacy_features/announce.feature +164 -0
  342. data/legacy_features/api/list_step_defs_as_json.feature +50 -0
  343. data/legacy_features/api/run_cli_main_with_existing_runtime.feature +34 -0
  344. data/legacy_features/around_hooks.feature +232 -0
  345. data/legacy_features/bug_371.feature +32 -0
  346. data/legacy_features/bug_464.feature +16 -0
  347. data/legacy_features/bug_475.feature +42 -0
  348. data/legacy_features/bug_585_tab_indentation.feature +22 -0
  349. data/legacy_features/bug_600.feature +67 -0
  350. data/legacy_features/call_steps_from_stepdefs.feature +154 -0
  351. data/legacy_features/cucumber_cli.feature +591 -0
  352. data/legacy_features/cucumber_cli_outlines.feature +117 -0
  353. data/legacy_features/default_snippets.feature +42 -0
  354. data/legacy_features/diffing.feature +25 -0
  355. data/legacy_features/drb_server_integration.feature +174 -0
  356. data/legacy_features/exception_in_after_block.feature +127 -0
  357. data/legacy_features/exception_in_after_step_block.feature +104 -0
  358. data/legacy_features/exception_in_before_block.feature +98 -0
  359. data/legacy_features/exclude_files.feature +20 -0
  360. data/legacy_features/expand.feature +60 -0
  361. data/legacy_features/html_formatter.feature +8 -0
  362. data/legacy_features/html_formatter/a.html +550 -0
  363. data/legacy_features/junit_formatter.feature +92 -0
  364. data/legacy_features/language_from_header.feature +30 -0
  365. data/legacy_features/language_help.feature +78 -0
  366. data/legacy_features/listener_debugger_formatter.feature +42 -0
  367. data/legacy_features/multiline_names.feature +44 -0
  368. data/legacy_features/post_configuration_hook.feature +50 -0
  369. data/legacy_features/profiles.feature +126 -0
  370. data/legacy_features/rake_task.feature +152 -0
  371. data/legacy_features/report_called_undefined_steps.feature +34 -0
  372. data/legacy_features/rerun_formatter.feature +45 -0
  373. data/legacy_features/simplest.feature +11 -0
  374. data/legacy_features/snippet.feature +23 -0
  375. data/legacy_features/snippets_when_using_star_keyword.feature +36 -0
  376. data/legacy_features/step_definitions/cucumber_steps.rb +168 -0
  377. data/legacy_features/step_definitions/extra_steps.rb +2 -0
  378. data/legacy_features/step_definitions/simplest_steps.rb +3 -0
  379. data/legacy_features/step_definitions/wire_steps.rb +34 -0
  380. data/legacy_features/support/env.rb +157 -0
  381. data/legacy_features/support/env.rb.simplest +7 -0
  382. data/legacy_features/support/fake_wire_server.rb +77 -0
  383. data/legacy_features/table_diffing.feature +45 -0
  384. data/legacy_features/table_mapping.feature +34 -0
  385. data/legacy_features/transform.feature +245 -0
  386. data/legacy_features/unicode_table.feature +35 -0
  387. data/legacy_features/wire_protocol.feature +332 -0
  388. data/legacy_features/wire_protocol_table_diffing.feature +119 -0
  389. data/legacy_features/wire_protocol_tags.feature +87 -0
  390. data/legacy_features/wire_protocol_timeouts.feature +63 -0
  391. data/legacy_features/work_in_progress.feature +156 -0
  392. data/lib/README.rdoc +12 -0
  393. data/lib/autotest/cucumber.rb +6 -0
  394. data/lib/autotest/cucumber_mixin.rb +135 -0
  395. data/lib/autotest/cucumber_rails.rb +6 -0
  396. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  397. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  398. data/lib/autotest/cucumber_rspec.rb +6 -0
  399. data/lib/autotest/cucumber_rspec2.rb +6 -0
  400. data/lib/autotest/discover.rb +9 -0
  401. data/lib/cucumber.rb +27 -0
  402. data/lib/cucumber/ast.rb +30 -0
  403. data/lib/cucumber/ast/background.rb +99 -0
  404. data/lib/cucumber/ast/comment.rb +31 -0
  405. data/lib/cucumber/ast/examples.rb +43 -0
  406. data/lib/cucumber/ast/feature.rb +103 -0
  407. data/lib/cucumber/ast/feature_element.rb +78 -0
  408. data/lib/cucumber/ast/features.rb +35 -0
  409. data/lib/cucumber/ast/outline_table.rb +187 -0
  410. data/lib/cucumber/ast/py_string.rb +80 -0
  411. data/lib/cucumber/ast/scenario.rb +117 -0
  412. data/lib/cucumber/ast/scenario_outline.rb +122 -0
  413. data/lib/cucumber/ast/step.rb +126 -0
  414. data/lib/cucumber/ast/step_collection.rb +76 -0
  415. data/lib/cucumber/ast/step_invocation.rb +199 -0
  416. data/lib/cucumber/ast/table.rb +689 -0
  417. data/lib/cucumber/ast/tags.rb +28 -0
  418. data/lib/cucumber/ast/tree_walker.rb +184 -0
  419. data/lib/cucumber/ast/visitor.rb +11 -0
  420. data/lib/cucumber/broadcaster.rb +13 -0
  421. data/lib/cucumber/cli/configuration.rb +209 -0
  422. data/lib/cucumber/cli/drb_client.rb +43 -0
  423. data/lib/cucumber/cli/main.rb +78 -0
  424. data/lib/cucumber/cli/options.rb +406 -0
  425. data/lib/cucumber/cli/profile_loader.rb +91 -0
  426. data/lib/cucumber/configuration.rb +49 -0
  427. data/lib/cucumber/constantize.rb +34 -0
  428. data/lib/cucumber/core_ext/disable_mini_unit_autorun.rb +14 -0
  429. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  430. data/lib/cucumber/core_ext/proc.rb +34 -0
  431. data/lib/cucumber/core_ext/string.rb +9 -0
  432. data/lib/cucumber/errors.rb +40 -0
  433. data/lib/cucumber/feature_file.rb +62 -0
  434. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  435. data/lib/cucumber/formatter/console.rb +177 -0
  436. data/lib/cucumber/formatter/cucumber.css +275 -0
  437. data/lib/cucumber/formatter/cucumber.sass +271 -0
  438. data/lib/cucumber/formatter/debug.rb +33 -0
  439. data/lib/cucumber/formatter/duration.rb +13 -0
  440. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +84 -0
  441. data/lib/cucumber/formatter/gpretty.rb +24 -0
  442. data/lib/cucumber/formatter/html.rb +644 -0
  443. data/lib/cucumber/formatter/io.rb +31 -0
  444. data/lib/cucumber/formatter/jquery-min.js +154 -0
  445. data/lib/cucumber/formatter/json.rb +29 -0
  446. data/lib/cucumber/formatter/json_pretty.rb +13 -0
  447. data/lib/cucumber/formatter/junit.rb +150 -0
  448. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  449. data/lib/cucumber/formatter/pdf.rb +244 -0
  450. data/lib/cucumber/formatter/pretty.rb +237 -0
  451. data/lib/cucumber/formatter/progress.rb +92 -0
  452. data/lib/cucumber/formatter/rerun.rb +55 -0
  453. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  454. data/lib/cucumber/formatter/steps.rb +49 -0
  455. data/lib/cucumber/formatter/summary.rb +35 -0
  456. data/lib/cucumber/formatter/unicode.rb +79 -0
  457. data/lib/cucumber/formatter/usage.rb +127 -0
  458. data/lib/cucumber/js_support/js_dsl.js +57 -0
  459. data/lib/cucumber/js_support/js_language.rb +185 -0
  460. data/lib/cucumber/js_support/js_snippets.rb +27 -0
  461. data/lib/cucumber/language_support.rb +30 -0
  462. data/lib/cucumber/language_support/language_methods.rb +129 -0
  463. data/lib/cucumber/parser.rb +2 -0
  464. data/lib/cucumber/parser/gherkin_builder.rb +130 -0
  465. data/lib/cucumber/platform.rb +29 -0
  466. data/lib/cucumber/py_support/py_dsl.py +10 -0
  467. data/lib/cucumber/py_support/py_language.py +10 -0
  468. data/lib/cucumber/py_support/py_language.rb +84 -0
  469. data/lib/cucumber/rake/task.rb +170 -0
  470. data/lib/cucumber/rb_support/rb_dsl.rb +112 -0
  471. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  472. data/lib/cucumber/rb_support/rb_language.rb +195 -0
  473. data/lib/cucumber/rb_support/rb_step_definition.rb +82 -0
  474. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  475. data/lib/cucumber/rb_support/rb_world.rb +95 -0
  476. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  477. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  478. data/lib/cucumber/rspec/doubles.rb +16 -0
  479. data/lib/cucumber/runtime.rb +145 -0
  480. data/lib/cucumber/runtime/features_loader.rb +62 -0
  481. data/lib/cucumber/runtime/for_programming_languages.rb +65 -0
  482. data/lib/cucumber/runtime/results.rb +64 -0
  483. data/lib/cucumber/runtime/support_code.rb +203 -0
  484. data/lib/cucumber/runtime/user_interface.rb +80 -0
  485. data/lib/cucumber/step_argument.rb +9 -0
  486. data/lib/cucumber/step_definition_light.rb +20 -0
  487. data/lib/cucumber/step_definitions.rb +14 -0
  488. data/lib/cucumber/step_match.rb +115 -0
  489. data/lib/cucumber/step_mother.rb +10 -0
  490. data/lib/cucumber/wire_support/configuration.rb +30 -0
  491. data/lib/cucumber/wire_support/connection.rb +55 -0
  492. data/lib/cucumber/wire_support/request_handler.rb +32 -0
  493. data/lib/cucumber/wire_support/wire_exception.rb +32 -0
  494. data/lib/cucumber/wire_support/wire_language.rb +54 -0
  495. data/lib/cucumber/wire_support/wire_packet.rb +32 -0
  496. data/lib/cucumber/wire_support/wire_protocol.rb +44 -0
  497. data/lib/cucumber/wire_support/wire_protocol/requests.rb +123 -0
  498. data/lib/cucumber/wire_support/wire_step_definition.rb +26 -0
  499. data/spec/cucumber/ast/background_spec.rb +110 -0
  500. data/spec/cucumber/ast/feature_factory.rb +60 -0
  501. data/spec/cucumber/ast/feature_spec.rb +63 -0
  502. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  503. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  504. data/spec/cucumber/ast/scenario_outline_spec.rb +68 -0
  505. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  506. data/spec/cucumber/ast/step_spec.rb +66 -0
  507. data/spec/cucumber/ast/table_spec.rb +474 -0
  508. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  509. data/spec/cucumber/broadcaster_spec.rb +15 -0
  510. data/spec/cucumber/cli/configuration_spec.rb +431 -0
  511. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  512. data/spec/cucumber/cli/main_spec.rb +137 -0
  513. data/spec/cucumber/cli/options_spec.rb +351 -0
  514. data/spec/cucumber/cli/profile_loader_spec.rb +35 -0
  515. data/spec/cucumber/configuration_spec.rb +23 -0
  516. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  517. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  518. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  519. data/spec/cucumber/formatter/html_spec.rb +258 -0
  520. data/spec/cucumber/formatter/junit_spec.rb +111 -0
  521. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  522. data/spec/cucumber/formatter/spec_helper.rb +51 -0
  523. data/spec/cucumber/rb_support/rb_language_spec.rb +283 -0
  524. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +99 -0
  525. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  526. data/spec/cucumber/runtime/support_code_spec.rb +112 -0
  527. data/spec/cucumber/runtime_spec.rb +41 -0
  528. data/spec/cucumber/sell_cucumbers.feature +19 -0
  529. data/spec/cucumber/step_match_spec.rb +69 -0
  530. data/spec/cucumber/wire_support/configuration_spec.rb +51 -0
  531. data/spec/cucumber/wire_support/connection_spec.rb +46 -0
  532. data/spec/cucumber/wire_support/wire_exception_spec.rb +44 -0
  533. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  534. data/spec/cucumber/wire_support/wire_packet_spec.rb +40 -0
  535. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +20 -0
  536. data/spec/cucumber/world/pending_spec.rb +46 -0
  537. data/spec/spec_helper.rb +10 -0
  538. metadata +884 -0
@@ -0,0 +1,170 @@
1
+ require 'cucumber/platform'
2
+
3
+ module Cucumber
4
+ module Rake
5
+ # Defines a Rake task for running features.
6
+ #
7
+ # The simplest use of it goes something like:
8
+ #
9
+ # Cucumber::Rake::Task.new
10
+ #
11
+ # This will define a task named <tt>cucumber</tt> described as 'Run Cucumber features'.
12
+ # It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
13
+ #
14
+ # To further configure the task, you can pass a block:
15
+ #
16
+ # Cucumber::Rake::Task.new do |t|
17
+ # t.cucumber_opts = %w{--format progress}
18
+ # end
19
+ #
20
+ # This task can also be configured to be run with RCov:
21
+ #
22
+ # Cucumber::Rake::Task.new do |t|
23
+ # t.rcov = true
24
+ # end
25
+ #
26
+ # See the attributes for additional configuration possibilities.
27
+ class Task
28
+ class InProcessCucumberRunner #:nodoc:
29
+ attr_reader :args
30
+
31
+ def initialize(libs, cucumber_opts, feature_files)
32
+ raise "libs must be an Array when running in-process" unless Array === libs
33
+ libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
34
+ @args = (
35
+ cucumber_opts +
36
+ feature_files
37
+ ).flatten.compact
38
+ end
39
+
40
+ def run
41
+ require 'cucumber/cli/main'
42
+ failure = Cucumber::Cli::Main.execute(args)
43
+ raise "Cucumber failed" if failure
44
+ end
45
+ end
46
+
47
+ class ForkedCucumberRunner #:nodoc:
48
+ attr_reader :args
49
+
50
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
51
+ @args = (
52
+ ['-I'] + load_path(libs) +
53
+ quoted_binary(cucumber_bin) +
54
+ cucumber_opts +
55
+ feature_files
56
+ ).flatten
57
+ end
58
+
59
+ def load_path(libs)
60
+ ['"%s"' % libs.join(File::PATH_SEPARATOR)]
61
+ end
62
+
63
+ def quoted_binary(cucumber_bin)
64
+ ['"%s"' % cucumber_bin]
65
+ end
66
+
67
+ def runner
68
+ File.exist?("./Gemfile") && Gem.available?("bundler") ? ["bundle", "exec", RUBY] : [RUBY]
69
+ end
70
+
71
+ def run
72
+ sh((runner + args).join(" "))
73
+ end
74
+ end
75
+
76
+ class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
77
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
78
+ @args = (
79
+ ['-I'] + load_path(libs) +
80
+ ['-S', 'rcov'] + rcov_opts +
81
+ quoted_binary(cucumber_bin) +
82
+ ['--'] +
83
+ cucumber_opts +
84
+ feature_files
85
+ ).flatten
86
+ end
87
+ end
88
+
89
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') #:nodoc:
90
+
91
+ # Directories to add to the Ruby $LOAD_PATH
92
+ attr_accessor :libs
93
+
94
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
95
+ attr_accessor :binary
96
+
97
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
98
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
99
+ attr_accessor :cucumber_opts
100
+ def cucumber_opts=(opts) #:nodoc:
101
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
102
+ end
103
+
104
+ # Run cucumber with RCov? Defaults to false. If you set this to
105
+ # true, +fork+ is implicit.
106
+ attr_accessor :rcov
107
+
108
+ # Extra options to pass to rcov.
109
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
110
+ attr_accessor :rcov_opts
111
+ def rcov_opts=(opts) #:nodoc:
112
+ @rcov_opts = String === opts ? opts.split(' ') : opts
113
+ end
114
+
115
+ # Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
116
+ # some startup speed if you set it to false, but this may also cause issues with
117
+ # your load path and gems.
118
+ attr_accessor :fork
119
+
120
+ # Define what profile to be used. When used with cucumber_opts it is simply appended
121
+ # to it. Will be ignored when CUCUMBER_OPTS is used.
122
+ attr_accessor :profile
123
+
124
+ # Define Cucumber Rake task
125
+ def initialize(task_name = "cucumber", desc = "Run Cucumber features")
126
+ @task_name, @desc = task_name, desc
127
+ @fork = true
128
+ @libs = ['lib']
129
+ @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
130
+
131
+ yield self if block_given?
132
+
133
+ @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
134
+ @libs.insert(0, LIB) if binary == Cucumber::BINARY
135
+
136
+ define_task
137
+ end
138
+
139
+ def define_task #:nodoc:
140
+ desc @desc
141
+ task @task_name do
142
+ runner.run
143
+ end
144
+ end
145
+
146
+ def runner(task_args = nil) #:nodoc:
147
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
148
+ if(@rcov)
149
+ RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files, rcov_opts)
150
+ elsif(@fork)
151
+ ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files)
152
+ else
153
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
154
+ end
155
+ end
156
+
157
+ def cucumber_opts_with_profile #:nodoc:
158
+ @profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
159
+ end
160
+
161
+ def feature_files #:nodoc:
162
+ make_command_line_safe(FileList[ ENV['FEATURE'] || [] ])
163
+ end
164
+
165
+ def make_command_line_safe(list)
166
+ list.map{|string| string.gsub(' ', '\ ')}
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,112 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ # This module defines the methods you can use to define pure Ruby
4
+ # Step Definitions and Hooks. This module is mixed into the toplevel
5
+ # object.
6
+ module RbDsl
7
+ class << self
8
+ attr_writer :rb_language
9
+
10
+ def alias_adverb(adverb)
11
+ alias_method adverb, :register_rb_step_definition
12
+ end
13
+
14
+ def build_rb_world_factory(world_modules, proc)
15
+ @rb_language.build_rb_world_factory(world_modules, proc)
16
+ end
17
+
18
+ def register_rb_hook(phase, tag_names, proc)
19
+ @rb_language.register_rb_hook(phase, tag_names, proc)
20
+ end
21
+
22
+ def register_rb_transform(regexp, proc)
23
+ @rb_language.register_rb_transform(regexp, proc)
24
+ end
25
+
26
+ def register_rb_step_definition(regexp, proc)
27
+ @rb_language.register_rb_step_definition(regexp, proc)
28
+ end
29
+ end
30
+
31
+ # Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
32
+ # The +proc+ will be executed once before each scenario to create an
33
+ # Object that the scenario's steps will run within. Any +world_modules+
34
+ # will be mixed into this Object (via Object#extend).
35
+ #
36
+ # This method is typically called from one or more Ruby scripts under
37
+ # <tt>features/support</tt>. You can call this method as many times as you
38
+ # like (to register more modules), but if you try to register more than
39
+ # one Proc you will get an error.
40
+ #
41
+ # Cucumber will not yield anything to the +proc+. Examples:
42
+ #
43
+ # World do
44
+ # MyClass.new
45
+ # end
46
+ #
47
+ # World(MyModule)
48
+ #
49
+ def World(*world_modules, &proc)
50
+ RbDsl.build_rb_world_factory(world_modules, proc)
51
+ end
52
+
53
+ # Registers a proc that will run before each Scenario. You can register as many
54
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
55
+ def Before(*tag_expressions, &proc)
56
+ RbDsl.register_rb_hook('before', tag_expressions, proc)
57
+ end
58
+
59
+ # Registers a proc that will run after each Scenario. You can register as many
60
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
61
+ def After(*tag_expressions, &proc)
62
+ RbDsl.register_rb_hook('after', tag_expressions, proc)
63
+ end
64
+
65
+ # Registers a proc that will be wrapped around each scenario. The proc
66
+ # should accept two arguments: two arguments: the scenario and a "block"
67
+ # argument (but passed as a regular argument, since blocks cannot accept
68
+ # blocks in 1.8), on which it should call the .call method. You can register
69
+ # as many as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
70
+ def Around(*tag_expressions, &proc)
71
+ RbDsl.register_rb_hook('around', tag_expressions, proc)
72
+ end
73
+
74
+ # Registers a proc that will run after each Step. You can register as
75
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
76
+ def AfterStep(*tag_expressions, &proc)
77
+ RbDsl.register_rb_hook('after_step', tag_expressions, proc)
78
+ end
79
+
80
+ # Registers a proc that will be called with a step definition argument if it
81
+ # matches the pattern passed as the first argument to Transform. Alternatively, if
82
+ # the pattern contains captures then they will be yielded as arguments to the
83
+ # provided proc. The return value of the proc is consequently yielded to the
84
+ # step definition.
85
+ def Transform(regexp, &proc)
86
+ RbDsl.register_rb_transform(regexp, proc)
87
+ end
88
+
89
+ # Registers a proc that will run after Cucumber is configured. You can register as
90
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
91
+ # TODO: Deprecate this
92
+ def AfterConfiguration(&proc)
93
+ RbDsl.register_rb_hook('after_configuration', [], proc)
94
+ end
95
+
96
+ # Registers a new Ruby StepDefinition. This method is aliased
97
+ # to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>, and
98
+ # also to the i18n translations whenever a feature of a
99
+ # new language is loaded.
100
+ #
101
+ # The +&proc+ gets executed in the context of a <tt>World</tt>
102
+ # object, which is defined by #World. A new <tt>World</tt>
103
+ # object is created for each scenario and is shared across
104
+ # step definitions within that scenario.
105
+ def register_rb_step_definition(regexp, &proc)
106
+ RbDsl.register_rb_step_definition(regexp, proc)
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ extend(Cucumber::RbSupport::RbDsl)
@@ -0,0 +1,18 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ # Wrapper for Before, After and AfterStep hooks
4
+ class RbHook
5
+ attr_reader :tag_expressions
6
+
7
+ def initialize(rb_language, tag_expressions, proc)
8
+ @rb_language = rb_language
9
+ @tag_expressions = tag_expressions
10
+ @proc = proc
11
+ end
12
+
13
+ def invoke(location, argument, &block)
14
+ @rb_language.current_world.cucumber_instance_exec(false, location, *[argument, block].compact, &@proc)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,195 @@
1
+ require 'cucumber/core_ext/instance_exec'
2
+ require 'cucumber/rb_support/rb_dsl'
3
+ require 'cucumber/rb_support/rb_world'
4
+ require 'cucumber/rb_support/rb_step_definition'
5
+ require 'cucumber/rb_support/rb_hook'
6
+ require 'cucumber/rb_support/rb_transform'
7
+
8
+ module Cucumber
9
+ module RbSupport
10
+ # Raised if a World block returns Nil.
11
+ class NilWorld < StandardError
12
+ def initialize
13
+ super("World procs should never return nil")
14
+ end
15
+ end
16
+
17
+ # Raised if there are 2 or more World blocks.
18
+ class MultipleWorld < StandardError
19
+ def initialize(first_proc, second_proc)
20
+ message = "You can only pass a proc to #World once, but it's happening\n"
21
+ message << "in 2 places:\n\n"
22
+ message << first_proc.backtrace_line('World') << "\n"
23
+ message << second_proc.backtrace_line('World') << "\n\n"
24
+ message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
25
+ message << "or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.\n\n"
26
+ super(message)
27
+ end
28
+ end
29
+
30
+ # The Ruby implementation of the programming language API.
31
+ class RbLanguage
32
+ include LanguageSupport::LanguageMethods
33
+ attr_reader :current_world,
34
+ :step_definitions
35
+
36
+ Gherkin::I18n.code_keywords.each do |adverb|
37
+ RbDsl.alias_adverb(adverb)
38
+ RbWorld.alias_adverb(adverb)
39
+ end
40
+
41
+ def initialize(step_mother)
42
+ @step_mother = step_mother
43
+ @step_definitions = []
44
+ RbDsl.rb_language = self
45
+ @world_proc = @world_modules = nil
46
+ enable_rspec_expectations_if_available
47
+ end
48
+
49
+ def enable_rspec_expectations_if_available
50
+ begin
51
+ # RSpec >=2.0
52
+ require 'rspec/expectations'
53
+ @rspec_matchers = ::RSpec::Matchers
54
+ rescue LoadError => try_rspec_1_2_4_or_higher
55
+ begin
56
+ require 'spec/expectations'
57
+ require 'spec/runner/differs/default'
58
+ require 'ostruct'
59
+ options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
60
+ Spec::Expectations.differ = Spec::Expectations::Differs::Default.new(options)
61
+ @rspec_matchers = ::Spec::Matchers
62
+ rescue LoadError => give_up
63
+ @rspec_matchers = Module.new{}
64
+ end
65
+ end
66
+ end
67
+
68
+ # Gets called for each file under features (or whatever is overridden
69
+ # with --require).
70
+ def step_definitions_for(rb_file) # Looks Unused - Delete?
71
+ begin
72
+ require rb_file # This will cause self.add_step_definition and self.add_hook to be called from RbDsl
73
+ step_definitions
74
+ rescue LoadError => e
75
+ e.message << "\nFailed to load #{code_file}"
76
+ raise e
77
+ ensure
78
+ @step_definitions = nil
79
+ end
80
+ end
81
+
82
+ def step_matches(name_to_match, name_to_format)
83
+ @step_definitions.map do |step_definition|
84
+ if(arguments = step_definition.arguments_from(name_to_match))
85
+ StepMatch.new(step_definition, name_to_match, name_to_format, arguments)
86
+ else
87
+ nil
88
+ end
89
+ end.compact
90
+ end
91
+
92
+ ARGUMENT_PATTERNS = ['"([^"]*)"', '(\d+)']
93
+
94
+ def snippet_text(code_keyword, step_name, multiline_arg_class)
95
+ snippet_pattern = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
96
+ arg_count = 0
97
+ ARGUMENT_PATTERNS.each do |pattern|
98
+ snippet_pattern = snippet_pattern.gsub(Regexp.new(pattern), pattern)
99
+ arg_count += snippet_pattern.scan(pattern).length
100
+ end
101
+
102
+ block_args = (0...arg_count).map {|n| "arg#{n+1}"}
103
+ block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
104
+ block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
105
+ multiline_class_comment = ""
106
+ if(multiline_arg_class == Ast::Table)
107
+ multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
108
+ end
109
+
110
+ "#{code_keyword} /^#{snippet_pattern}$/ do#{block_arg_string}\n #{multiline_class_comment}pending # express the regexp above with the code you wish you had\nend"
111
+ end
112
+
113
+ def begin_rb_scenario(scenario)
114
+ create_world
115
+ extend_world
116
+ connect_world(scenario)
117
+ end
118
+
119
+ def register_rb_hook(phase, tag_expressions, proc)
120
+ add_hook(phase, RbHook.new(self, tag_expressions, proc))
121
+ end
122
+
123
+ def register_rb_transform(regexp, proc)
124
+ add_transform(RbTransform.new(self, regexp, proc))
125
+ end
126
+
127
+ def register_rb_step_definition(regexp, proc)
128
+ step_definition = RbStepDefinition.new(self, regexp, proc)
129
+ @step_definitions << step_definition
130
+ step_definition
131
+ end
132
+
133
+ def build_rb_world_factory(world_modules, proc)
134
+ if(proc)
135
+ raise MultipleWorld.new(@world_proc, proc) if @world_proc
136
+ @world_proc = proc
137
+ end
138
+ @world_modules ||= []
139
+ @world_modules += world_modules
140
+ end
141
+
142
+ def load_code_file(code_file)
143
+ load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
144
+ end
145
+
146
+ protected
147
+
148
+ def begin_scenario(scenario)
149
+ begin_rb_scenario(scenario)
150
+ end
151
+
152
+ def end_scenario
153
+ @current_world = nil
154
+ end
155
+
156
+ private
157
+
158
+ def create_world
159
+ if(@world_proc)
160
+ @current_world = @world_proc.call
161
+ check_nil(@current_world, @world_proc)
162
+ else
163
+ @current_world = Object.new
164
+ end
165
+ end
166
+
167
+ def extend_world
168
+ @current_world.extend(RbWorld)
169
+ @current_world.extend(@rspec_matchers)
170
+ (@world_modules || []).each do |mod|
171
+ @current_world.extend(mod)
172
+ end
173
+ end
174
+
175
+ def connect_world(scenario)
176
+ @current_world.__cucumber_step_mother = @step_mother
177
+ @current_world.__natural_language = scenario.language
178
+ end
179
+
180
+ def check_nil(o, proc)
181
+ if o.nil?
182
+ begin
183
+ raise NilWorld.new
184
+ rescue NilWorld => e
185
+ e.backtrace.clear
186
+ e.backtrace.push(proc.backtrace_line("World"))
187
+ raise e
188
+ end
189
+ else
190
+ o
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end