stefl-cucumber 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +7 -0
  5. data/History.txt +1613 -0
  6. data/LICENSE +22 -0
  7. data/README.rdoc +26 -0
  8. data/Rakefile +12 -0
  9. data/bin/cucumber +22 -0
  10. data/cucumber.gemspec +50 -0
  11. data/cucumber.yml +20 -0
  12. data/examples/i18n/README.textile +18 -0
  13. data/examples/i18n/Rakefile +33 -0
  14. data/examples/i18n/ar/Rakefile +6 -0
  15. data/examples/i18n/ar/features/addition.feature +17 -0
  16. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  17. data/examples/i18n/ar/lib/calculator.rb +11 -0
  18. data/examples/i18n/bg/Rakefile +6 -0
  19. data/examples/i18n/bg/features/addition.feature +12 -0
  20. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  21. data/examples/i18n/bg/features/division.feature +17 -0
  22. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/bg/features/support/env.rb +5 -0
  24. data/examples/i18n/bg/features/support/world.rb +8 -0
  25. data/examples/i18n/bg/lib/calculator.rb +24 -0
  26. data/examples/i18n/ca/Rakefile +6 -0
  27. data/examples/i18n/ca/features/step_definitons/calculator_steps.rb +21 -0
  28. data/examples/i18n/ca/features/suma.feature +17 -0
  29. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  30. data/examples/i18n/da/Rakefile +6 -0
  31. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  32. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  33. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  34. data/examples/i18n/de/.gitignore +1 -0
  35. data/examples/i18n/de/Rakefile +6 -0
  36. data/examples/i18n/de/features/addition.feature +17 -0
  37. data/examples/i18n/de/features/division.feature +10 -0
  38. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  39. data/examples/i18n/de/lib/calculator.rb +14 -0
  40. data/examples/i18n/en-lol/Rakefile +4 -0
  41. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  42. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  43. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  44. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  45. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  46. data/examples/i18n/en/.gitignore +1 -0
  47. data/examples/i18n/en/Rakefile +6 -0
  48. data/examples/i18n/en/features/addition.feature +17 -0
  49. data/examples/i18n/en/features/division.feature +10 -0
  50. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  51. data/examples/i18n/en/lib/calculator.rb +14 -0
  52. data/examples/i18n/eo/.gitignore +1 -0
  53. data/examples/i18n/eo/Rakefile +6 -0
  54. data/examples/i18n/eo/features/adicio.feature +17 -0
  55. data/examples/i18n/eo/features/divido.feature +10 -0
  56. data/examples/i18n/eo/features/step_definitons/calculator_steps.rb +24 -0
  57. data/examples/i18n/eo/lib/calculator.rb +14 -0
  58. data/examples/i18n/es/Rakefile +6 -0
  59. data/examples/i18n/es/features/adicion.feature +17 -0
  60. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  61. data/examples/i18n/es/lib/calculador.rb +14 -0
  62. data/examples/i18n/et/Rakefile +6 -0
  63. data/examples/i18n/et/features/jagamine.feature +10 -0
  64. data/examples/i18n/et/features/liitmine.feature +17 -0
  65. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  66. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  67. data/examples/i18n/fi/.gitignore +1 -0
  68. data/examples/i18n/fi/Rakefile +6 -0
  69. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  70. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  71. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  72. data/examples/i18n/fi/lib/laskin.rb +14 -0
  73. data/examples/i18n/fr/Rakefile +6 -0
  74. data/examples/i18n/fr/features/addition.feature +18 -0
  75. data/examples/i18n/fr/features/addition2.feature +17 -0
  76. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  77. data/examples/i18n/fr/features/support/env.rb +5 -0
  78. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  79. data/examples/i18n/he/Rakefile +6 -0
  80. data/examples/i18n/he/features/addition.feature +17 -0
  81. data/examples/i18n/he/features/division.feature +10 -0
  82. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  83. data/examples/i18n/he/lib/calculator.rb +15 -0
  84. data/examples/i18n/hu/.gitignore +1 -0
  85. data/examples/i18n/hu/Rakefile +6 -0
  86. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  87. data/examples/i18n/hu/features/osztas.feature +10 -0
  88. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  89. data/examples/i18n/hu/lib/calculator.rb +14 -0
  90. data/examples/i18n/id/.gitignore +1 -0
  91. data/examples/i18n/id/Rakefile +6 -0
  92. data/examples/i18n/id/features/addition.feature +17 -0
  93. data/examples/i18n/id/features/division.feature +10 -0
  94. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  95. data/examples/i18n/id/lib/calculator.rb +14 -0
  96. data/examples/i18n/it/Rakefile +6 -0
  97. data/examples/i18n/it/features/somma.feature +11 -0
  98. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  99. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  100. data/examples/i18n/ja/.gitignore +1 -0
  101. data/examples/i18n/ja/Rakefile +6 -0
  102. data/examples/i18n/ja/features/addition.feature +17 -0
  103. data/examples/i18n/ja/features/division.feature +10 -0
  104. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +19 -0
  105. data/examples/i18n/ja/features/support/env.rb +5 -0
  106. data/examples/i18n/ja/lib/calculator.rb +14 -0
  107. data/examples/i18n/ko/.gitignore +1 -0
  108. data/examples/i18n/ko/Rakefile +6 -0
  109. data/examples/i18n/ko/features/addition.feature +17 -0
  110. data/examples/i18n/ko/features/division.feature +11 -0
  111. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/ko/lib/calculator.rb +14 -0
  113. data/examples/i18n/lt/.gitignore +1 -0
  114. data/examples/i18n/lt/Rakefile +6 -0
  115. data/examples/i18n/lt/features/addition.feature +17 -0
  116. data/examples/i18n/lt/features/division.feature +10 -0
  117. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  118. data/examples/i18n/lt/lib/calculator.rb +14 -0
  119. data/examples/i18n/lv/Rakefile +6 -0
  120. data/examples/i18n/lv/features/addition.feature +17 -0
  121. data/examples/i18n/lv/features/division.feature +10 -0
  122. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  123. data/examples/i18n/lv/lib/calculator.rb +14 -0
  124. data/examples/i18n/no/Rakefile +6 -0
  125. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  126. data/examples/i18n/no/features/summering.feature +19 -0
  127. data/examples/i18n/no/features/support/env.rb +6 -0
  128. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  129. data/examples/i18n/pl/.gitignore +1 -0
  130. data/examples/i18n/pl/Rakefile +6 -0
  131. data/examples/i18n/pl/features/addition.feature +17 -0
  132. data/examples/i18n/pl/features/division.feature +10 -0
  133. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  134. data/examples/i18n/pl/features/support/env.rb +5 -0
  135. data/examples/i18n/pl/lib/calculator.rb +14 -0
  136. data/examples/i18n/pt/Rakefile +6 -0
  137. data/examples/i18n/pt/features/adicao.feature +11 -0
  138. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  139. data/examples/i18n/pt/features/support/env.rb +5 -0
  140. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  141. data/examples/i18n/ro/Rakefile +6 -0
  142. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  143. data/examples/i18n/ro/features/suma.feature +11 -0
  144. data/examples/i18n/ro/lib/calculator.rb +11 -0
  145. data/examples/i18n/ru/Rakefile +6 -0
  146. data/examples/i18n/ru/features/addition.feature +11 -0
  147. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  148. data/examples/i18n/ru/features/division.feature +16 -0
  149. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  150. data/examples/i18n/ru/features/support/env.rb +5 -0
  151. data/examples/i18n/ru/features/support/world.rb +8 -0
  152. data/examples/i18n/ru/lib/calculator.rb +24 -0
  153. data/examples/i18n/sk/.gitignore +1 -0
  154. data/examples/i18n/sk/Rakefile +6 -0
  155. data/examples/i18n/sk/features/addition.feature +17 -0
  156. data/examples/i18n/sk/features/division.feature +10 -0
  157. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/sk/lib/calculator.rb +14 -0
  159. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  160. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  161. data/examples/i18n/sr-Cyrl/features/step_definitons/calculator_steps.rb +20 -0
  162. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  163. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  164. data/examples/i18n/sr-Latn/Rakefile +6 -0
  165. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  166. data/examples/i18n/sr-Latn/features/step_definitons/calculator_steps.rb +24 -0
  167. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  168. data/examples/i18n/sv/Rakefile +6 -0
  169. data/examples/i18n/sv/features/step_definitons/kalkulator_steps.rb +24 -0
  170. data/examples/i18n/sv/features/summering.feature +18 -0
  171. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  172. data/examples/i18n/tr/.gitignore +1 -0
  173. data/examples/i18n/tr/Rakefile +6 -0
  174. data/examples/i18n/tr/features/bolme.feature +10 -0
  175. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  176. data/examples/i18n/tr/features/toplama.feature +18 -0
  177. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  178. data/examples/i18n/uk/Rakefile +6 -0
  179. data/examples/i18n/uk/features/addition.feature +11 -0
  180. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  181. data/examples/i18n/uk/features/division.feature +16 -0
  182. data/examples/i18n/uk/features/step_definitons/calculator_steps.rb +19 -0
  183. data/examples/i18n/uk/features/support/env.rb +5 -0
  184. data/examples/i18n/uk/features/support/world.rb +8 -0
  185. data/examples/i18n/uk/lib/calculator.rb +24 -0
  186. data/examples/i18n/uz/Rakefile +6 -0
  187. data/examples/i18n/uz/features/addition.feature +10 -0
  188. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  189. data/examples/i18n/uz/features/division.feature +17 -0
  190. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  191. data/examples/i18n/uz/features/support/env.rb +5 -0
  192. data/examples/i18n/uz/features/support/world.rb +8 -0
  193. data/examples/i18n/uz/lib/calculator.rb +24 -0
  194. data/examples/i18n/zh-CN/Rakefile +4 -0
  195. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  196. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  197. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  198. data/examples/i18n/zh-TW/.gitignore +1 -0
  199. data/examples/i18n/zh-TW/Rakefile +4 -0
  200. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  201. data/examples/i18n/zh-TW/features/division.feature +11 -0
  202. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  203. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  204. data/examples/python/README.textile +7 -0
  205. data/examples/python/Rakefile +4 -0
  206. data/examples/python/features/fibonacci.feature +19 -0
  207. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  208. data/examples/python/lib/.gitignore +1 -0
  209. data/examples/python/lib/fib.py +7 -0
  210. data/examples/ramaze/README.textile +7 -0
  211. data/examples/ramaze/Rakefile +6 -0
  212. data/examples/ramaze/app.rb +21 -0
  213. data/examples/ramaze/features/add.feature +11 -0
  214. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  215. data/examples/ramaze/features/support/env.rb +32 -0
  216. data/examples/ramaze/layout/default.html.erb +8 -0
  217. data/examples/ramaze/view/index.html.erb +5 -0
  218. data/examples/rspec_doubles/Rakefile +4 -0
  219. data/examples/rspec_doubles/features/mocking.feature +9 -0
  220. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  221. data/examples/rspec_doubles/features/support/env.rb +12 -0
  222. data/examples/ruby2python/README.textile +7 -0
  223. data/examples/ruby2python/Rakefile +4 -0
  224. data/examples/ruby2python/features/fibonacci.feature +19 -0
  225. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  226. data/examples/ruby2python/features/support/env.rb +21 -0
  227. data/examples/ruby2python/lib/.gitignore +1 -0
  228. data/examples/ruby2python/lib/fib.py +7 -0
  229. data/examples/sinatra/README.textile +13 -0
  230. data/examples/sinatra/Rakefile +6 -0
  231. data/examples/sinatra/app.rb +14 -0
  232. data/examples/sinatra/features/add.feature +11 -0
  233. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  234. data/examples/sinatra/features/support/env.rb +10 -0
  235. data/examples/sinatra/views/add.erb +7 -0
  236. data/examples/sinatra/views/layout.erb +8 -0
  237. data/examples/tcl/README.textile +11 -0
  238. data/examples/tcl/Rakefile +6 -0
  239. data/examples/tcl/features/fibonnacci.feature +17 -0
  240. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  241. data/examples/tcl/features/support/env.rb +6 -0
  242. data/examples/tcl/src/fib.tcl +3 -0
  243. data/examples/test_unit/Rakefile +6 -0
  244. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  245. data/examples/test_unit/features/test_unit.feature +9 -0
  246. data/examples/v8/Rakefile +6 -0
  247. data/examples/v8/features/fibonacci.feature +43 -0
  248. data/examples/v8/features/step_definitions/fib_steps.js +49 -0
  249. data/examples/v8/features/support/env.js +14 -0
  250. data/examples/v8/lib/fibonacci.js +19 -0
  251. data/examples/watir/.gitignore +2 -0
  252. data/examples/watir/README.textile +16 -0
  253. data/examples/watir/Rakefile +12 -0
  254. data/examples/watir/cucumber.yml +1 -0
  255. data/examples/watir/features/search.feature +12 -0
  256. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  257. data/examples/watir/features/support/env.rb +32 -0
  258. data/examples/watir/features/support/screenshots.rb +47 -0
  259. data/features/background.feature +498 -0
  260. data/features/custom_formatter.feature +41 -0
  261. data/features/execute_with_tag_filter.feature +63 -0
  262. data/features/hooks.feature +59 -0
  263. data/features/json_formatter.feature +249 -0
  264. data/features/stats_formatters.feature +70 -0
  265. data/features/step_definitions/cucumber_steps.rb +8 -0
  266. data/features/support/env.rb +31 -0
  267. data/features/tagged_hooks.feature +217 -0
  268. data/fixtures/json/features/background.feature +7 -0
  269. data/fixtures/json/features/embed.feature +4 -0
  270. data/fixtures/json/features/one_passing_one_failing.feature +11 -0
  271. data/fixtures/json/features/step_definitions/steps.rb +32 -0
  272. data/fixtures/json/features/tables.feature +13 -0
  273. data/fixtures/junit/features/one_passing_one_failing.feature +8 -0
  274. data/fixtures/junit/features/pending.feature +5 -0
  275. data/fixtures/junit/features/step_definitions/steps.rb +11 -0
  276. data/fixtures/self_test/.gitignore +1 -0
  277. data/fixtures/self_test/README.textile +6 -0
  278. data/fixtures/self_test/Rakefile +6 -0
  279. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  280. data/fixtures/self_test/features/failing_expectation.feature +4 -0
  281. data/fixtures/self_test/features/lots_of_undefined.feature +8 -0
  282. data/fixtures/self_test/features/multiline_name.feature +27 -0
  283. data/fixtures/self_test/features/outline_sample.feature +15 -0
  284. data/fixtures/self_test/features/sample.feature +21 -0
  285. data/fixtures/self_test/features/search_sample.feature +32 -0
  286. data/fixtures/self_test/features/step_definitions/sample_steps.rb +84 -0
  287. data/fixtures/self_test/features/support/env.rb +18 -0
  288. data/fixtures/self_test/features/tags_sample.feature +17 -0
  289. data/fixtures/self_test/features/tons_of_cukes.feature +52 -0
  290. data/fixtures/self_test/features/undefined_multiline_args.feature +12 -0
  291. data/fixtures/self_test/list-of-features.txt +1 -0
  292. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  293. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  294. data/fixtures/tickets/Rakefile +20 -0
  295. data/fixtures/tickets/features.html +138 -0
  296. data/fixtures/tickets/features/172.feature +28 -0
  297. data/fixtures/tickets/features/177/1.feature +28 -0
  298. data/fixtures/tickets/features/177/2.feature +20 -0
  299. data/fixtures/tickets/features/177/3.feature +18 -0
  300. data/fixtures/tickets/features/180.feature +7 -0
  301. data/fixtures/tickets/features/229/tagged_hooks.feature +8 -0
  302. data/fixtures/tickets/features/229/tagged_hooks.rb +14 -0
  303. data/fixtures/tickets/features/236.feature +13 -0
  304. data/fixtures/tickets/features/241.feature +12 -0
  305. data/fixtures/tickets/features/246.feature +4 -0
  306. data/fixtures/tickets/features/248.feature +11 -0
  307. data/fixtures/tickets/features/270/back.feature +14 -0
  308. data/fixtures/tickets/features/270/back.steps.rb +14 -0
  309. data/fixtures/tickets/features/272/hooks.feature +26 -0
  310. data/fixtures/tickets/features/272/hooks_steps.rb +53 -0
  311. data/fixtures/tickets/features/279/py_string_indent.feature +25 -0
  312. data/fixtures/tickets/features/279/py_string_indent.steps.rb +12 -0
  313. data/fixtures/tickets/features/279/wrong.feature_ +11 -0
  314. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  315. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  316. data/fixtures/tickets/features/306/only_background.feature +4 -0
  317. data/fixtures/tickets/features/around_timeout.feature +6 -0
  318. data/fixtures/tickets/features/gherkin_67.feature +12 -0
  319. data/fixtures/tickets/features/gherkin_68.feature +4 -0
  320. data/fixtures/tickets/features/half_manual.feature +11 -0
  321. data/fixtures/tickets/features/lib/eatting_machine.rb +18 -0
  322. data/fixtures/tickets/features/lib/pantry.rb +20 -0
  323. data/fixtures/tickets/features/scenario_outline.feature +95 -0
  324. data/fixtures/tickets/features/step_definitons/246_steps.rb +3 -0
  325. data/fixtures/tickets/features/step_definitons/248_steps.rb +15 -0
  326. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +9 -0
  327. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +11 -0
  328. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  329. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +88 -0
  330. data/fixtures/tickets/features/table_diffing.feature +13 -0
  331. data/fixtures/tickets/features/tickets.feature +28 -0
  332. data/gem_tasks/contributors.rake +15 -0
  333. data/gem_tasks/cucumber.rake +19 -0
  334. data/gem_tasks/environment.rake +7 -0
  335. data/gem_tasks/examples.rake +11 -0
  336. data/gem_tasks/fix_cr_lf.rake +10 -0
  337. data/gem_tasks/flog.rake +4 -0
  338. data/gem_tasks/rspec.rake +8 -0
  339. data/gem_tasks/sass.rake +4 -0
  340. data/gem_tasks/sdoc.rake +12 -0
  341. data/legacy_features/announce.feature +164 -0
  342. data/legacy_features/api/list_step_defs_as_json.feature +50 -0
  343. data/legacy_features/api/run_cli_main_with_existing_runtime.feature +34 -0
  344. data/legacy_features/around_hooks.feature +232 -0
  345. data/legacy_features/bug_371.feature +32 -0
  346. data/legacy_features/bug_464.feature +16 -0
  347. data/legacy_features/bug_475.feature +42 -0
  348. data/legacy_features/bug_585_tab_indentation.feature +22 -0
  349. data/legacy_features/bug_600.feature +67 -0
  350. data/legacy_features/call_steps_from_stepdefs.feature +154 -0
  351. data/legacy_features/cucumber_cli.feature +591 -0
  352. data/legacy_features/cucumber_cli_outlines.feature +117 -0
  353. data/legacy_features/default_snippets.feature +42 -0
  354. data/legacy_features/diffing.feature +25 -0
  355. data/legacy_features/drb_server_integration.feature +174 -0
  356. data/legacy_features/exception_in_after_block.feature +127 -0
  357. data/legacy_features/exception_in_after_step_block.feature +104 -0
  358. data/legacy_features/exception_in_before_block.feature +98 -0
  359. data/legacy_features/exclude_files.feature +20 -0
  360. data/legacy_features/expand.feature +60 -0
  361. data/legacy_features/html_formatter.feature +8 -0
  362. data/legacy_features/html_formatter/a.html +550 -0
  363. data/legacy_features/junit_formatter.feature +92 -0
  364. data/legacy_features/language_from_header.feature +30 -0
  365. data/legacy_features/language_help.feature +78 -0
  366. data/legacy_features/listener_debugger_formatter.feature +42 -0
  367. data/legacy_features/multiline_names.feature +44 -0
  368. data/legacy_features/post_configuration_hook.feature +50 -0
  369. data/legacy_features/profiles.feature +126 -0
  370. data/legacy_features/rake_task.feature +152 -0
  371. data/legacy_features/report_called_undefined_steps.feature +34 -0
  372. data/legacy_features/rerun_formatter.feature +45 -0
  373. data/legacy_features/simplest.feature +11 -0
  374. data/legacy_features/snippet.feature +23 -0
  375. data/legacy_features/snippets_when_using_star_keyword.feature +36 -0
  376. data/legacy_features/step_definitions/cucumber_steps.rb +168 -0
  377. data/legacy_features/step_definitions/extra_steps.rb +2 -0
  378. data/legacy_features/step_definitions/simplest_steps.rb +3 -0
  379. data/legacy_features/step_definitions/wire_steps.rb +34 -0
  380. data/legacy_features/support/env.rb +157 -0
  381. data/legacy_features/support/env.rb.simplest +7 -0
  382. data/legacy_features/support/fake_wire_server.rb +77 -0
  383. data/legacy_features/table_diffing.feature +45 -0
  384. data/legacy_features/table_mapping.feature +34 -0
  385. data/legacy_features/transform.feature +245 -0
  386. data/legacy_features/unicode_table.feature +35 -0
  387. data/legacy_features/wire_protocol.feature +332 -0
  388. data/legacy_features/wire_protocol_table_diffing.feature +119 -0
  389. data/legacy_features/wire_protocol_tags.feature +87 -0
  390. data/legacy_features/wire_protocol_timeouts.feature +63 -0
  391. data/legacy_features/work_in_progress.feature +156 -0
  392. data/lib/README.rdoc +12 -0
  393. data/lib/autotest/cucumber.rb +6 -0
  394. data/lib/autotest/cucumber_mixin.rb +135 -0
  395. data/lib/autotest/cucumber_rails.rb +6 -0
  396. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  397. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  398. data/lib/autotest/cucumber_rspec.rb +6 -0
  399. data/lib/autotest/cucumber_rspec2.rb +6 -0
  400. data/lib/autotest/discover.rb +9 -0
  401. data/lib/cucumber.rb +27 -0
  402. data/lib/cucumber/ast.rb +30 -0
  403. data/lib/cucumber/ast/background.rb +99 -0
  404. data/lib/cucumber/ast/comment.rb +31 -0
  405. data/lib/cucumber/ast/examples.rb +43 -0
  406. data/lib/cucumber/ast/feature.rb +103 -0
  407. data/lib/cucumber/ast/feature_element.rb +78 -0
  408. data/lib/cucumber/ast/features.rb +35 -0
  409. data/lib/cucumber/ast/outline_table.rb +187 -0
  410. data/lib/cucumber/ast/py_string.rb +80 -0
  411. data/lib/cucumber/ast/scenario.rb +117 -0
  412. data/lib/cucumber/ast/scenario_outline.rb +122 -0
  413. data/lib/cucumber/ast/step.rb +126 -0
  414. data/lib/cucumber/ast/step_collection.rb +76 -0
  415. data/lib/cucumber/ast/step_invocation.rb +199 -0
  416. data/lib/cucumber/ast/table.rb +689 -0
  417. data/lib/cucumber/ast/tags.rb +28 -0
  418. data/lib/cucumber/ast/tree_walker.rb +184 -0
  419. data/lib/cucumber/ast/visitor.rb +11 -0
  420. data/lib/cucumber/broadcaster.rb +13 -0
  421. data/lib/cucumber/cli/configuration.rb +209 -0
  422. data/lib/cucumber/cli/drb_client.rb +43 -0
  423. data/lib/cucumber/cli/main.rb +78 -0
  424. data/lib/cucumber/cli/options.rb +406 -0
  425. data/lib/cucumber/cli/profile_loader.rb +91 -0
  426. data/lib/cucumber/configuration.rb +49 -0
  427. data/lib/cucumber/constantize.rb +34 -0
  428. data/lib/cucumber/core_ext/disable_mini_unit_autorun.rb +14 -0
  429. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  430. data/lib/cucumber/core_ext/proc.rb +34 -0
  431. data/lib/cucumber/core_ext/string.rb +9 -0
  432. data/lib/cucumber/errors.rb +40 -0
  433. data/lib/cucumber/feature_file.rb +62 -0
  434. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  435. data/lib/cucumber/formatter/console.rb +177 -0
  436. data/lib/cucumber/formatter/cucumber.css +275 -0
  437. data/lib/cucumber/formatter/cucumber.sass +271 -0
  438. data/lib/cucumber/formatter/debug.rb +33 -0
  439. data/lib/cucumber/formatter/duration.rb +13 -0
  440. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +84 -0
  441. data/lib/cucumber/formatter/gpretty.rb +24 -0
  442. data/lib/cucumber/formatter/html.rb +644 -0
  443. data/lib/cucumber/formatter/io.rb +31 -0
  444. data/lib/cucumber/formatter/jquery-min.js +154 -0
  445. data/lib/cucumber/formatter/json.rb +29 -0
  446. data/lib/cucumber/formatter/json_pretty.rb +13 -0
  447. data/lib/cucumber/formatter/junit.rb +150 -0
  448. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  449. data/lib/cucumber/formatter/pdf.rb +244 -0
  450. data/lib/cucumber/formatter/pretty.rb +237 -0
  451. data/lib/cucumber/formatter/progress.rb +92 -0
  452. data/lib/cucumber/formatter/rerun.rb +55 -0
  453. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  454. data/lib/cucumber/formatter/steps.rb +49 -0
  455. data/lib/cucumber/formatter/summary.rb +35 -0
  456. data/lib/cucumber/formatter/unicode.rb +79 -0
  457. data/lib/cucumber/formatter/usage.rb +127 -0
  458. data/lib/cucumber/js_support/js_dsl.js +57 -0
  459. data/lib/cucumber/js_support/js_language.rb +185 -0
  460. data/lib/cucumber/js_support/js_snippets.rb +27 -0
  461. data/lib/cucumber/language_support.rb +30 -0
  462. data/lib/cucumber/language_support/language_methods.rb +129 -0
  463. data/lib/cucumber/parser.rb +2 -0
  464. data/lib/cucumber/parser/gherkin_builder.rb +130 -0
  465. data/lib/cucumber/platform.rb +29 -0
  466. data/lib/cucumber/py_support/py_dsl.py +10 -0
  467. data/lib/cucumber/py_support/py_language.py +10 -0
  468. data/lib/cucumber/py_support/py_language.rb +84 -0
  469. data/lib/cucumber/rake/task.rb +170 -0
  470. data/lib/cucumber/rb_support/rb_dsl.rb +112 -0
  471. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  472. data/lib/cucumber/rb_support/rb_language.rb +195 -0
  473. data/lib/cucumber/rb_support/rb_step_definition.rb +82 -0
  474. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  475. data/lib/cucumber/rb_support/rb_world.rb +95 -0
  476. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  477. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  478. data/lib/cucumber/rspec/doubles.rb +16 -0
  479. data/lib/cucumber/runtime.rb +145 -0
  480. data/lib/cucumber/runtime/features_loader.rb +62 -0
  481. data/lib/cucumber/runtime/for_programming_languages.rb +65 -0
  482. data/lib/cucumber/runtime/results.rb +64 -0
  483. data/lib/cucumber/runtime/support_code.rb +203 -0
  484. data/lib/cucumber/runtime/user_interface.rb +80 -0
  485. data/lib/cucumber/step_argument.rb +9 -0
  486. data/lib/cucumber/step_definition_light.rb +20 -0
  487. data/lib/cucumber/step_definitions.rb +14 -0
  488. data/lib/cucumber/step_match.rb +115 -0
  489. data/lib/cucumber/step_mother.rb +10 -0
  490. data/lib/cucumber/wire_support/configuration.rb +30 -0
  491. data/lib/cucumber/wire_support/connection.rb +55 -0
  492. data/lib/cucumber/wire_support/request_handler.rb +32 -0
  493. data/lib/cucumber/wire_support/wire_exception.rb +32 -0
  494. data/lib/cucumber/wire_support/wire_language.rb +54 -0
  495. data/lib/cucumber/wire_support/wire_packet.rb +32 -0
  496. data/lib/cucumber/wire_support/wire_protocol.rb +44 -0
  497. data/lib/cucumber/wire_support/wire_protocol/requests.rb +123 -0
  498. data/lib/cucumber/wire_support/wire_step_definition.rb +26 -0
  499. data/spec/cucumber/ast/background_spec.rb +110 -0
  500. data/spec/cucumber/ast/feature_factory.rb +60 -0
  501. data/spec/cucumber/ast/feature_spec.rb +63 -0
  502. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  503. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  504. data/spec/cucumber/ast/scenario_outline_spec.rb +68 -0
  505. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  506. data/spec/cucumber/ast/step_spec.rb +66 -0
  507. data/spec/cucumber/ast/table_spec.rb +474 -0
  508. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  509. data/spec/cucumber/broadcaster_spec.rb +15 -0
  510. data/spec/cucumber/cli/configuration_spec.rb +431 -0
  511. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  512. data/spec/cucumber/cli/main_spec.rb +137 -0
  513. data/spec/cucumber/cli/options_spec.rb +351 -0
  514. data/spec/cucumber/cli/profile_loader_spec.rb +35 -0
  515. data/spec/cucumber/configuration_spec.rb +23 -0
  516. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  517. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  518. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  519. data/spec/cucumber/formatter/html_spec.rb +258 -0
  520. data/spec/cucumber/formatter/junit_spec.rb +111 -0
  521. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  522. data/spec/cucumber/formatter/spec_helper.rb +51 -0
  523. data/spec/cucumber/rb_support/rb_language_spec.rb +283 -0
  524. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +99 -0
  525. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  526. data/spec/cucumber/runtime/support_code_spec.rb +112 -0
  527. data/spec/cucumber/runtime_spec.rb +41 -0
  528. data/spec/cucumber/sell_cucumbers.feature +19 -0
  529. data/spec/cucumber/step_match_spec.rb +69 -0
  530. data/spec/cucumber/wire_support/configuration_spec.rb +51 -0
  531. data/spec/cucumber/wire_support/connection_spec.rb +46 -0
  532. data/spec/cucumber/wire_support/wire_exception_spec.rb +44 -0
  533. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  534. data/spec/cucumber/wire_support/wire_packet_spec.rb +40 -0
  535. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +20 -0
  536. data/spec/cucumber/world/pending_spec.rb +46 -0
  537. data/spec/spec_helper.rb +10 -0
  538. metadata +884 -0
@@ -0,0 +1,271 @@
1
+ /* cucumber.css is generated from cucumber.sass */
2
+ /* Regenerate with rake sass */
3
+
4
+ !step_left = 5px "solid"
5
+ !step_bottom = 1px "solid"
6
+
7
+ !failed = #FFFBD3
8
+ !failed_border = #C20000
9
+ !failed_text = #C20000
10
+
11
+ !passed = #DBFFB4
12
+ !passed_border = #65C400
13
+ !passed_text = #3D7700
14
+
15
+ !skipped = #E0FFFF
16
+ !skipped_border = #00FFFF
17
+ !skipped_text = #001111
18
+
19
+ !pending = #FCFB98
20
+ !pending_border = #FAF834
21
+ !pending_text = #131313
22
+
23
+ !undefined = #FCFB98
24
+ !undefined_border = #FAF834
25
+ !undefined_text = #131313
26
+
27
+ !announcement = #E0FFFF
28
+ !announcement_border = #00FFFF
29
+ !announcement_text = #001111
30
+
31
+ body
32
+ :font-size 0px
33
+ :color #FFFFFF
34
+ :margin 0px
35
+ :padding 0px
36
+
37
+ .cucumber,td,th
38
+ :font normal 11px "Lucida Grande", Helvetica, sans-serif
39
+ :background white
40
+ :color #000000
41
+
42
+ #cucumber-header
43
+ :background #65C400
44
+ :color #FFFFFF
45
+ :height 6em
46
+
47
+ #expand-collapse
48
+ p
49
+ :float right
50
+ :margin 0 0 0 10px
51
+
52
+ .scenario
53
+ h3
54
+ :font-size 11px
55
+ :padding 3px
56
+ :margin 0
57
+ :background #65C400
58
+ :color #FFFFFF
59
+ :font-weight bold
60
+
61
+ h1
62
+ :margin 0px 10px 0px 10px
63
+ :padding 10px
64
+ :font-family "Lucida Grande", Helvetica, sans-serif
65
+ :font-size 2em
66
+ :position absolute
67
+
68
+ h4
69
+ :margin-bottom 2px
70
+
71
+ div.feature
72
+ :padding 2px
73
+ :margin 0px 10px 5px 10px
74
+
75
+ div.examples
76
+ :padding 0em 0em 0em 1em
77
+
78
+ .stats
79
+ :margin 2em
80
+
81
+ .summary
82
+ ul.features
83
+ li
84
+ :display inline
85
+
86
+ .step_name
87
+ :float left
88
+
89
+ .step_file
90
+ :text-align right
91
+ :color #999999
92
+ a
93
+ :color #999999
94
+
95
+
96
+ .tag
97
+ :font-weight bold
98
+ :color #246AC1
99
+
100
+ .backtrace
101
+ :margin-top 0
102
+ :margin-bottom 0
103
+ :margin-left 1em
104
+ :color #000000
105
+
106
+ a
107
+ :text-decoration none
108
+ :color #BE5C00
109
+
110
+ &:hover
111
+ :text-decoration underline
112
+ &:visited
113
+ :font-weight normal
114
+
115
+ div.examples
116
+ :margin 5px 0px 5px 15px
117
+ :color #000000
118
+
119
+ .outline
120
+ table
121
+ :margin 0px 0px 5px 10px
122
+
123
+ table
124
+ :border-collapse collapse
125
+ td
126
+ :padding 3px 3px 3px 5px
127
+ td.failed, td.passed, td.skipped, td.pending, td.undefined
128
+ :padding-left 18px
129
+ :padding-right 10px
130
+ td.failed
131
+ :border-left= !step_left !failed_border
132
+ :border-bottom= !step_bottom !failed_border
133
+ :background= !failed
134
+ :color= !failed_text
135
+ td.passed
136
+ :border-left= !step_left !passed_border
137
+ :border-bottom= !step_bottom !passed_border
138
+ :background= !passed
139
+ :color= !passed_text
140
+ td.skipped
141
+ :border-left= !step_left !skipped_border
142
+ :border-bottom= !step_bottom !skipped_border
143
+ :background= !skipped
144
+ :color= !skipped_text
145
+ td.pending
146
+ :border-left= !step_left !pending_border
147
+ :border-bottom= !step_bottom !pending_border
148
+ :background= !pending
149
+ :color= !pending_text
150
+ td.undefined
151
+ :border-left= !step_left !undefined_border
152
+ :border-bottom= !step_bottom !undefined_border
153
+ :background= !undefined
154
+ :color= !undefined_text
155
+ td.announcement
156
+ :border-left= !step_left !announcement_border
157
+ :border-bottom= !step_bottom !announcement_border
158
+ :background= !announcement
159
+ :color= !announcement_text
160
+
161
+ ol
162
+ :list-style none
163
+ :margin 0px
164
+ :padding 0px
165
+
166
+ li.step
167
+ :padding 3px 3px 3px 18px
168
+ :margin 5px 0px 5px 5px
169
+ li
170
+ :margin 0em 0em 0em 1em
171
+ :padding 0em 0em 0em 0.2em
172
+ span.param
173
+ :font-weight bold
174
+ li.failed
175
+ :border-left= !step_left !failed_border
176
+ :border-bottom= !step_bottom !failed_border
177
+ :background= !failed
178
+ :color= !failed_text
179
+ li.passed
180
+ :border-left= !step_left !passed_border
181
+ :border-bottom= !step_bottom !passed_border
182
+ :background= !passed
183
+ :color= !passed_text
184
+ li.skipped
185
+ :border-left= !step_left !skipped_border
186
+ :border-bottom= !step_bottom !skipped_border
187
+ :background= !skipped
188
+ :color= !skipped_text
189
+ li.pending
190
+ :border-left= !step_left !pending_border
191
+ :border-bottom= !step_bottom !pending_border
192
+ :background= !pending
193
+ :color= !pending_text
194
+ li.undefined
195
+ :border-left= !step_left !undefined_border
196
+ :border-bottom= !step_bottom !undefined_border
197
+ :background= !undefined
198
+ :color= !undefined_text
199
+ li.announcement
200
+ :border-left= !step_left !announcement_border
201
+ :border-bottom= !step_bottom !announcement_border
202
+ :background= !announcement
203
+ :color= !announcement_text
204
+ :margin-left= 10px
205
+
206
+ #summary
207
+ :margin 0px
208
+ :padding 5px 10px
209
+ :text-align right
210
+ :top 0px
211
+ :right 0px
212
+ :float right
213
+
214
+ p
215
+ :margin 0 0 0 2px
216
+
217
+ #totals
218
+ :font-size 1.2em
219
+
220
+ .ruby
221
+ :font-size 12px
222
+ :font-family monospace
223
+ :color white
224
+ :background black
225
+ :padding 0.1em 0 0.2em 0
226
+
227
+ .keyword
228
+ :color #FF6600
229
+ .constant
230
+ :color #339999
231
+ .attribute
232
+ :color white
233
+ .global
234
+ :color white
235
+ .module
236
+ :color white
237
+ .class
238
+ :color white
239
+ .string
240
+ :color #66FF00
241
+ .ident
242
+ :color white
243
+ .method
244
+ :color #FFCC00
245
+ .number
246
+ :color white
247
+ .char
248
+ :color white
249
+ .comment
250
+ :color #9933CC
251
+ .symbol
252
+ :color white
253
+ .regex
254
+ :color #44B4CC
255
+ .punct
256
+ :color white
257
+ .escape
258
+ :color white
259
+ .interp
260
+ :color white
261
+ .expr
262
+ :color white
263
+
264
+ .offending
265
+ :background #333333
266
+ .linenum
267
+ :width 75px
268
+ :padding 0.1em 1em 0.2em 0
269
+ :color #000000
270
+ :background #FFFBD3
271
+
@@ -0,0 +1,33 @@
1
+ require 'cucumber/formatter/progress'
2
+ require 'cucumber/step_definition_light'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ class Debug
7
+ def initialize(step_mother, io, options)
8
+ @io = io
9
+ @indent = 0
10
+ end
11
+
12
+ def respond_to?(*args)
13
+ true
14
+ end
15
+
16
+ def method_missing(name, *args)
17
+ @indent -= 2 if name.to_s =~ /^after/
18
+ print(name)
19
+ @indent += 2 if name.to_s =~ /^before/
20
+ end
21
+
22
+ private
23
+
24
+ def print(text)
25
+ @io.puts "#{indent}#{text}"
26
+ end
27
+
28
+ def indent
29
+ (' ' * @indent)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ module Cucumber
2
+ module Formatter
3
+ module Duration
4
+ # Helper method for formatters that need to
5
+ # format a duration in seconds to the UNIX
6
+ # <tt>time</tt> format.
7
+ def format_duration(seconds)
8
+ m, s = seconds.divmod(60)
9
+ "#{m}m#{'%.3f' % s}s"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,84 @@
1
+ require 'cucumber/formatter/io'
2
+ require 'gherkin/formatter/argument'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # Adapts Cucumber formatter events to Gherkin formatter events
7
+ # This class will disappear when Cucumber is based on Gherkin's model.
8
+ class GherkinFormatterAdapter
9
+ def initialize(gherkin_formatter, print_emtpy_match)
10
+ @gf = gherkin_formatter
11
+ @print_emtpy_match = print_emtpy_match
12
+ end
13
+
14
+ def before_features(features)
15
+ end
16
+
17
+ def before_feature(feature)
18
+ @gf.uri(feature.file)
19
+ @gf.feature(feature.gherkin_statement)
20
+ end
21
+
22
+ def before_background(background)
23
+ @outline = false
24
+ @gf.steps(background.raw_steps)
25
+ @gf.background(background.gherkin_statement)
26
+ end
27
+
28
+ def before_feature_element(feature_element)
29
+ @gf.steps(feature_element.raw_steps)
30
+ case(feature_element)
31
+ when Ast::Scenario
32
+ @outline = false
33
+ @gf.scenario(feature_element.gherkin_statement)
34
+ when Ast::ScenarioOutline
35
+ @outline = true
36
+ @gf.scenario_outline(feature_element.gherkin_statement)
37
+ else
38
+ raise "Bad type: #{feature_element.class}"
39
+ end
40
+ end
41
+
42
+ def before_step(step)
43
+ @gf.step(step.gherkin_statement)
44
+ if @print_emtpy_match
45
+ if(@outline)
46
+ match = Gherkin::Formatter::Model::Match.new(step.gherkin_statement.outline_args, nil)
47
+ else
48
+ match = Gherkin::Formatter::Model::Match.new([], nil)
49
+ end
50
+ @gf.match(match)
51
+ end
52
+ end
53
+
54
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
55
+ arguments = step_match.step_arguments.map{|a| Gherkin::Formatter::Argument.new(a.byte_offset, a.val)}
56
+ location = step_match.file_colon_line
57
+ match = Gherkin::Formatter::Model::Match.new(arguments, location)
58
+ if @print_emtpy_match
59
+ # Trick the formatter to believe that's what was printed previously so we get arg highlights on #result
60
+ @gf.instance_variable_set('@match', match)
61
+ else
62
+ @gf.match(match)
63
+ end
64
+
65
+ error_message = exception ? "#{exception.message} (#{exception.class})\n#{exception.backtrace.join("\n")}" : nil
66
+ unless @outline
67
+ @gf.result(Gherkin::Formatter::Model::Result.new(status, nil, error_message))
68
+ end
69
+ end
70
+
71
+ def before_examples(examples)
72
+ @gf.examples(examples.gherkin_statement)
73
+ end
74
+
75
+ def after_feature(feature)
76
+ @gf.eof
77
+ end
78
+
79
+ def embed(file, mime_type)
80
+ @gf.embedding(mime_type, File.read(file))
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,24 @@
1
+ require 'cucumber/formatter/gherkin_formatter_adapter'
2
+ require 'cucumber/formatter/io'
3
+ require 'gherkin/formatter/argument'
4
+ require 'gherkin/formatter/pretty_formatter'
5
+
6
+ module Cucumber
7
+ module Formatter
8
+ # The formatter used for <tt>--format gpretty</tt>
9
+ class Gpretty < GherkinFormatterAdapter
10
+ include Io
11
+
12
+ def initialize(step_mother, io, options)
13
+ @io = ensure_io(io, "json")
14
+ super(Gherkin::Formatter::PrettyFormatter.new(@io, false), true)
15
+ end
16
+
17
+ def after_feature(feature)
18
+ super
19
+ @io.puts
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,644 @@
1
+ require 'erb'
2
+ require 'cucumber/formatter/ordered_xml_markup'
3
+ require 'cucumber/formatter/duration'
4
+ require 'cucumber/formatter/io'
5
+
6
+ module Cucumber
7
+ module Formatter
8
+ class Html
9
+ include ERB::Util # for the #h method
10
+ include Duration
11
+ include Io
12
+
13
+ def initialize(step_mother, path_or_io, options)
14
+ @io = ensure_io(path_or_io, "html")
15
+ @step_mother = step_mother
16
+ @options = options
17
+ @buffer = {}
18
+ @builder = create_builder(@io)
19
+ @feature_number = 0
20
+ @scenario_number = 0
21
+ @step_number = 0
22
+ @header_red = nil
23
+ @delayed_announcements = []
24
+ end
25
+
26
+ def embed(file, mime_type)
27
+ case(mime_type)
28
+ when /^image\/(png|gif|jpg|jpeg)/
29
+ embed_image(file)
30
+ end
31
+ end
32
+
33
+ def embed_image(file)
34
+ id = file.hash
35
+ @builder.span(:class => 'embed') do |pre|
36
+ pre << %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">Screenshot</a><br>&nbsp;
37
+ <img id="#{id}" style="display: none" src="#{file}"/>}
38
+ end
39
+ end
40
+
41
+
42
+ def before_features(features)
43
+ @step_count = get_step_count(features)
44
+
45
+ # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
46
+ @builder.declare!(
47
+ :DOCTYPE,
48
+ :html,
49
+ :PUBLIC,
50
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
51
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
52
+ )
53
+
54
+ @builder << '<html xmlns ="http://www.w3.org/1999/xhtml">'
55
+ @builder.head do
56
+ @builder.meta(:content => 'text/html;charset=utf-8')
57
+ @builder.title 'Cucumber'
58
+ inline_css
59
+ inline_js
60
+ end
61
+ @builder << '<body>'
62
+ @builder << "<!-- Step count #{@step_count}-->"
63
+ @builder << '<div class="cucumber">'
64
+ @builder.div(:id => 'cucumber-header') do
65
+ @builder.div(:id => 'label') do
66
+ @builder.h1('Cucumber Features')
67
+ end
68
+ @builder.div(:id => 'summary') do
69
+ @builder.p('',:id => 'totals')
70
+ @builder.p('',:id => 'duration')
71
+ @builder.div(:id => 'expand-collapse') do
72
+ @builder.p('Expand All', :id => 'expander')
73
+ @builder.p('Collapse All', :id => 'collapser')
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ def after_features(features)
80
+ print_stats(features)
81
+ @builder << '</div>'
82
+ @builder << '</body>'
83
+ @builder << '</html>'
84
+ end
85
+
86
+ def before_feature(feature)
87
+ @exceptions = []
88
+ @builder << '<div class="feature">'
89
+ end
90
+
91
+ def after_feature(feature)
92
+ @builder << '</div>'
93
+ end
94
+
95
+ def before_comment(comment)
96
+ @builder << '<pre class="comment">'
97
+ end
98
+
99
+ def after_comment(comment)
100
+ @builder << '</pre>'
101
+ end
102
+
103
+ def comment_line(comment_line)
104
+ @builder.text!(comment_line)
105
+ @builder.br
106
+ end
107
+
108
+ def after_tags(tags)
109
+ @tag_spacer = nil
110
+ end
111
+
112
+ def tag_name(tag_name)
113
+ @builder.text!(@tag_spacer) if @tag_spacer
114
+ @tag_spacer = ' '
115
+ @builder.span(tag_name, :class => 'tag')
116
+ end
117
+
118
+ def feature_name(keyword, name)
119
+ lines = name.split(/\r?\n/)
120
+ return if lines.empty?
121
+ @builder.h2 do |h2|
122
+ @builder.span(keyword + ': ' + lines[0], :class => 'val')
123
+ end
124
+ @builder.p(:class => 'narrative') do
125
+ lines[1..-1].each do |line|
126
+ @builder.text!(line.strip)
127
+ @builder.br
128
+ end
129
+ end
130
+ end
131
+
132
+ def before_background(background)
133
+ @in_background = true
134
+ @builder << '<div class="background">'
135
+ end
136
+
137
+ def after_background(background)
138
+ @in_background = nil
139
+ @builder << '</div>'
140
+ end
141
+
142
+ def background_name(keyword, name, file_colon_line, source_indent)
143
+ @listing_background = true
144
+ @builder.h3 do |h3|
145
+ @builder.span(keyword, :class => 'keyword')
146
+ @builder.text!(' ')
147
+ @builder.span(name, :class => 'val')
148
+ end
149
+ end
150
+
151
+ def before_feature_element(feature_element)
152
+ @scenario_number+=1
153
+ @scenario_red = false
154
+ css_class = {
155
+ Ast::Scenario => 'scenario',
156
+ Ast::ScenarioOutline => 'scenario outline'
157
+ }[feature_element.class]
158
+ @builder << "<div class='#{css_class}'>"
159
+ end
160
+
161
+ def after_feature_element(feature_element)
162
+ @builder << '</div>'
163
+ @open_step_list = true
164
+ end
165
+
166
+ def scenario_name(keyword, name, file_colon_line, source_indent)
167
+ @listing_background = false
168
+ @builder.h3(:id => "scenario_#{@scenario_number}") do
169
+ @builder.span(keyword + ':', :class => 'keyword')
170
+ @builder.text!(' ')
171
+ @builder.span(name, :class => 'val')
172
+ end
173
+ end
174
+
175
+ def before_outline_table(outline_table)
176
+ @outline_row = 0
177
+ @builder << '<table>'
178
+ end
179
+
180
+ def after_outline_table(outline_table)
181
+ @builder << '</table>'
182
+ @outline_row = nil
183
+ end
184
+
185
+ def before_examples(examples)
186
+ @builder << '<div class="examples">'
187
+ end
188
+
189
+ def after_examples(examples)
190
+ @builder << '</div>'
191
+ end
192
+
193
+ def examples_name(keyword, name)
194
+ @builder.h4 do
195
+ @builder.span(keyword, :class => 'keyword')
196
+ @builder.text!(' ')
197
+ @builder.span(name, :class => 'val')
198
+ end
199
+ end
200
+
201
+ def before_steps(steps)
202
+ @builder << '<ol>'
203
+ end
204
+
205
+ def after_steps(steps)
206
+ @builder << '</ol>'
207
+ end
208
+
209
+ def before_step(step)
210
+ @step_id = step.dom_id
211
+ @step_number += 1
212
+ @step = step
213
+ end
214
+
215
+ def after_step(step)
216
+ move_progress
217
+ end
218
+
219
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
220
+ @step_match = step_match
221
+ @hide_this_step = false
222
+ if exception
223
+ if @exceptions.include?(exception)
224
+ @hide_this_step = true
225
+ return
226
+ end
227
+ @exceptions << exception
228
+ end
229
+ if status != :failed && @in_background ^ background
230
+ @hide_this_step = true
231
+ return
232
+ end
233
+ @status = status
234
+ return if @hide_this_step
235
+ set_scenario_color(status)
236
+ @builder << "<li id='#{@step_id}' class='step #{status}'>"
237
+ end
238
+
239
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
240
+ return if @hide_this_step
241
+ # print snippet for undefined steps
242
+ if status == :undefined
243
+ step_multiline_class = @step.multiline_arg ? @step.multiline_arg.class : nil
244
+ @builder.pre do |pre|
245
+ pre << @step_mother.snippet_text(@step.actual_keyword,step_match.instance_variable_get("@name") || '',step_multiline_class)
246
+ end
247
+ end
248
+ @builder << '</li>'
249
+ print_announcements
250
+ end
251
+
252
+ def step_name(keyword, step_match, status, source_indent, background)
253
+ @step_matches ||= []
254
+ background_in_scenario = background && !@listing_background
255
+ @skip_step = @step_matches.index(step_match) || background_in_scenario
256
+ @step_matches << step_match
257
+
258
+ unless @skip_step
259
+ build_step(keyword, step_match, status)
260
+ end
261
+ end
262
+
263
+ def exception(exception, status)
264
+ build_exception_detail(exception)
265
+ end
266
+
267
+ def extra_failure_content(file_colon_line)
268
+ @snippet_extractor ||= SnippetExtractor.new
269
+ "<pre class=\"ruby\"><code>#{@snippet_extractor.snippet(file_colon_line)}</code></pre>"
270
+ end
271
+
272
+ def before_multiline_arg(multiline_arg)
273
+ return if @hide_this_step || @skip_step
274
+ if Ast::Table === multiline_arg
275
+ @builder << '<table>'
276
+ end
277
+ end
278
+
279
+ def after_multiline_arg(multiline_arg)
280
+ return if @hide_this_step || @skip_step
281
+ if Ast::Table === multiline_arg
282
+ @builder << '</table>'
283
+ end
284
+ end
285
+
286
+ def py_string(string)
287
+ return if @hide_this_step
288
+ @builder.pre(:class => 'val') do |pre|
289
+ @builder << string.gsub("\n", '&#x000A;')
290
+ end
291
+ end
292
+
293
+
294
+ def before_table_row(table_row)
295
+ @row_id = table_row.dom_id
296
+ @col_index = 0
297
+ return if @hide_this_step
298
+ @builder << "<tr class='step' id='#{@row_id}'>"
299
+ end
300
+
301
+ def after_table_row(table_row)
302
+ return if @hide_this_step
303
+ print_table_row_announcements
304
+ @builder << '</tr>'
305
+ if table_row.exception
306
+ @builder.tr do
307
+ @builder.td(:colspan => @col_index.to_s, :class => 'failed') do
308
+ @builder.pre do |pre|
309
+ pre << format_exception(table_row.exception)
310
+ end
311
+ end
312
+ end
313
+ set_scenario_color_failed
314
+ end
315
+ if @outline_row
316
+ @outline_row += 1
317
+ end
318
+ @step_number += 1
319
+ move_progress
320
+ end
321
+
322
+ def table_cell_value(value, status)
323
+ return if @hide_this_step
324
+
325
+ @cell_type = @outline_row == 0 ? :th : :td
326
+ attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'step'}
327
+ attributes[:class] += " #{status}" if status
328
+ build_cell(@cell_type, value, attributes)
329
+ set_scenario_color(status)
330
+ @col_index += 1
331
+ end
332
+
333
+ def announce(announcement)
334
+ @delayed_announcements << announcement
335
+ #@builder.pre(announcement, :class => 'announcement')
336
+ end
337
+
338
+ def print_announcements
339
+ return if @delayed_announcements.empty?
340
+
341
+ #@builder.ol do
342
+ @delayed_announcements.each do |ann|
343
+ @builder.li(:class => 'step announcement') do
344
+ @builder << ann
345
+ end
346
+ end
347
+ #end
348
+ empty_announcements
349
+ end
350
+
351
+ def print_table_row_announcements
352
+ return if @delayed_announcements.empty?
353
+
354
+ @builder.td(:class => 'announcement') do
355
+ @builder << @delayed_announcements.join(", ")
356
+ end
357
+ empty_announcements
358
+ end
359
+
360
+ def empty_announcements
361
+ @delayed_announcements = []
362
+ end
363
+
364
+ protected
365
+
366
+ def build_exception_detail(exception)
367
+ backtrace = Array.new
368
+ @builder.div(:class => 'message') do
369
+ message = exception.message
370
+ if defined?(RAILS_ROOT) && message.include?('Exception caught')
371
+ matches = message.match(/Showing <i>(.+)<\/i>(?:.+)#(\d+)/)
372
+ backtrace += ["#{RAILS_ROOT}/#{matches[1]}:#{matches[2]}"]
373
+ message = message.match(/<code>([^(\/)]+)<\//m)[1]
374
+ end
375
+ @builder.pre do
376
+ @builder.text!(message)
377
+ end
378
+ end
379
+ @builder.div(:class => 'backtrace') do
380
+ @builder.pre do
381
+ backtrace = exception.backtrace
382
+ backtrace.delete_if { |x| x =~ /\/gems\/(cucumber|rspec)/ }
383
+ @builder << backtrace_line(backtrace.join("\n"))
384
+ end
385
+ end
386
+ extra = extra_failure_content(backtrace)
387
+ @builder << extra unless extra == ""
388
+ end
389
+
390
+ def set_scenario_color(status)
391
+ if status == :undefined or status == :pending
392
+ set_scenario_color_pending
393
+ end
394
+ if status == :failed
395
+ set_scenario_color_failed
396
+ end
397
+ end
398
+
399
+ def set_scenario_color_failed
400
+ @builder.script do
401
+ @builder.text!("makeRed('cucumber-header');") unless @header_red
402
+ @header_red = true
403
+ @builder.text!("makeRed('scenario_#{@scenario_number}');") unless @scenario_red
404
+ @scenario_red = true
405
+ end
406
+ end
407
+
408
+ def set_scenario_color_pending
409
+ @builder.script do
410
+ @builder.text!("makeYellow('cucumber-header');") unless @header_red
411
+ @builder.text!("makeYellow('scenario_#{@scenario_number}');") unless @scenario_red
412
+ end
413
+ end
414
+
415
+ def get_step_count(features)
416
+ count = 0
417
+ features = features.instance_variable_get("@features")
418
+ features.each do |feature|
419
+ #get background steps
420
+ if feature.instance_variable_get("@background")
421
+ background = feature.instance_variable_get("@background")
422
+ background.init
423
+ background_steps = background.instance_variable_get("@steps").instance_variable_get("@steps")
424
+ count += background_steps.size
425
+ end
426
+ #get scenarios
427
+ feature.instance_variable_get("@feature_elements").each do |scenario|
428
+ scenario.init
429
+ #get steps
430
+ steps = scenario.instance_variable_get("@steps").instance_variable_get("@steps")
431
+ count += steps.size
432
+
433
+ #get example table
434
+ examples = scenario.instance_variable_get("@examples_array")
435
+ unless examples.nil?
436
+ examples.each do |example|
437
+ example_matrix = example.instance_variable_get("@outline_table").instance_variable_get("@cell_matrix")
438
+ count += example_matrix.size
439
+ end
440
+ end
441
+
442
+ #get multiline step tables
443
+ steps.each do |step|
444
+ multi_arg = step.instance_variable_get("@multiline_arg")
445
+ next if multi_arg.nil?
446
+ matrix = multi_arg.instance_variable_get("@cell_matrix")
447
+ count += matrix.size unless matrix.nil?
448
+ end
449
+ end
450
+ end
451
+ return count
452
+ end
453
+
454
+ def build_step(keyword, step_match, status)
455
+ step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
456
+ @builder.div(:class => 'step_name') do |div|
457
+ @builder.span(keyword, :class => 'keyword')
458
+ @builder.span(:class => 'step val') do |name|
459
+ name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
460
+ end
461
+ end
462
+
463
+ step_file = step_match.file_colon_line
464
+ step_file.gsub(/^([^:]*\.rb):(\d*)/) do
465
+ if ENV['TM_PROJECT_DIRECTORY']
466
+ step_file = "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
467
+ end
468
+ end
469
+
470
+ @builder.div(:class => 'step_file') do |div|
471
+ @builder.span do
472
+ @builder << step_file
473
+ end
474
+ end
475
+ end
476
+
477
+ def build_cell(cell_type, value, attributes)
478
+ @builder.__send__(cell_type, attributes) do
479
+ @builder.div do
480
+ @builder.span(value,:class => 'step param')
481
+ end
482
+ end
483
+ end
484
+
485
+ def inline_css
486
+ @builder.style(:type => 'text/css') do
487
+ @builder << File.read(File.dirname(__FILE__) + '/cucumber.css')
488
+ end
489
+ end
490
+
491
+ def inline_js
492
+ @builder.script(:type => 'text/javascript') do
493
+ @builder << inline_jquery
494
+ @builder << inline_js_content
495
+ end
496
+ end
497
+
498
+ def inline_jquery
499
+ File.read(File.dirname(__FILE__) + '/jquery-min.js')
500
+ end
501
+
502
+ def inline_js_content
503
+ <<-EOF
504
+
505
+ SCENARIOS = "h3[id^='scenario_']";
506
+
507
+ $(document).ready(function() {
508
+ $(SCENARIOS).css('cursor', 'pointer');
509
+ $(SCENARIOS).click(function() {
510
+ $(this).siblings().toggle(250);
511
+ });
512
+
513
+ $("#collapser").css('cursor', 'pointer');
514
+ $("#collapser").click(function() {
515
+ $(SCENARIOS).siblings().hide();
516
+ });
517
+
518
+ $("#expander").css('cursor', 'pointer');
519
+ $("#expander").click(function() {
520
+ $(SCENARIOS).siblings().show();
521
+ });
522
+ })
523
+
524
+ function moveProgressBar(percentDone) {
525
+ $("cucumber-header").css('width', percentDone +"%");
526
+ }
527
+ function makeRed(element_id) {
528
+ $('#'+element_id).css('background', '#C40D0D');
529
+ $('#'+element_id).css('color', '#FFFFFF');
530
+ }
531
+ function makeYellow(element_id) {
532
+ $('#'+element_id).css('background', '#FAF834');
533
+ $('#'+element_id).css('color', '#000000');
534
+ }
535
+
536
+ EOF
537
+ end
538
+
539
+ def move_progress
540
+ @builder << " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
541
+ end
542
+
543
+ def percent_done
544
+ result = 100.0
545
+ if @step_count != 0
546
+ result = ((@step_number).to_f / @step_count.to_f * 1000).to_i / 10.0
547
+ end
548
+ result
549
+ end
550
+
551
+ def format_exception(exception)
552
+ (["#{exception.message}"] + exception.backtrace).join("\n")
553
+ end
554
+
555
+ def backtrace_line(line)
556
+ line.gsub(/^([^:]*\.(?:rb|feature|haml)):(\d*)/) do
557
+ if ENV['TM_PROJECT_DIRECTORY']
558
+ "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
559
+ else
560
+ line
561
+ end
562
+ end
563
+ end
564
+
565
+ def print_stats(features)
566
+ @builder << "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{format_duration(features.duration)} seconds</strong>\";</script>"
567
+ @builder << "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{print_stat_string(features)}\";</script>"
568
+ end
569
+
570
+ def print_stat_string(features)
571
+ string = String.new
572
+ string << dump_count(@step_mother.scenarios.length, "scenario")
573
+ scenario_count = print_status_counts{|status| @step_mother.scenarios(status)}
574
+ string << scenario_count if scenario_count
575
+ string << "<br />"
576
+ string << dump_count(@step_mother.steps.length, "step")
577
+ step_count = print_status_counts{|status| @step_mother.steps(status)}
578
+ string << step_count if step_count
579
+ end
580
+
581
+ def print_status_counts
582
+ counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
583
+ elements = yield status
584
+ elements.any? ? "#{elements.length} #{status.to_s}" : nil
585
+ end.compact
586
+ return " (#{counts.join(', ')})" if counts.any?
587
+ end
588
+
589
+ def dump_count(count, what, state=nil)
590
+ [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
591
+ end
592
+
593
+ def create_builder(io)
594
+ OrderedXmlMarkup.new(:target => io, :indent => 0)
595
+ end
596
+
597
+ class SnippetExtractor #:nodoc:
598
+ class NullConverter; def convert(code, pre); code; end; end #:nodoc:
599
+ begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
600
+
601
+ def snippet(error)
602
+ raw_code, line = snippet_for(error[0])
603
+ highlighted = @@converter.convert(raw_code, false)
604
+ highlighted << "\n<span class=\"comment\"># gem install syntax to get syntax highlighting</span>" if @@converter.is_a?(NullConverter)
605
+ post_process(highlighted, line)
606
+ end
607
+
608
+ def snippet_for(error_line)
609
+ if error_line =~ /(.*):(\d+)/
610
+ file = $1
611
+ line = $2.to_i
612
+ [lines_around(file, line), line]
613
+ else
614
+ ["# Couldn't get snippet for #{error_line}", 1]
615
+ end
616
+ end
617
+
618
+ def lines_around(file, line)
619
+ if File.file?(file)
620
+ lines = File.open(file).read.split("\n")
621
+ min = [0, line-3].max
622
+ max = [line+1, lines.length-1].min
623
+ selected_lines = []
624
+ selected_lines.join("\n")
625
+ lines[min..max].join("\n")
626
+ else
627
+ "# Couldn't get snippet for #{file}"
628
+ end
629
+ end
630
+
631
+ def post_process(highlighted, offending_line)
632
+ new_lines = []
633
+ highlighted.split("\n").each_with_index do |line, i|
634
+ new_line = "<span class=\"linenum\">#{offending_line+i-2}</span>#{line}"
635
+ new_line = "<span class=\"offending\">#{new_line}</span>" if i == 2
636
+ new_lines << new_line
637
+ end
638
+ new_lines.join("\n")
639
+ end
640
+
641
+ end
642
+ end
643
+ end
644
+ end