casecumber 1.0.2.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 (563) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +26 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +7 -0
  6. data/.yardopts +0 -0
  7. data/Gemfile +2 -0
  8. data/Gemfile.lock +115 -0
  9. data/History.md +1702 -0
  10. data/LICENSE +22 -0
  11. data/README.md +25 -0
  12. data/Rakefile +12 -0
  13. data/bin/cucumber +22 -0
  14. data/cucumber.gemspec +60 -0
  15. data/cucumber.yml +20 -0
  16. data/examples/i18n/README.textile +18 -0
  17. data/examples/i18n/Rakefile +33 -0
  18. data/examples/i18n/ar/Rakefile +6 -0
  19. data/examples/i18n/ar/features/addition.feature +17 -0
  20. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  21. data/examples/i18n/ar/lib/calculator.rb +11 -0
  22. data/examples/i18n/bg/Rakefile +6 -0
  23. data/examples/i18n/bg/features/addition.feature +12 -0
  24. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  25. data/examples/i18n/bg/features/division.feature +17 -0
  26. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  27. data/examples/i18n/bg/features/support/env.rb +5 -0
  28. data/examples/i18n/bg/features/support/world.rb +8 -0
  29. data/examples/i18n/bg/lib/calculator.rb +24 -0
  30. data/examples/i18n/ca/Rakefile +6 -0
  31. data/examples/i18n/ca/features/step_definitons/calculator_steps.rb +21 -0
  32. data/examples/i18n/ca/features/suma.feature +17 -0
  33. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  34. data/examples/i18n/da/Rakefile +6 -0
  35. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  36. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  37. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  38. data/examples/i18n/de/.gitignore +1 -0
  39. data/examples/i18n/de/Rakefile +6 -0
  40. data/examples/i18n/de/features/addition.feature +17 -0
  41. data/examples/i18n/de/features/division.feature +10 -0
  42. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  43. data/examples/i18n/de/lib/calculator.rb +14 -0
  44. data/examples/i18n/en-lol/Rakefile +4 -0
  45. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  46. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  47. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  48. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  49. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  50. data/examples/i18n/en/.gitignore +1 -0
  51. data/examples/i18n/en/Rakefile +6 -0
  52. data/examples/i18n/en/features/addition.feature +17 -0
  53. data/examples/i18n/en/features/division.feature +10 -0
  54. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  55. data/examples/i18n/en/lib/calculator.rb +14 -0
  56. data/examples/i18n/eo/.gitignore +1 -0
  57. data/examples/i18n/eo/Rakefile +6 -0
  58. data/examples/i18n/eo/features/adicio.feature +17 -0
  59. data/examples/i18n/eo/features/divido.feature +10 -0
  60. data/examples/i18n/eo/features/step_definitons/calculator_steps.rb +24 -0
  61. data/examples/i18n/eo/lib/calculator.rb +14 -0
  62. data/examples/i18n/es/Rakefile +6 -0
  63. data/examples/i18n/es/features/adicion.feature +17 -0
  64. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  65. data/examples/i18n/es/lib/calculador.rb +14 -0
  66. data/examples/i18n/et/Rakefile +6 -0
  67. data/examples/i18n/et/features/jagamine.feature +10 -0
  68. data/examples/i18n/et/features/liitmine.feature +17 -0
  69. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  70. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  71. data/examples/i18n/fi/.gitignore +1 -0
  72. data/examples/i18n/fi/Rakefile +6 -0
  73. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  74. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  75. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  76. data/examples/i18n/fi/lib/laskin.rb +14 -0
  77. data/examples/i18n/fr/Rakefile +6 -0
  78. data/examples/i18n/fr/features/addition.feature +18 -0
  79. data/examples/i18n/fr/features/addition2.feature +17 -0
  80. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  81. data/examples/i18n/fr/features/support/env.rb +5 -0
  82. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  83. data/examples/i18n/he/Rakefile +6 -0
  84. data/examples/i18n/he/features/addition.feature +17 -0
  85. data/examples/i18n/he/features/division.feature +10 -0
  86. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  87. data/examples/i18n/he/lib/calculator.rb +15 -0
  88. data/examples/i18n/hu/.gitignore +1 -0
  89. data/examples/i18n/hu/Rakefile +6 -0
  90. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  91. data/examples/i18n/hu/features/osztas.feature +10 -0
  92. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  93. data/examples/i18n/hu/lib/calculator.rb +14 -0
  94. data/examples/i18n/id/.gitignore +1 -0
  95. data/examples/i18n/id/Rakefile +6 -0
  96. data/examples/i18n/id/features/addition.feature +17 -0
  97. data/examples/i18n/id/features/division.feature +10 -0
  98. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  99. data/examples/i18n/id/lib/calculator.rb +14 -0
  100. data/examples/i18n/it/Rakefile +6 -0
  101. data/examples/i18n/it/features/somma.feature +11 -0
  102. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  103. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  104. data/examples/i18n/ja/.gitignore +1 -0
  105. data/examples/i18n/ja/Rakefile +6 -0
  106. data/examples/i18n/ja/features/addition.feature +17 -0
  107. data/examples/i18n/ja/features/division.feature +10 -0
  108. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +19 -0
  109. data/examples/i18n/ja/features/support/env.rb +5 -0
  110. data/examples/i18n/ja/lib/calculator.rb +14 -0
  111. data/examples/i18n/ko/.gitignore +1 -0
  112. data/examples/i18n/ko/Rakefile +6 -0
  113. data/examples/i18n/ko/features/addition.feature +17 -0
  114. data/examples/i18n/ko/features/division.feature +11 -0
  115. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  116. data/examples/i18n/ko/lib/calculator.rb +14 -0
  117. data/examples/i18n/lt/.gitignore +1 -0
  118. data/examples/i18n/lt/Rakefile +6 -0
  119. data/examples/i18n/lt/features/addition.feature +17 -0
  120. data/examples/i18n/lt/features/division.feature +10 -0
  121. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/lt/lib/calculator.rb +14 -0
  123. data/examples/i18n/lv/Rakefile +6 -0
  124. data/examples/i18n/lv/features/addition.feature +17 -0
  125. data/examples/i18n/lv/features/division.feature +10 -0
  126. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  127. data/examples/i18n/lv/lib/calculator.rb +14 -0
  128. data/examples/i18n/no/Rakefile +6 -0
  129. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  130. data/examples/i18n/no/features/summering.feature +19 -0
  131. data/examples/i18n/no/features/support/env.rb +6 -0
  132. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  133. data/examples/i18n/pl/.gitignore +1 -0
  134. data/examples/i18n/pl/Rakefile +6 -0
  135. data/examples/i18n/pl/features/addition.feature +17 -0
  136. data/examples/i18n/pl/features/division.feature +10 -0
  137. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  138. data/examples/i18n/pl/features/support/env.rb +5 -0
  139. data/examples/i18n/pl/lib/calculator.rb +14 -0
  140. data/examples/i18n/pt/Rakefile +6 -0
  141. data/examples/i18n/pt/features/adicao.feature +11 -0
  142. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  143. data/examples/i18n/pt/features/support/env.rb +5 -0
  144. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  145. data/examples/i18n/ro/Rakefile +6 -0
  146. data/examples/i18n/ro/features/adunare.feature +12 -0
  147. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +21 -0
  148. data/examples/i18n/ro/lib/calculator.rb +11 -0
  149. data/examples/i18n/ru/Rakefile +6 -0
  150. data/examples/i18n/ru/features/addition.feature +11 -0
  151. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  152. data/examples/i18n/ru/features/division.feature +16 -0
  153. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  154. data/examples/i18n/ru/features/support/env.rb +5 -0
  155. data/examples/i18n/ru/features/support/world.rb +8 -0
  156. data/examples/i18n/ru/lib/calculator.rb +24 -0
  157. data/examples/i18n/sk/.gitignore +1 -0
  158. data/examples/i18n/sk/Rakefile +6 -0
  159. data/examples/i18n/sk/features/addition.feature +17 -0
  160. data/examples/i18n/sk/features/division.feature +10 -0
  161. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  162. data/examples/i18n/sk/lib/calculator.rb +14 -0
  163. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  164. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  165. data/examples/i18n/sr-Cyrl/features/step_definitons/calculator_steps.rb +20 -0
  166. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  167. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  168. data/examples/i18n/sr-Latn/Rakefile +6 -0
  169. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  170. data/examples/i18n/sr-Latn/features/step_definitons/calculator_steps.rb +24 -0
  171. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  172. data/examples/i18n/sv/Rakefile +6 -0
  173. data/examples/i18n/sv/features/step_definitons/kalkulator_steps.rb +24 -0
  174. data/examples/i18n/sv/features/summering.feature +18 -0
  175. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  176. data/examples/i18n/tr/.gitignore +1 -0
  177. data/examples/i18n/tr/Rakefile +6 -0
  178. data/examples/i18n/tr/features/bolme.feature +10 -0
  179. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  180. data/examples/i18n/tr/features/toplama.feature +18 -0
  181. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  182. data/examples/i18n/uk/Rakefile +6 -0
  183. data/examples/i18n/uk/features/addition.feature +11 -0
  184. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  185. data/examples/i18n/uk/features/division.feature +16 -0
  186. data/examples/i18n/uk/features/step_definitons/calculator_steps.rb +19 -0
  187. data/examples/i18n/uk/features/support/env.rb +5 -0
  188. data/examples/i18n/uk/features/support/world.rb +8 -0
  189. data/examples/i18n/uk/lib/calculator.rb +24 -0
  190. data/examples/i18n/uz/Rakefile +6 -0
  191. data/examples/i18n/uz/features/addition.feature +10 -0
  192. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  193. data/examples/i18n/uz/features/division.feature +17 -0
  194. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  195. data/examples/i18n/uz/features/support/env.rb +5 -0
  196. data/examples/i18n/uz/features/support/world.rb +8 -0
  197. data/examples/i18n/uz/lib/calculator.rb +24 -0
  198. data/examples/i18n/zh-CN/Rakefile +4 -0
  199. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  200. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  201. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  202. data/examples/i18n/zh-TW/.gitignore +1 -0
  203. data/examples/i18n/zh-TW/Rakefile +4 -0
  204. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  205. data/examples/i18n/zh-TW/features/division.feature +11 -0
  206. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  207. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  208. data/examples/python/README.textile +7 -0
  209. data/examples/python/Rakefile +4 -0
  210. data/examples/python/features/fibonacci.feature +19 -0
  211. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  212. data/examples/python/lib/.gitignore +1 -0
  213. data/examples/python/lib/fib.py +7 -0
  214. data/examples/ramaze/README.textile +7 -0
  215. data/examples/ramaze/Rakefile +6 -0
  216. data/examples/ramaze/app.rb +21 -0
  217. data/examples/ramaze/features/add.feature +11 -0
  218. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  219. data/examples/ramaze/features/support/env.rb +32 -0
  220. data/examples/ramaze/layout/default.html.erb +8 -0
  221. data/examples/ramaze/view/index.html.erb +5 -0
  222. data/examples/rspec_doubles/Rakefile +4 -0
  223. data/examples/rspec_doubles/features/mocking.feature +9 -0
  224. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  225. data/examples/rspec_doubles/features/support/env.rb +12 -0
  226. data/examples/ruby2python/README.textile +7 -0
  227. data/examples/ruby2python/Rakefile +4 -0
  228. data/examples/ruby2python/features/fibonacci.feature +19 -0
  229. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  230. data/examples/ruby2python/features/support/env.rb +21 -0
  231. data/examples/ruby2python/lib/.gitignore +1 -0
  232. data/examples/ruby2python/lib/fib.py +7 -0
  233. data/examples/sinatra/README.textile +13 -0
  234. data/examples/sinatra/Rakefile +6 -0
  235. data/examples/sinatra/app.rb +14 -0
  236. data/examples/sinatra/features/add.feature +11 -0
  237. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  238. data/examples/sinatra/features/support/env.rb +10 -0
  239. data/examples/sinatra/views/add.erb +7 -0
  240. data/examples/sinatra/views/layout.erb +8 -0
  241. data/examples/tcl/README.textile +11 -0
  242. data/examples/tcl/Rakefile +6 -0
  243. data/examples/tcl/features/fibonnacci.feature +17 -0
  244. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  245. data/examples/tcl/features/support/env.rb +6 -0
  246. data/examples/tcl/src/fib.tcl +3 -0
  247. data/examples/test_unit/Rakefile +6 -0
  248. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  249. data/examples/test_unit/features/test_unit.feature +9 -0
  250. data/examples/v8/Rakefile +6 -0
  251. data/examples/v8/features/fibonacci.feature +43 -0
  252. data/examples/v8/features/step_definitions/fib_steps.js +49 -0
  253. data/examples/v8/features/support/env.js +14 -0
  254. data/examples/v8/lib/fibonacci.js +19 -0
  255. data/examples/watir/.gitignore +2 -0
  256. data/examples/watir/README.textile +16 -0
  257. data/examples/watir/Rakefile +12 -0
  258. data/examples/watir/cucumber.yml +1 -0
  259. data/examples/watir/features/search.feature +12 -0
  260. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  261. data/examples/watir/features/support/env.rb +32 -0
  262. data/examples/watir/features/support/screenshots.rb +47 -0
  263. data/features/background.feature +498 -0
  264. data/features/bootstrap.feature +13 -0
  265. data/features/custom_formatter.feature +41 -0
  266. data/features/execute_with_tag_filter.feature +63 -0
  267. data/features/hooks.feature +59 -0
  268. data/features/iso-8859-1.feature +6 -0
  269. data/features/json_formatter.feature +248 -0
  270. data/features/stats_formatters.feature +70 -0
  271. data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +168 -0
  272. data/features/step_definitions/cucumber_steps.rb +23 -0
  273. data/features/step_definitions/iso-8859-1_steps.rb +24 -0
  274. data/features/support/env.rb +26 -0
  275. data/features/tagged_hooks.feature +217 -0
  276. data/features/transforms.feature +63 -0
  277. data/fixtures/json/features/background.feature +7 -0
  278. data/fixtures/json/features/embed.feature +4 -0
  279. data/fixtures/json/features/one_passing_one_failing.feature +11 -0
  280. data/fixtures/json/features/step_definitions/steps.rb +32 -0
  281. data/fixtures/json/features/tables.feature +13 -0
  282. data/fixtures/junit/features/one_passing_one_failing.feature +8 -0
  283. data/fixtures/junit/features/pending.feature +7 -0
  284. data/fixtures/junit/features/scenario_outline.feature +9 -0
  285. data/fixtures/junit/features/some_subdirectory/one_passing_one_failing.feature +8 -0
  286. data/fixtures/junit/features/step_definitions/steps.rb +11 -0
  287. data/fixtures/self_test/.gitignore +1 -0
  288. data/fixtures/self_test/README.textile +6 -0
  289. data/fixtures/self_test/Rakefile +6 -0
  290. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  291. data/fixtures/self_test/features/failing_expectation.feature +4 -0
  292. data/fixtures/self_test/features/lots_of_undefined.feature +8 -0
  293. data/fixtures/self_test/features/multiline_name.feature +27 -0
  294. data/fixtures/self_test/features/outline_sample.feature +15 -0
  295. data/fixtures/self_test/features/sample.feature +21 -0
  296. data/fixtures/self_test/features/search_sample.feature +32 -0
  297. data/fixtures/self_test/features/step_definitions/sample_steps.rb +84 -0
  298. data/fixtures/self_test/features/support/bubble_256x256.png +0 -0
  299. data/fixtures/self_test/features/support/env.rb +26 -0
  300. data/fixtures/self_test/features/tags_sample.feature +17 -0
  301. data/fixtures/self_test/features/tons_of_cukes.feature +52 -0
  302. data/fixtures/self_test/features/undefined_multiline_args.feature +12 -0
  303. data/fixtures/self_test/list-of-features.txt +1 -0
  304. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  305. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  306. data/fixtures/tickets/Rakefile +20 -0
  307. data/fixtures/tickets/features.html +138 -0
  308. data/fixtures/tickets/features/172.feature +28 -0
  309. data/fixtures/tickets/features/177/1.feature +28 -0
  310. data/fixtures/tickets/features/177/2.feature +20 -0
  311. data/fixtures/tickets/features/177/3.feature +18 -0
  312. data/fixtures/tickets/features/180.feature +7 -0
  313. data/fixtures/tickets/features/229/tagged_hooks.feature +8 -0
  314. data/fixtures/tickets/features/229/tagged_hooks.rb +14 -0
  315. data/fixtures/tickets/features/236.feature +13 -0
  316. data/fixtures/tickets/features/241.feature +12 -0
  317. data/fixtures/tickets/features/246.feature +4 -0
  318. data/fixtures/tickets/features/248.feature +11 -0
  319. data/fixtures/tickets/features/270/back.feature +14 -0
  320. data/fixtures/tickets/features/270/back.steps.rb +14 -0
  321. data/fixtures/tickets/features/272/hooks.feature +26 -0
  322. data/fixtures/tickets/features/272/hooks_steps.rb +53 -0
  323. data/fixtures/tickets/features/279/py_string_indent.feature +25 -0
  324. data/fixtures/tickets/features/279/py_string_indent.steps.rb +12 -0
  325. data/fixtures/tickets/features/279/wrong.feature_ +11 -0
  326. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  327. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  328. data/fixtures/tickets/features/306/only_background.feature +4 -0
  329. data/fixtures/tickets/features/around_timeout.feature +6 -0
  330. data/fixtures/tickets/features/gherkin_67.feature +12 -0
  331. data/fixtures/tickets/features/gherkin_68.feature +4 -0
  332. data/fixtures/tickets/features/half_manual.feature +11 -0
  333. data/fixtures/tickets/features/lib/eatting_machine.rb +18 -0
  334. data/fixtures/tickets/features/lib/pantry.rb +20 -0
  335. data/fixtures/tickets/features/scenario_outline.feature +95 -0
  336. data/fixtures/tickets/features/step_definitons/246_steps.rb +3 -0
  337. data/fixtures/tickets/features/step_definitons/248_steps.rb +15 -0
  338. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +9 -0
  339. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +11 -0
  340. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  341. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +88 -0
  342. data/fixtures/tickets/features/table_diffing.feature +13 -0
  343. data/fixtures/tickets/features/tickets.feature +28 -0
  344. data/gem_tasks/contributors.rake +15 -0
  345. data/gem_tasks/cucumber.rake +21 -0
  346. data/gem_tasks/downloads.rb +7 -0
  347. data/gem_tasks/environment.rake +7 -0
  348. data/gem_tasks/examples.rake +11 -0
  349. data/gem_tasks/fix_cr_lf.rake +10 -0
  350. data/gem_tasks/flog.rake +4 -0
  351. data/gem_tasks/rspec.rake +8 -0
  352. data/gem_tasks/sass.rake +4 -0
  353. data/gem_tasks/stats +14 -0
  354. data/gem_tasks/versions.txt +74 -0
  355. data/gem_tasks/yard.rake +0 -0
  356. data/gem_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  357. data/gem_tasks/yard/default/layout/html/footer.erb +5 -0
  358. data/gem_tasks/yard/default/layout/html/index.erb +1 -0
  359. data/gem_tasks/yard/default/layout/html/layout.erb +25 -0
  360. data/gem_tasks/yard/default/layout/html/logo.erb +1 -0
  361. data/gem_tasks/yard/default/layout/html/setup.rb +4 -0
  362. data/legacy_features/announce.feature +152 -0
  363. data/legacy_features/api/list_step_defs_as_json.feature +50 -0
  364. data/legacy_features/api/run_cli_main_with_existing_runtime.feature +34 -0
  365. data/legacy_features/around_hooks.feature +232 -0
  366. data/legacy_features/bug_371.feature +32 -0
  367. data/legacy_features/bug_464.feature +16 -0
  368. data/legacy_features/bug_475.feature +42 -0
  369. data/legacy_features/bug_585_tab_indentation.feature +22 -0
  370. data/legacy_features/bug_600.feature +73 -0
  371. data/legacy_features/call_steps_from_stepdefs.feature +154 -0
  372. data/legacy_features/cucumber_cli.feature +591 -0
  373. data/legacy_features/cucumber_cli_outlines.feature +117 -0
  374. data/legacy_features/default_snippets.feature +42 -0
  375. data/legacy_features/diffing.feature +25 -0
  376. data/legacy_features/drb_server_integration.feature +174 -0
  377. data/legacy_features/exception_in_after_block.feature +127 -0
  378. data/legacy_features/exception_in_after_step_block.feature +104 -0
  379. data/legacy_features/exception_in_before_block.feature +98 -0
  380. data/legacy_features/exclude_files.feature +20 -0
  381. data/legacy_features/expand.feature +60 -0
  382. data/legacy_features/html_formatter.feature +8 -0
  383. data/legacy_features/html_formatter/a.html +561 -0
  384. data/legacy_features/junit_formatter.feature +164 -0
  385. data/legacy_features/language_from_header.feature +30 -0
  386. data/legacy_features/language_help.feature +77 -0
  387. data/legacy_features/listener_debugger_formatter.feature +42 -0
  388. data/legacy_features/multiline_names.feature +44 -0
  389. data/legacy_features/post_configuration_hook.feature +50 -0
  390. data/legacy_features/profiles.feature +126 -0
  391. data/legacy_features/rake_task.feature +152 -0
  392. data/legacy_features/report_called_undefined_steps.feature +34 -0
  393. data/legacy_features/rerun_formatter.feature +52 -0
  394. data/legacy_features/simplest.feature +11 -0
  395. data/legacy_features/snippet.feature +23 -0
  396. data/legacy_features/snippets_when_using_star_keyword.feature +36 -0
  397. data/legacy_features/step_definitions/cucumber_steps.rb +172 -0
  398. data/legacy_features/step_definitions/extra_steps.rb +2 -0
  399. data/legacy_features/step_definitions/simplest_steps.rb +3 -0
  400. data/legacy_features/step_definitions/wire_steps.rb +34 -0
  401. data/legacy_features/support/env.rb +157 -0
  402. data/legacy_features/support/env.rb.simplest +7 -0
  403. data/legacy_features/support/fake_wire_server.rb +77 -0
  404. data/legacy_features/table_diffing.feature +45 -0
  405. data/legacy_features/table_mapping.feature +34 -0
  406. data/legacy_features/transform.feature +245 -0
  407. data/legacy_features/unicode_table.feature +35 -0
  408. data/legacy_features/wire_protocol.feature +332 -0
  409. data/legacy_features/wire_protocol_erb.feature +57 -0
  410. data/legacy_features/wire_protocol_table_diffing.feature +119 -0
  411. data/legacy_features/wire_protocol_tags.feature +87 -0
  412. data/legacy_features/wire_protocol_timeouts.feature +63 -0
  413. data/legacy_features/work_in_progress.feature +156 -0
  414. data/lib/README.rdoc +12 -0
  415. data/lib/autotest/cucumber.rb +6 -0
  416. data/lib/autotest/cucumber_mixin.rb +135 -0
  417. data/lib/autotest/cucumber_rails.rb +6 -0
  418. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  419. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  420. data/lib/autotest/cucumber_rspec.rb +6 -0
  421. data/lib/autotest/cucumber_rspec2.rb +6 -0
  422. data/lib/autotest/discover.rb +9 -0
  423. data/lib/cucumber.rb +27 -0
  424. data/lib/cucumber/ast.rb +30 -0
  425. data/lib/cucumber/ast/background.rb +101 -0
  426. data/lib/cucumber/ast/comment.rb +31 -0
  427. data/lib/cucumber/ast/doc_string.rb +80 -0
  428. data/lib/cucumber/ast/examples.rb +46 -0
  429. data/lib/cucumber/ast/feature.rb +106 -0
  430. data/lib/cucumber/ast/feature_element.rb +78 -0
  431. data/lib/cucumber/ast/features.rb +35 -0
  432. data/lib/cucumber/ast/names.rb +13 -0
  433. data/lib/cucumber/ast/outline_table.rb +187 -0
  434. data/lib/cucumber/ast/scenario.rb +119 -0
  435. data/lib/cucumber/ast/scenario_outline.rb +125 -0
  436. data/lib/cucumber/ast/step.rb +126 -0
  437. data/lib/cucumber/ast/step_collection.rb +76 -0
  438. data/lib/cucumber/ast/step_invocation.rb +206 -0
  439. data/lib/cucumber/ast/table.rb +689 -0
  440. data/lib/cucumber/ast/tags.rb +28 -0
  441. data/lib/cucumber/ast/tree_walker.rb +183 -0
  442. data/lib/cucumber/ast/visitor.rb +11 -0
  443. data/lib/cucumber/broadcaster.rb +13 -0
  444. data/lib/cucumber/cli/configuration.rb +209 -0
  445. data/lib/cucumber/cli/drb_client.rb +43 -0
  446. data/lib/cucumber/cli/main.rb +78 -0
  447. data/lib/cucumber/cli/options.rb +410 -0
  448. data/lib/cucumber/cli/profile_loader.rb +91 -0
  449. data/lib/cucumber/configuration.rb +49 -0
  450. data/lib/cucumber/constantize.rb +34 -0
  451. data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +25 -0
  452. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  453. data/lib/cucumber/core_ext/proc.rb +34 -0
  454. data/lib/cucumber/core_ext/string.rb +9 -0
  455. data/lib/cucumber/errors.rb +40 -0
  456. data/lib/cucumber/feature_file.rb +101 -0
  457. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  458. data/lib/cucumber/formatter/console.rb +187 -0
  459. data/lib/cucumber/formatter/cucumber.css +279 -0
  460. data/lib/cucumber/formatter/cucumber.sass +247 -0
  461. data/lib/cucumber/formatter/debug.rb +33 -0
  462. data/lib/cucumber/formatter/duration.rb +13 -0
  463. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +83 -0
  464. data/lib/cucumber/formatter/gpretty.rb +24 -0
  465. data/lib/cucumber/formatter/html.rb +649 -0
  466. data/lib/cucumber/formatter/io.rb +31 -0
  467. data/lib/cucumber/formatter/jquery-min.js +154 -0
  468. data/lib/cucumber/formatter/json.rb +31 -0
  469. data/lib/cucumber/formatter/json_pretty.rb +13 -0
  470. data/lib/cucumber/formatter/junit.rb +155 -0
  471. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  472. data/lib/cucumber/formatter/pdf.rb +244 -0
  473. data/lib/cucumber/formatter/pretty.rb +237 -0
  474. data/lib/cucumber/formatter/progress.rb +92 -0
  475. data/lib/cucumber/formatter/rerun.rb +68 -0
  476. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  477. data/lib/cucumber/formatter/steps.rb +49 -0
  478. data/lib/cucumber/formatter/summary.rb +35 -0
  479. data/lib/cucumber/formatter/unicode.rb +79 -0
  480. data/lib/cucumber/formatter/usage.rb +127 -0
  481. data/lib/cucumber/js_support/js_dsl.js +57 -0
  482. data/lib/cucumber/js_support/js_language.rb +185 -0
  483. data/lib/cucumber/js_support/js_snippets.rb +27 -0
  484. data/lib/cucumber/language_support.rb +30 -0
  485. data/lib/cucumber/language_support/language_methods.rb +129 -0
  486. data/lib/cucumber/parser.rb +2 -0
  487. data/lib/cucumber/parser/gherkin_builder.rb +129 -0
  488. data/lib/cucumber/platform.rb +29 -0
  489. data/lib/cucumber/py_support/py_dsl.py +10 -0
  490. data/lib/cucumber/py_support/py_language.py +10 -0
  491. data/lib/cucumber/py_support/py_language.rb +84 -0
  492. data/lib/cucumber/rake/task.rb +225 -0
  493. data/lib/cucumber/rb_support/rb_dsl.rb +112 -0
  494. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  495. data/lib/cucumber/rb_support/rb_language.rb +195 -0
  496. data/lib/cucumber/rb_support/rb_step_definition.rb +82 -0
  497. data/lib/cucumber/rb_support/rb_transform.rb +54 -0
  498. data/lib/cucumber/rb_support/rb_world.rb +103 -0
  499. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  500. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  501. data/lib/cucumber/rspec/doubles.rb +16 -0
  502. data/lib/cucumber/runtime.rb +145 -0
  503. data/lib/cucumber/runtime/features_loader.rb +62 -0
  504. data/lib/cucumber/runtime/for_programming_languages.rb +67 -0
  505. data/lib/cucumber/runtime/results.rb +64 -0
  506. data/lib/cucumber/runtime/support_code.rb +203 -0
  507. data/lib/cucumber/runtime/user_interface.rb +81 -0
  508. data/lib/cucumber/step_argument.rb +9 -0
  509. data/lib/cucumber/step_definition_light.rb +20 -0
  510. data/lib/cucumber/step_definitions.rb +14 -0
  511. data/lib/cucumber/step_match.rb +115 -0
  512. data/lib/cucumber/step_mother.rb +10 -0
  513. data/lib/cucumber/wire_support/configuration.rb +31 -0
  514. data/lib/cucumber/wire_support/connection.rb +55 -0
  515. data/lib/cucumber/wire_support/request_handler.rb +32 -0
  516. data/lib/cucumber/wire_support/wire_exception.rb +32 -0
  517. data/lib/cucumber/wire_support/wire_language.rb +54 -0
  518. data/lib/cucumber/wire_support/wire_packet.rb +32 -0
  519. data/lib/cucumber/wire_support/wire_protocol.rb +44 -0
  520. data/lib/cucumber/wire_support/wire_protocol/requests.rb +123 -0
  521. data/lib/cucumber/wire_support/wire_step_definition.rb +26 -0
  522. data/spec/cucumber/ast/background_spec.rb +115 -0
  523. data/spec/cucumber/ast/doc_string_spec.rb +40 -0
  524. data/spec/cucumber/ast/feature_factory.rb +61 -0
  525. data/spec/cucumber/ast/feature_spec.rb +63 -0
  526. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  527. data/spec/cucumber/ast/scenario_outline_spec.rb +69 -0
  528. data/spec/cucumber/ast/step_spec.rb +66 -0
  529. data/spec/cucumber/ast/table_spec.rb +484 -0
  530. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  531. data/spec/cucumber/broadcaster_spec.rb +15 -0
  532. data/spec/cucumber/cli/configuration_spec.rb +431 -0
  533. data/spec/cucumber/cli/drb_client_spec.rb +76 -0
  534. data/spec/cucumber/cli/main_spec.rb +137 -0
  535. data/spec/cucumber/cli/options_spec.rb +358 -0
  536. data/spec/cucumber/cli/profile_loader_spec.rb +35 -0
  537. data/spec/cucumber/configuration_spec.rb +23 -0
  538. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  539. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  540. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  541. data/spec/cucumber/formatter/html_spec.rb +256 -0
  542. data/spec/cucumber/formatter/junit_spec.rb +125 -0
  543. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  544. data/spec/cucumber/formatter/spec_helper.rb +52 -0
  545. data/spec/cucumber/rake/forked_spec.rb +62 -0
  546. data/spec/cucumber/rake/rcov_spec.rb +71 -0
  547. data/spec/cucumber/rb_support/rb_language_spec.rb +282 -0
  548. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +98 -0
  549. data/spec/cucumber/rb_support/rb_transform_spec.rb +21 -0
  550. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  551. data/spec/cucumber/runtime/support_code_spec.rb +112 -0
  552. data/spec/cucumber/runtime_spec.rb +41 -0
  553. data/spec/cucumber/sell_cucumbers.feature +19 -0
  554. data/spec/cucumber/step_match_spec.rb +69 -0
  555. data/spec/cucumber/wire_support/configuration_spec.rb +51 -0
  556. data/spec/cucumber/wire_support/connection_spec.rb +46 -0
  557. data/spec/cucumber/wire_support/wire_exception_spec.rb +44 -0
  558. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  559. data/spec/cucumber/wire_support/wire_packet_spec.rb +40 -0
  560. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +20 -0
  561. data/spec/cucumber/world/pending_spec.rb +46 -0
  562. data/spec/spec_helper.rb +22 -0
  563. metadata +1044 -0
@@ -0,0 +1,225 @@
1
+ require 'cucumber/platform'
2
+ require 'gherkin/formatter/ansi_escapes'
3
+ begin
4
+ # Support Rake > 0.8.7
5
+ require 'rake/dsl_definition'
6
+ rescue LoadError
7
+ end
8
+
9
+ module Cucumber
10
+ module Rake
11
+ # Defines a Rake task for running features.
12
+ #
13
+ # The simplest use of it goes something like:
14
+ #
15
+ # Cucumber::Rake::Task.new
16
+ #
17
+ # This will define a task named <tt>cucumber</tt> described as 'Run Cucumber features'.
18
+ # It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
19
+ #
20
+ # To further configure the task, you can pass a block:
21
+ #
22
+ # Cucumber::Rake::Task.new do |t|
23
+ # t.cucumber_opts = %w{--format progress}
24
+ # end
25
+ #
26
+ # This task can also be configured to be run with RCov:
27
+ #
28
+ # Cucumber::Rake::Task.new do |t|
29
+ # t.rcov = true
30
+ # end
31
+ #
32
+ # See the attributes for additional configuration possibilities.
33
+ class Task
34
+ include Gherkin::Formatter::AnsiEscapes
35
+ include ::Rake::DSL if defined?(::Rake::DSL)
36
+
37
+ class InProcessCucumberRunner #:nodoc:
38
+ include ::Rake::DSL if defined?(::Rake::DSL)
39
+
40
+ attr_reader :args
41
+
42
+ def initialize(libs, cucumber_opts, feature_files)
43
+ raise "libs must be an Array when running in-process" unless Array === libs
44
+ libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
45
+ @args = (
46
+ cucumber_opts +
47
+ feature_files
48
+ ).flatten.compact
49
+ end
50
+
51
+ def run
52
+ require 'cucumber/cli/main'
53
+ failure = Cucumber::Cli::Main.execute(args)
54
+ raise "Cucumber failed" if failure
55
+ end
56
+ end
57
+
58
+ class ForkedCucumberRunner #:nodoc:
59
+ include ::Rake::DSL if defined?(::Rake::DSL)
60
+
61
+ def initialize(libs, cucumber_bin, cucumber_opts, bundler, feature_files)
62
+ @libs = libs
63
+ @cucumber_bin = cucumber_bin
64
+ @cucumber_opts = cucumber_opts
65
+ @bundler = bundler
66
+ @feature_files = feature_files
67
+ end
68
+
69
+ def load_path(libs)
70
+ ['"%s"' % @libs.join(File::PATH_SEPARATOR)]
71
+ end
72
+
73
+ def quoted_binary(cucumber_bin)
74
+ ['"%s"' % cucumber_bin]
75
+ end
76
+
77
+ def use_bundler
78
+ @bundler.nil? ? File.exist?("./Gemfile") && gem_available?("bundler") : @bundler
79
+ end
80
+
81
+ def gem_available?(gemname)
82
+ gem_available_new_rubygems?(gemname) || gem_available_old_rubygems?(gemname)
83
+ end
84
+
85
+ def gem_available_old_rubygems?(gemname)
86
+ Gem.available?(gemname)
87
+ end
88
+
89
+ def gem_available_new_rubygems?(gemname)
90
+ Gem::Specification.respond_to?(:find_all_by_name) && Gem::Specification.find_all_by_name(gemname).any?
91
+ end
92
+
93
+ def cmd
94
+ if use_bundler
95
+ [ Cucumber::RUBY_BINARY, '-S', 'bundle', 'exec', 'cucumber', @cucumber_opts,
96
+ @feature_files ].flatten
97
+ else
98
+ [ Cucumber::RUBY_BINARY, '-I', load_path(@libs), quoted_binary(@cucumber_bin),
99
+ @cucumber_opts, @feature_files ].flatten
100
+ end
101
+ end
102
+
103
+ def run
104
+ sh(cmd.join(" "))
105
+ end
106
+ end
107
+
108
+ class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
109
+
110
+ def initialize(libs, cucumber_bin, cucumber_opts, bundler, feature_files, rcov_opts)
111
+ super( libs, cucumber_bin, cucumber_opts, bundler, feature_files )
112
+ @rcov_opts = rcov_opts
113
+ end
114
+
115
+ def cmd
116
+ if use_bundler
117
+ [Cucumber::RUBY_BINARY, '-S', 'bundle', 'exec', 'rcov', @rcov_opts,
118
+ quoted_binary(@cucumber_bin), '--', @cucumber_opts, @feature_files].flatten
119
+ else
120
+ [Cucumber::RUBY_BINARY, '-I', load_path(@libs), '-S', 'rcov', @rcov_opts,
121
+ quoted_binary(@cucumber_bin), '--', @cucumber_opts, @feature_files].flatten
122
+ end
123
+ end
124
+
125
+ end
126
+
127
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') #:nodoc:
128
+
129
+ # Directories to add to the Ruby $LOAD_PATH
130
+ attr_accessor :libs
131
+
132
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
133
+ attr_accessor :binary
134
+
135
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
136
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
137
+ attr_accessor :cucumber_opts
138
+ def cucumber_opts=(opts) #:nodoc:
139
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
140
+ end
141
+
142
+ # Run cucumber with RCov? Defaults to false. If you set this to
143
+ # true, +fork+ is implicit.
144
+ attr_accessor :rcov
145
+ def rcov=(flag)
146
+ if(flag && Cucumber::RUBY_1_9)
147
+ raise failed + "RCov only works on Ruby 1.8.x. You may want to use SimpleCov: https://github.com/colszowka/simplecov" + reset
148
+ end
149
+ @rcov = flag
150
+ end
151
+
152
+ # Extra options to pass to rcov.
153
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
154
+ attr_accessor :rcov_opts
155
+ def rcov_opts=(opts) #:nodoc:
156
+ @rcov_opts = String === opts ? opts.split(' ') : opts
157
+ end
158
+
159
+ # Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
160
+ # some startup speed if you set it to false, but this may also cause issues with
161
+ # your load path and gems.
162
+ attr_accessor :fork
163
+
164
+ # Define what profile to be used. When used with cucumber_opts it is simply appended
165
+ # to it. Will be ignored when CUCUMBER_OPTS is used.
166
+ attr_accessor :profile
167
+
168
+ # Whether or not to run with bundler (bundle exec). Setting this to false may speed
169
+ # up the execution. The default value is true if Bundler is installed and you have
170
+ # a Gemfile, false otherwise.
171
+ #
172
+ # Note that this attribute has no effect if you don't run in forked mode.
173
+ attr_accessor :bundler
174
+
175
+ # Define Cucumber Rake task
176
+ def initialize(task_name = "cucumber", desc = "Run Cucumber features")
177
+ @task_name, @desc = task_name, desc
178
+ @fork = true
179
+ @libs = ['lib']
180
+ @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
181
+
182
+ yield self if block_given?
183
+
184
+ @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
185
+ @libs.insert(0, LIB) if binary == Cucumber::BINARY
186
+
187
+ define_task
188
+ end
189
+
190
+ def define_task #:nodoc:
191
+ desc @desc
192
+ task @task_name do
193
+ runner.run
194
+ end
195
+ end
196
+
197
+ def runner(task_args = nil) #:nodoc:
198
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
199
+ if(@rcov)
200
+ RCovCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files, rcov_opts)
201
+ elsif(@fork)
202
+ ForkedCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files)
203
+ else
204
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
205
+ end
206
+ end
207
+
208
+ def cucumber_opts_with_profile #:nodoc:
209
+ @profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
210
+ end
211
+
212
+ def feature_files #:nodoc:
213
+ if ENV['FEATURES']
214
+ make_command_line_safe(ENV['FEATURES'].split(','))
215
+ else
216
+ make_command_line_safe(FileList[ ENV['FEATURE'] || [] ])
217
+ end
218
+ end
219
+
220
+ def make_command_line_safe(list)
221
+ list.map{|string| string.gsub(' ', '\ ')}
222
+ end
223
+ end
224
+ end
225
+ 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/cucumber/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