stefl-cucumber 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
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