kbaum-cucumber 0.4.5.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +18 -0
  3. data/Caliper.yml +5 -0
  4. data/History.txt +1292 -0
  5. data/LICENSE +22 -0
  6. data/README.rdoc +26 -0
  7. data/Rakefile +63 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/cucumber +16 -0
  10. data/cucumber.gemspec +741 -0
  11. data/cucumber.yml +10 -0
  12. data/examples/dos_line_endings/Rakefile +6 -0
  13. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  14. data/examples/i18n/README.textile +18 -0
  15. data/examples/i18n/Rakefile +32 -0
  16. data/examples/i18n/ar/Rakefile +6 -0
  17. data/examples/i18n/ar/features/addition.feature +17 -0
  18. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  19. data/examples/i18n/ar/lib/calculator.rb +11 -0
  20. data/examples/i18n/bg/Rakefile +6 -0
  21. data/examples/i18n/bg/features/addition.feature +12 -0
  22. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  23. data/examples/i18n/bg/features/division.feature +17 -0
  24. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  25. data/examples/i18n/bg/features/support/env.rb +6 -0
  26. data/examples/i18n/bg/features/support/world.rb +8 -0
  27. data/examples/i18n/bg/lib/calculator.rb +24 -0
  28. data/examples/i18n/cat/Rakefile +6 -0
  29. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  30. data/examples/i18n/cat/features/suma.feature +17 -0
  31. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  32. data/examples/i18n/da/Rakefile +6 -0
  33. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  34. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  35. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  36. data/examples/i18n/de/.gitignore +1 -0
  37. data/examples/i18n/de/Rakefile +6 -0
  38. data/examples/i18n/de/features/addition.feature +17 -0
  39. data/examples/i18n/de/features/division.feature +10 -0
  40. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  41. data/examples/i18n/de/lib/calculator.rb +14 -0
  42. data/examples/i18n/en-lol/Rakefile +4 -0
  43. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  44. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  45. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  46. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  47. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  48. data/examples/i18n/en/.gitignore +1 -0
  49. data/examples/i18n/en/Rakefile +6 -0
  50. data/examples/i18n/en/features/addition.feature +17 -0
  51. data/examples/i18n/en/features/division.feature +10 -0
  52. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  53. data/examples/i18n/en/lib/calculator.rb +14 -0
  54. data/examples/i18n/es/Rakefile +6 -0
  55. data/examples/i18n/es/features/adicion.feature +17 -0
  56. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  57. data/examples/i18n/es/lib/calculador.rb +14 -0
  58. data/examples/i18n/et/Rakefile +6 -0
  59. data/examples/i18n/et/features/jagamine.feature +10 -0
  60. data/examples/i18n/et/features/liitmine.feature +17 -0
  61. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  62. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  63. data/examples/i18n/fi/.gitignore +1 -0
  64. data/examples/i18n/fi/Rakefile +6 -0
  65. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  66. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  67. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  68. data/examples/i18n/fi/lib/laskin.rb +14 -0
  69. data/examples/i18n/fr/Rakefile +6 -0
  70. data/examples/i18n/fr/features/addition.feature +18 -0
  71. data/examples/i18n/fr/features/addition2.feature +17 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +38 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/.gitignore +1 -0
  80. data/examples/i18n/hu/Rakefile +6 -0
  81. data/examples/i18n/hu/features/addition.feature +17 -0
  82. data/examples/i18n/hu/features/division.feature +10 -0
  83. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  84. data/examples/i18n/hu/lib/calculator.rb +14 -0
  85. data/examples/i18n/id/.gitignore +1 -0
  86. data/examples/i18n/id/Rakefile +6 -0
  87. data/examples/i18n/id/features/addition.feature +17 -0
  88. data/examples/i18n/id/features/division.feature +10 -0
  89. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  90. data/examples/i18n/id/lib/calculator.rb +14 -0
  91. data/examples/i18n/it/Rakefile +6 -0
  92. data/examples/i18n/it/features/somma.feature +11 -0
  93. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  94. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  95. data/examples/i18n/ja/.gitignore +1 -0
  96. data/examples/i18n/ja/Rakefile +6 -0
  97. data/examples/i18n/ja/features/addition.feature +17 -0
  98. data/examples/i18n/ja/features/division.feature +10 -0
  99. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  100. data/examples/i18n/ja/lib/calculator.rb +14 -0
  101. data/examples/i18n/ko/.gitignore +1 -0
  102. data/examples/i18n/ko/Rakefile +6 -0
  103. data/examples/i18n/ko/features/addition.feature +17 -0
  104. data/examples/i18n/ko/features/division.feature +11 -0
  105. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  106. data/examples/i18n/ko/lib/calculator.rb +14 -0
  107. data/examples/i18n/lt/.gitignore +1 -0
  108. data/examples/i18n/lt/Rakefile +6 -0
  109. data/examples/i18n/lt/features/addition.feature +17 -0
  110. data/examples/i18n/lt/features/division.feature +10 -0
  111. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lt/lib/calculator.rb +14 -0
  113. data/examples/i18n/lv/Rakefile +6 -0
  114. data/examples/i18n/lv/features/addition.feature +17 -0
  115. data/examples/i18n/lv/features/division.feature +10 -0
  116. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  117. data/examples/i18n/lv/lib/calculator.rb +14 -0
  118. data/examples/i18n/no/Rakefile +6 -0
  119. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  120. data/examples/i18n/no/features/summering.feature +19 -0
  121. data/examples/i18n/no/features/support/env.rb +6 -0
  122. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  123. data/examples/i18n/pl/.gitignore +1 -0
  124. data/examples/i18n/pl/Rakefile +6 -0
  125. data/examples/i18n/pl/features/addition.feature +17 -0
  126. data/examples/i18n/pl/features/division.feature +10 -0
  127. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  128. data/examples/i18n/pl/features/support/env.rb +6 -0
  129. data/examples/i18n/pl/lib/calculator.rb +14 -0
  130. data/examples/i18n/pt/Rakefile +6 -0
  131. data/examples/i18n/pt/features/adicao.feature +11 -0
  132. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  133. data/examples/i18n/pt/features/support/env.rb +6 -0
  134. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  135. data/examples/i18n/ro/Rakefile +6 -0
  136. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  137. data/examples/i18n/ro/features/suma.feature +11 -0
  138. data/examples/i18n/ro/lib/calculator.rb +11 -0
  139. data/examples/i18n/ru/Rakefile +6 -0
  140. data/examples/i18n/ru/features/addition.feature +11 -0
  141. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  142. data/examples/i18n/ru/features/division.feature +16 -0
  143. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  144. data/examples/i18n/ru/features/support/env.rb +6 -0
  145. data/examples/i18n/ru/features/support/world.rb +8 -0
  146. data/examples/i18n/ru/lib/calculator.rb +24 -0
  147. data/examples/i18n/se/Rakefile +6 -0
  148. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  149. data/examples/i18n/se/features/summering.feature +18 -0
  150. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  151. data/examples/i18n/sk/.gitignore +1 -0
  152. data/examples/i18n/sk/Rakefile +6 -0
  153. data/examples/i18n/sk/features/addition.feature +17 -0
  154. data/examples/i18n/sk/features/division.feature +10 -0
  155. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  156. data/examples/i18n/sk/lib/calculator.rb +14 -0
  157. data/examples/i18n/sr-latn/Rakefile +6 -0
  158. data/examples/i18n/sr-latn/features/sabiranje.feature +18 -0
  159. data/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb +24 -0
  160. data/examples/i18n/sr-latn/lib/calculator.rb +12 -0
  161. data/examples/i18n/sr/Rakefile +6 -0
  162. data/examples/i18n/sr/features/sabiranje.feature +18 -0
  163. data/examples/i18n/sr/features/step_definitons/calculator_steps.rb +24 -0
  164. data/examples/i18n/sr/lib/calculator.rb +12 -0
  165. data/examples/i18n/tr/.gitignore +1 -0
  166. data/examples/i18n/tr/Rakefile +6 -0
  167. data/examples/i18n/tr/features/bolme.feature +10 -0
  168. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  169. data/examples/i18n/tr/features/toplama.feature +18 -0
  170. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  171. data/examples/i18n/uz/Rakefile +6 -0
  172. data/examples/i18n/uz/features/addition.feature +10 -0
  173. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  174. data/examples/i18n/uz/features/division.feature +17 -0
  175. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  176. data/examples/i18n/uz/features/support/env.rb +6 -0
  177. data/examples/i18n/uz/features/support/world.rb +8 -0
  178. data/examples/i18n/uz/lib/calculator.rb +24 -0
  179. data/examples/i18n/zh-CN/Rakefile +4 -0
  180. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  181. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  182. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  183. data/examples/i18n/zh-TW/.gitignore +1 -0
  184. data/examples/i18n/zh-TW/Rakefile +4 -0
  185. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  186. data/examples/i18n/zh-TW/features/division.feature +11 -0
  187. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  188. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  189. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  190. data/examples/junit/features/pending.feature +5 -0
  191. data/examples/junit/features/step_definitions/steps.rb +11 -0
  192. data/examples/python/features/fibonacci.feature +19 -0
  193. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  194. data/examples/python/lib/.gitignore +1 -0
  195. data/examples/python/lib/fib.py +7 -0
  196. data/examples/ramaze/README.textile +7 -0
  197. data/examples/ramaze/Rakefile +6 -0
  198. data/examples/ramaze/app.rb +21 -0
  199. data/examples/ramaze/features/add.feature +11 -0
  200. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  201. data/examples/ramaze/features/support/env.rb +32 -0
  202. data/examples/ramaze/layout/default.html.erb +8 -0
  203. data/examples/ramaze/view/index.html.erb +5 -0
  204. data/examples/ruby2python/features/fibonacci.feature +19 -0
  205. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  206. data/examples/ruby2python/features/support/env.rb +21 -0
  207. data/examples/ruby2python/lib/.gitignore +1 -0
  208. data/examples/ruby2python/lib/fib.py +7 -0
  209. data/examples/selenium/Rakefile +6 -0
  210. data/examples/selenium/features/search.feature +9 -0
  211. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  212. data/examples/selenium/features/support/env.rb +19 -0
  213. data/examples/selenium_webrat/Rakefile +6 -0
  214. data/examples/selenium_webrat/config.ru +0 -0
  215. data/examples/selenium_webrat/features/search.feature +9 -0
  216. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  217. data/examples/selenium_webrat/features/support/env.rb +45 -0
  218. data/examples/self_test/.gitignore +1 -0
  219. data/examples/self_test/README.textile +6 -0
  220. data/examples/self_test/Rakefile +6 -0
  221. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  222. data/examples/self_test/features/background/background_with_name.feature +7 -0
  223. data/examples/self_test/features/background/failing_background.feature +12 -0
  224. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  225. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  226. data/examples/self_test/features/background/passing_background.feature +10 -0
  227. data/examples/self_test/features/background/pending_background.feature +10 -0
  228. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  229. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  230. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  231. data/examples/self_test/features/failing_expectation.feature +4 -0
  232. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  233. data/examples/self_test/features/multiline_name.feature +27 -0
  234. data/examples/self_test/features/outline_sample.feature +15 -0
  235. data/examples/self_test/features/sample.feature +21 -0
  236. data/examples/self_test/features/search_sample.feature +32 -0
  237. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  238. data/examples/self_test/features/support/env.rb +18 -0
  239. data/examples/self_test/features/tags_sample.feature +17 -0
  240. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  241. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  242. data/examples/self_test/list-of-features.txt +1 -0
  243. data/examples/sinatra/README.textile +13 -0
  244. data/examples/sinatra/Rakefile +6 -0
  245. data/examples/sinatra/app.rb +14 -0
  246. data/examples/sinatra/features/add.feature +11 -0
  247. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  248. data/examples/sinatra/features/support/env.rb +30 -0
  249. data/examples/sinatra/views/add.erb +5 -0
  250. data/examples/sinatra/views/layout.erb +8 -0
  251. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  252. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  253. data/examples/tcl/README.textile +11 -0
  254. data/examples/tcl/Rakefile +6 -0
  255. data/examples/tcl/features/fibonnacci.feature +17 -0
  256. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  257. data/examples/tcl/features/support/env.rb +6 -0
  258. data/examples/tcl/src/fib.tcl +3 -0
  259. data/examples/test_unit/Rakefile +6 -0
  260. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  261. data/examples/test_unit/features/test_unit.feature +9 -0
  262. data/examples/tickets/Rakefile +20 -0
  263. data/examples/tickets/features.html +138 -0
  264. data/examples/tickets/features/172.feature +28 -0
  265. data/examples/tickets/features/177/1.feature +28 -0
  266. data/examples/tickets/features/177/2.feature +20 -0
  267. data/examples/tickets/features/177/3.feature +18 -0
  268. data/examples/tickets/features/180.feature +7 -0
  269. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  270. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  271. data/examples/tickets/features/236.feature +13 -0
  272. data/examples/tickets/features/241.feature +12 -0
  273. data/examples/tickets/features/246.feature +4 -0
  274. data/examples/tickets/features/248.feature +11 -0
  275. data/examples/tickets/features/270/back.feature +14 -0
  276. data/examples/tickets/features/270/back.steps.rb +14 -0
  277. data/examples/tickets/features/272/hooks.feature +26 -0
  278. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  279. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  280. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  281. data/examples/tickets/features/279/wrong.feature_ +11 -0
  282. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  283. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  284. data/examples/tickets/features/306/only_background.feature +4 -0
  285. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  286. data/examples/tickets/features/lib/pantry.rb +20 -0
  287. data/examples/tickets/features/scenario_outline.feature +95 -0
  288. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  289. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  290. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  291. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  292. data/examples/tickets/features/table_diffing.feature +13 -0
  293. data/examples/tickets/features/tickets.feature +28 -0
  294. data/examples/watir/README.textile +16 -0
  295. data/examples/watir/Rakefile +10 -0
  296. data/examples/watir/features/search.feature +12 -0
  297. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  298. data/examples/watir/features/support/env.rb +32 -0
  299. data/examples/watir/features/support/screenshots.rb +44 -0
  300. data/examples/webrat/features/search.feature +12 -0
  301. data/examples/webrat/features/step_definitions/kvasir_steps.rb +14 -0
  302. data/examples/webrat/features/support/env.rb +17 -0
  303. data/features/announce.feature +122 -0
  304. data/features/background.feature +308 -0
  305. data/features/bug_371.feature +32 -0
  306. data/features/bug_464.feature +16 -0
  307. data/features/bug_475.feature +43 -0
  308. data/features/call_many_steps.feature +124 -0
  309. data/features/cucumber_cli.feature +654 -0
  310. data/features/cucumber_cli_diff_disabled.feature +52 -0
  311. data/features/cucumber_cli_outlines.feature +105 -0
  312. data/features/custom_formatter.feature +47 -0
  313. data/features/default_snippets.feature +42 -0
  314. data/features/drb_server_integration.feature +174 -0
  315. data/features/exception_in_after_block.feature +100 -0
  316. data/features/exception_in_after_step_block.feature +102 -0
  317. data/features/exception_in_before_block.feature +78 -0
  318. data/features/exclude_files.feature +20 -0
  319. data/features/expand.feature +60 -0
  320. data/features/html_formatter.feature +7 -0
  321. data/features/html_formatter/a.html +400 -0
  322. data/features/junit_formatter.feature +88 -0
  323. data/features/language_from_header.feature +30 -0
  324. data/features/language_help.feature +68 -0
  325. data/features/listener_debugger_formatter.feature +41 -0
  326. data/features/multiline_names.feature +43 -0
  327. data/features/negative_tagged_hooks.feature +61 -0
  328. data/features/post_configuration_hook.feature +37 -0
  329. data/features/profiles.feature +112 -0
  330. data/features/rake_task.feature +152 -0
  331. data/features/report_called_undefined_steps.feature +34 -0
  332. data/features/simplest.feature +11 -0
  333. data/features/snippet.feature +22 -0
  334. data/features/step_definitions/cucumber_steps.rb +154 -0
  335. data/features/step_definitions/extra_steps.rb +2 -0
  336. data/features/step_definitions/simplest_steps.rb +3 -0
  337. data/features/step_definitions/wire_steps.rb +14 -0
  338. data/features/support/env.rb +141 -0
  339. data/features/support/env.rb.simplest +7 -0
  340. data/features/support/fake_wire_server.rb +63 -0
  341. data/features/table_diffing.feature +45 -0
  342. data/features/table_mapping.feature +35 -0
  343. data/features/tag_logic.feature +258 -0
  344. data/features/transform.feature +245 -0
  345. data/features/unicode_table.feature +35 -0
  346. data/features/usage_and_stepdefs_formatter.feature +169 -0
  347. data/features/wire_protocol.feature +177 -0
  348. data/features/work_in_progress.feature +156 -0
  349. data/gem_tasks/contributors.rake +13 -0
  350. data/gem_tasks/environment.rake +7 -0
  351. data/gem_tasks/features.rake +18 -0
  352. data/gem_tasks/fix_cr_lf.rake +10 -0
  353. data/gem_tasks/flog.rake +4 -0
  354. data/gem_tasks/rspec.rake +15 -0
  355. data/gem_tasks/sass.rake +4 -0
  356. data/gem_tasks/sdoc.rake +12 -0
  357. data/lib/README.rdoc +12 -0
  358. data/lib/autotest/cucumber.rb +6 -0
  359. data/lib/autotest/cucumber_mixin.rb +131 -0
  360. data/lib/autotest/cucumber_rails.rb +6 -0
  361. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  362. data/lib/autotest/cucumber_rspec.rb +6 -0
  363. data/lib/autotest/discover.rb +9 -0
  364. data/lib/cucumber.rb +15 -0
  365. data/lib/cucumber/ast.rb +30 -0
  366. data/lib/cucumber/ast/background.rb +75 -0
  367. data/lib/cucumber/ast/comment.rb +31 -0
  368. data/lib/cucumber/ast/examples.rb +36 -0
  369. data/lib/cucumber/ast/feature.rb +85 -0
  370. data/lib/cucumber/ast/feature_element.rb +68 -0
  371. data/lib/cucumber/ast/features.rb +40 -0
  372. data/lib/cucumber/ast/outline_table.rb +166 -0
  373. data/lib/cucumber/ast/py_string.rb +59 -0
  374. data/lib/cucumber/ast/scenario.rb +111 -0
  375. data/lib/cucumber/ast/scenario_outline.rb +100 -0
  376. data/lib/cucumber/ast/step.rb +121 -0
  377. data/lib/cucumber/ast/step_collection.rb +76 -0
  378. data/lib/cucumber/ast/step_invocation.rb +190 -0
  379. data/lib/cucumber/ast/table.rb +655 -0
  380. data/lib/cucumber/ast/tags.rb +122 -0
  381. data/lib/cucumber/ast/tree_walker.rb +201 -0
  382. data/lib/cucumber/ast/visitor.rb +11 -0
  383. data/lib/cucumber/broadcaster.rb +13 -0
  384. data/lib/cucumber/cli/configuration.rb +180 -0
  385. data/lib/cucumber/cli/drb_client.rb +32 -0
  386. data/lib/cucumber/cli/language_help_formatter.rb +72 -0
  387. data/lib/cucumber/cli/main.rb +121 -0
  388. data/lib/cucumber/cli/options.rb +404 -0
  389. data/lib/cucumber/cli/profile_loader.rb +82 -0
  390. data/lib/cucumber/constantize.rb +34 -0
  391. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  392. data/lib/cucumber/core_ext/proc.rb +30 -0
  393. data/lib/cucumber/core_ext/string.rb +16 -0
  394. data/lib/cucumber/feature_file.rb +54 -0
  395. data/lib/cucumber/filter.rb +41 -0
  396. data/lib/cucumber/formatter/ansicolor.rb +157 -0
  397. data/lib/cucumber/formatter/color_io.rb +23 -0
  398. data/lib/cucumber/formatter/console.rb +205 -0
  399. data/lib/cucumber/formatter/cucumber.css +248 -0
  400. data/lib/cucumber/formatter/cucumber.sass +241 -0
  401. data/lib/cucumber/formatter/debug.rb +33 -0
  402. data/lib/cucumber/formatter/duration.rb +13 -0
  403. data/lib/cucumber/formatter/html.rb +545 -0
  404. data/lib/cucumber/formatter/io.rb +33 -0
  405. data/lib/cucumber/formatter/junit.rb +149 -0
  406. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  407. data/lib/cucumber/formatter/pdf.rb +234 -0
  408. data/lib/cucumber/formatter/pretty.rb +237 -0
  409. data/lib/cucumber/formatter/progress.rb +75 -0
  410. data/lib/cucumber/formatter/rerun.rb +50 -0
  411. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  412. data/lib/cucumber/formatter/steps.rb +49 -0
  413. data/lib/cucumber/formatter/summary.rb +35 -0
  414. data/lib/cucumber/formatter/tag_cloud.rb +34 -0
  415. data/lib/cucumber/formatter/unicode.rb +35 -0
  416. data/lib/cucumber/formatter/usage.rb +127 -0
  417. data/lib/cucumber/language_support.rb +30 -0
  418. data/lib/cucumber/language_support/language_methods.rb +110 -0
  419. data/lib/cucumber/languages.yml +535 -0
  420. data/lib/cucumber/parser.rb +8 -0
  421. data/lib/cucumber/parser/common.rb +170 -0
  422. data/lib/cucumber/parser/common.tt +21 -0
  423. data/lib/cucumber/parser/feature.rb +1783 -0
  424. data/lib/cucumber/parser/feature.tt +317 -0
  425. data/lib/cucumber/parser/i18n.tt +34 -0
  426. data/lib/cucumber/parser/natural_language.rb +108 -0
  427. data/lib/cucumber/parser/py_string.rb +276 -0
  428. data/lib/cucumber/parser/py_string.tt +45 -0
  429. data/lib/cucumber/parser/table.rb +305 -0
  430. data/lib/cucumber/parser/table.tt +60 -0
  431. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  432. data/lib/cucumber/platform.rb +31 -0
  433. data/lib/cucumber/py_support/py_dsl.py +10 -0
  434. data/lib/cucumber/py_support/py_language.py +10 -0
  435. data/lib/cucumber/py_support/py_language.rb +81 -0
  436. data/lib/cucumber/rake/task.rb +166 -0
  437. data/lib/cucumber/rb_support/rb_dsl.rb +102 -0
  438. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  439. data/lib/cucumber/rb_support/rb_language.rb +179 -0
  440. data/lib/cucumber/rb_support/rb_step_definition.rb +75 -0
  441. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  442. data/lib/cucumber/rb_support/rb_world.rb +81 -0
  443. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  444. data/lib/cucumber/rspec_neuter.rb +23 -0
  445. data/lib/cucumber/step_argument.rb +9 -0
  446. data/lib/cucumber/step_definition_light.rb +20 -0
  447. data/lib/cucumber/step_match.rb +107 -0
  448. data/lib/cucumber/step_mother.rb +350 -0
  449. data/lib/cucumber/webrat/element_locator.rb +93 -0
  450. data/lib/cucumber/webrat/table_locator.rb +1 -0
  451. data/lib/cucumber/wire_support/connection.rb +42 -0
  452. data/lib/cucumber/wire_support/request_handler.rb +19 -0
  453. data/lib/cucumber/wire_support/wire_exception.rb +10 -0
  454. data/lib/cucumber/wire_support/wire_language.rb +52 -0
  455. data/lib/cucumber/wire_support/wire_packet.rb +34 -0
  456. data/lib/cucumber/wire_support/wire_protocol.rb +64 -0
  457. data/lib/cucumber/wire_support/wire_step_definition.rb +21 -0
  458. data/spec/cucumber/ast/background_spec.rb +54 -0
  459. data/spec/cucumber/ast/feature_element_spec.rb +41 -0
  460. data/spec/cucumber/ast/feature_factory.rb +62 -0
  461. data/spec/cucumber/ast/feature_spec.rb +44 -0
  462. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  463. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  464. data/spec/cucumber/ast/scenario_outline_spec.rb +73 -0
  465. data/spec/cucumber/ast/scenario_spec.rb +45 -0
  466. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  467. data/spec/cucumber/ast/step_spec.rb +66 -0
  468. data/spec/cucumber/ast/table_spec.rb +422 -0
  469. data/spec/cucumber/ast/tags_spec.rb +29 -0
  470. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  471. data/spec/cucumber/broadcaster_spec.rb +15 -0
  472. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  473. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  474. data/spec/cucumber/cli/main_spec.rb +172 -0
  475. data/spec/cucumber/cli/options_spec.rb +335 -0
  476. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  477. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  478. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  479. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  480. data/spec/cucumber/formatter/console_spec.rb +20 -0
  481. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  482. data/spec/cucumber/formatter/html_spec.rb +213 -0
  483. data/spec/cucumber/formatter/junit_spec.rb +110 -0
  484. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  485. data/spec/cucumber/formatter/spec_helper.rb +50 -0
  486. data/spec/cucumber/parser/feature_parser_spec.rb +400 -0
  487. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  488. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +132 -0
  489. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  490. data/spec/cucumber/sell_cucumbers.feature +19 -0
  491. data/spec/cucumber/step_match_spec.rb +56 -0
  492. data/spec/cucumber/step_mother_spec.rb +270 -0
  493. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  494. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  495. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  496. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  497. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  498. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  499. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  500. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  501. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  502. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  503. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  504. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  505. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  506. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  507. data/spec/cucumber/wire_support/wire_packet_spec.rb +26 -0
  508. data/spec/cucumber/world/pending_spec.rb +46 -0
  509. data/spec/spec.opts +4 -0
  510. data/spec/spec_helper.rb +18 -0
  511. metadata +813 -0
@@ -0,0 +1,33 @@
1
+ require 'cucumber/formatter/color_io'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Io
6
+ def ensure_io(path_or_io, name)
7
+ return nil if path_or_io.nil?
8
+ return path_or_io if ColorIO === path_or_io || path_or_io.respond_to?(:write)
9
+ file = File.open(path_or_io, Cucumber.file_mode('w'))
10
+ at_exit do
11
+ unless file.closed?
12
+ file.flush
13
+ file.close
14
+ end
15
+ end
16
+ file
17
+ end
18
+
19
+ def ensure_file(path, name)
20
+ raise "You *must* specify --out FILE for the #{name} formatter" unless String === path
21
+ raise "I can't write #{name} to a directory - it has to be a file" if File.directory?(path)
22
+ ensure_io(path, name)
23
+ end
24
+
25
+ def ensure_dir(path, name)
26
+ raise "You *must* specify --out DIR for the #{name} formatter" unless String === path
27
+ raise "I can't write #{name} reports to a file - it has to be a directory" if File.file?(path)
28
+ FileUtils.mkdir_p(path) unless File.directory?(path)
29
+ path
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,149 @@
1
+ require 'cucumber/formatter/ordered_xml_markup'
2
+ require 'cucumber/formatter/io'
3
+ require 'fileutils'
4
+
5
+ module Cucumber
6
+ module Formatter
7
+ # The formatter used for <tt>--format junit</tt>
8
+ class Junit
9
+ include Io
10
+
11
+ class UnNamedFeatureError < StandardError
12
+ def initialize(feature_file)
13
+ super("The feature in '#{feature_file}' does not have a name. The JUnit XML format requires a name for the testsuite element.")
14
+ end
15
+ end
16
+
17
+ def initialize(step_mother, io, options)
18
+ @reportdir = ensure_dir(io, "junit")
19
+ @options = options
20
+ end
21
+
22
+ def before_feature(feature)
23
+ @current_feature = feature
24
+ @failures = @errors = @tests = 0
25
+ @builder = OrderedXmlMarkup.new( :indent => 2 )
26
+ @time = 0
27
+ end
28
+
29
+ def after_feature(feature)
30
+ @testsuite = OrderedXmlMarkup.new( :indent => 2 )
31
+ @testsuite.instruct!
32
+ @testsuite.testsuite(
33
+ :failures => @failures,
34
+ :errors => @errors,
35
+ :tests => @tests,
36
+ :time => "%.6f" % @time,
37
+ :name => @feature_name ) do
38
+ @testsuite << @builder.target!
39
+ end
40
+
41
+ write_file(feature_result_filename(feature.file), @testsuite.target!)
42
+ end
43
+
44
+ def before_background(*args)
45
+ @in_background = true
46
+ end
47
+
48
+ def after_background(*args)
49
+ @in_background = false
50
+ end
51
+
52
+ def feature_name(name)
53
+ raise UnNamedFeatureError.new(@current_feature.file) if name.empty?
54
+ lines = name.split(/\r?\n/)
55
+ @feature_name = lines[0].sub(/Feature\:/, '').strip
56
+ end
57
+
58
+ def scenario_name(keyword, name, file_colon_line, source_indent)
59
+ scenario_name = name.strip.delete(".\r\n")
60
+ scenario_name = "Unnamed scenario" if name.blank?
61
+ @scenario = scenario_name
62
+ description = "Scenario"
63
+ description << " outline" if keyword.include?('Scenario Outline')
64
+ @output = "#{description}: #{@scenario}\n\n"
65
+ end
66
+
67
+ def before_steps(steps)
68
+ @steps_start = Time.now
69
+ end
70
+
71
+ def after_steps(steps)
72
+ return if @in_background || @in_examples
73
+
74
+ duration = Time.now - @steps_start
75
+ if steps.failed?
76
+ steps.each { |step| @output += "#{step.keyword} #{step.name}\n" }
77
+ @output += "\nMessage:\n"
78
+ end
79
+ build_testcase(duration, steps.status, steps.exception)
80
+ end
81
+
82
+ def before_examples(*args)
83
+ @header_row = true
84
+ @in_examples = true
85
+ end
86
+
87
+ def after_examples(*args)
88
+ @in_examples = false
89
+ end
90
+
91
+ def before_table_row(table_row)
92
+ return unless @in_examples
93
+
94
+ @table_start = Time.now
95
+ end
96
+
97
+ def after_table_row(table_row)
98
+ return unless @in_examples
99
+ duration = Time.now - @table_start
100
+ unless @header_row
101
+ name_suffix = " (outline example : #{table_row.name})"
102
+ if table_row.failed?
103
+ @output += "Example row: #{table_row.name}\n"
104
+ @output += "\nMessage:\n"
105
+ end
106
+ build_testcase(duration, table_row.status, table_row.exception, name_suffix)
107
+ end
108
+
109
+ @header_row = false if @header_row
110
+ end
111
+
112
+ private
113
+
114
+ def build_testcase(duration, status, exception = nil, suffix = "")
115
+ @time += duration
116
+ classname = "#{@feature_name}.#{@scenario}"
117
+ name = "#{@scenario}#{suffix}"
118
+ failed = (status == :failed || (status == :pending && @options[:strict]))
119
+ #puts "FAILED:!!#{failed}"
120
+ if status == :passed || failed
121
+ @builder.testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
122
+ if failed
123
+ @builder.failure(:message => "#{status.to_s} #{name}", :type => status.to_s) do
124
+ @builder.text! @output
125
+ @builder.text!(format_exception(exception)) if exception
126
+ end
127
+ @failures += 1
128
+ end
129
+ end
130
+ @tests += 1
131
+ end
132
+ end
133
+
134
+ def format_exception(exception)
135
+ (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
136
+ end
137
+
138
+ def feature_result_filename(feature_file)
139
+ ext_length = File.extname(feature_file).length
140
+ basename = File.basename(feature_file)[0...-ext_length]
141
+ File.join(@reportdir, "TEST-#{basename}.xml")
142
+ end
143
+
144
+ def write_file(feature_filename, data)
145
+ File.open(feature_filename, 'w') { |file| file.write(data) }
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,24 @@
1
+ begin
2
+ require 'builder'
3
+ rescue LoadError
4
+ gem 'builder'
5
+ require 'builder'
6
+ end
7
+
8
+ module Cucumber
9
+ module Formatter
10
+ # Emits attributes ordered alphabetically, so that we can predicatbly test output.
11
+ class OrderedXmlMarkup < Builder::XmlMarkup #:nodoc:
12
+ def _insert_attributes(attrs, order=[])
13
+ return if attrs.nil?
14
+ keys = attrs.keys.map{|k| k.to_s}
15
+ keys.sort!
16
+ keys.reverse! if (attrs.keys - [:version, :encoding] == []) #HACK to ensure the 'version' attribute is first in xml declaration.
17
+ keys.each do |k|
18
+ v = attrs[k.to_sym] || attrs[k]
19
+ @target << %{ #{k}="#{_attr_value(v)}"} if v
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,234 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'cucumber/formatter/io'
3
+ require 'fileutils'
4
+ require 'prawn'
5
+ require "prawn/layout"
6
+ require "prawn/format"
7
+
8
+ module Cucumber
9
+ module Formatter
10
+
11
+ BLACK = '000000'
12
+ GREY = '999999'
13
+
14
+ class Pdf
15
+ include FileUtils
16
+ include Console
17
+ include Io
18
+ attr_writer :indent
19
+
20
+ def initialize(step_mother, path_or_io, options)
21
+ @step_mother = step_mother
22
+ @file = ensure_file(path_or_io, "pdf")
23
+
24
+ if(options[:dry_run])
25
+ @status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK}
26
+ else
27
+ @status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202'}
28
+ end
29
+
30
+ @pdf = Prawn::Document.new
31
+ @scrap = Prawn::Document.new
32
+ @doc = @scrap
33
+ @options = options
34
+ @exceptions = []
35
+ @indent = 0
36
+ @buffer = []
37
+ load_cover_page_image
38
+ @pdf.text "\n\n\nCucumber features", :align => :center, :size => 32
39
+ @pdf.text "Generated: #{Time.now.strftime("%Y-%m-%d %H:%M")}", :size => 10, :at => [0, 24]
40
+ @pdf.text "Command: <code>cucumber #{ARGV.join(" ")}</code>", :size => 10, :at => [0,10]
41
+ unless options[:dry_run]
42
+ @pdf.bounding_box [450,100] , :width => 100 do
43
+ @pdf.text 'Legend', :size => 10
44
+ @status_colors.each do |k,v|
45
+ @pdf.fill_color v
46
+ @pdf.text k.to_s, :size => 10
47
+ @pdf.fill_color BLACK
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def load_cover_page_image()
54
+ if (!load_image("features/support/logo.png"))
55
+ load_image("features/support/logo.jpg")
56
+ end
57
+ end
58
+
59
+ def load_image(image_path)
60
+ begin
61
+ @pdf.image open(image_path, "rb"), :position => :center, :width => 500
62
+ true
63
+ rescue Errno::ENOENT
64
+ false
65
+ end
66
+ end
67
+
68
+ def after_features(features)
69
+ @pdf.render_file(@file.path)
70
+ puts "\ndone"
71
+ end
72
+
73
+ def feature_name(name)
74
+ @pdf.start_new_page
75
+ name["Feature:"] = "" if name["Feature:"]
76
+ names = name.split("\n")
77
+ @pdf.fill_color GREY
78
+ @pdf.text('Feature', :align => :center)
79
+ @pdf.fill_color BLACK
80
+ names.each_with_index do |nameline, i|
81
+ case i
82
+ when 0
83
+ @pdf.text(nameline.strip, :size => 30, :align => :center )
84
+ @pdf.text("\n")
85
+ else
86
+ @pdf.text(nameline.strip, :size => 12)
87
+ end
88
+ end
89
+ @pdf.move_down(30)
90
+ end
91
+
92
+ def before_feature_element(feature_element)
93
+ record_tag_occurrences(feature_element, @options)
94
+ end
95
+
96
+ def after_feature_element(feature_element)
97
+ flush
98
+ end
99
+
100
+ def after_feature(feature)
101
+ flush
102
+ end
103
+
104
+ def feature_element_name(keyword, name)
105
+ names = name.empty? ? [name] : name.split("\n")
106
+ print "."
107
+ STDOUT.flush
108
+
109
+ keep_with do
110
+ @doc.move_down(20)
111
+ @doc.fill_color GREY
112
+ @doc.text("#{keyword}", :size => 8)
113
+ @doc.fill_color BLACK
114
+ @doc.text("#{names[0]}", :size => 16)
115
+ names[1..-1].each { |s| @doc.text(s, :size => 12) }
116
+ @doc.text("\n")
117
+ end
118
+ end
119
+
120
+ def step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
121
+ @hide_this_step = false
122
+ if exception
123
+ if @exceptions.include?(exception)
124
+ @hide_this_step = true
125
+ return
126
+ end
127
+ @exceptions << exception
128
+ end
129
+ if status != :failed && @in_background ^ background
130
+ @hide_this_step = true
131
+ return
132
+ end
133
+ end
134
+
135
+ def step_name(keyword, step_match, status, source_indent, background)
136
+ return if @hide_this_step
137
+ line = "<b>#{keyword}</b> #{step_match.format_args("%s").gsub('<', '&lt;').gsub('>', '&gt;')}"
138
+ colorize(line, status)
139
+ end
140
+
141
+ def before_background(background)
142
+ @in_background = true
143
+ end
144
+
145
+ def after_background(background)
146
+ @in_background = nil
147
+ end
148
+
149
+ def before_multiline_arg(table)
150
+ return if @hide_this_step
151
+ if(table.kind_of? Cucumber::Ast::Table)
152
+ keep_with do
153
+ @doc.table(table.rows << table.headers , :position => :center, :row_colors => ['ffffff', 'f0f0f0'])
154
+ end
155
+ end
156
+ end
157
+
158
+ #using row_color hack to highlight each row correctly
159
+ def before_outline_table(table)
160
+ return if @hide_this_step
161
+ row_colors = table.example_rows.map { |r| @status_colors[r.status] unless r.status == :skipped}
162
+ keep_with do
163
+ @doc.table(table.rows, :headers => table.headers, :position => :center, :row_colors => row_colors)
164
+ end
165
+ end
166
+
167
+ def before_py_string(string)
168
+ return if @hide_this_step
169
+ s = %{"""\n#{string}\n"""}.indent(10)
170
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}
171
+ s.each do |line|
172
+ line.gsub!('<', '&lt;')
173
+ line.gsub!('>', '&gt;')
174
+ keep_with { @doc.text line, :size => 8 }
175
+ end
176
+ end
177
+
178
+ def tag_name(tag_name)
179
+ return if @hide_this_step
180
+ tag = format_string(tag_name, :tag).indent(@indent)
181
+ # TODO should we render tags at all? skipped for now. difficult to place due to page breaks
182
+ end
183
+
184
+ def background_name(keyword, name, file_colon_line, source_indent)
185
+ feature_element_name(keyword, name)
186
+ end
187
+
188
+ def examples_name(keyword, name)
189
+ feature_element_name(keyword, name)
190
+ end
191
+
192
+ def scenario_name(keyword, name, file_colon_line, source_indent)
193
+ feature_element_name(keyword, name)
194
+ end
195
+
196
+ private
197
+
198
+ def colorize(text, status)
199
+ keep_with do
200
+ @doc.fill_color(@status_colors[status] || BLACK)
201
+ @doc.text(text)
202
+ @doc.fill_color(BLACK)
203
+ end
204
+ end
205
+
206
+ def keep_with(&block)
207
+ @buffer << block
208
+ end
209
+
210
+ def render(doc)
211
+ @doc = doc
212
+ @buffer.each do |proc|
213
+ proc.call
214
+ end
215
+ end
216
+
217
+ # This method does a 'test' rendering on a blank page, to see the rendered height of the buffer
218
+ # if that too high for the space left on the age in the real document, we do a page break.
219
+ # This obviously doesn't work if a scenario is longer than a whole page (God forbid)
220
+ def flush
221
+ @scrap.start_new_page
222
+ oldy = @scrap.y
223
+ render @scrap
224
+ height = (oldy - @scrap.y) + 36 # whops magic number
225
+ if ((@pdf.y - height) < @pdf.bounds.bottom)
226
+ @pdf.start_new_page
227
+ end
228
+ render @pdf
229
+ @pdf.move_down(20)
230
+ @buffer = []
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,237 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'cucumber/formatter/io'
3
+ require 'fileutils'
4
+
5
+ module Cucumber
6
+ module Formatter
7
+ # The formatter used for <tt>--format pretty</tt> (the default formatter).
8
+ #
9
+ # This formatter prints features to plain text - exactly how they were parsed,
10
+ # just prettier. That means with proper indentation and alignment of table columns.
11
+ #
12
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
13
+ #
14
+ class Pretty
15
+ include FileUtils
16
+ include Console
17
+ include Io
18
+ attr_writer :indent
19
+ attr_reader :step_mother
20
+
21
+ def initialize(step_mother, path_or_io, options)
22
+ @step_mother, @io, @options = step_mother, ensure_io(path_or_io, "pretty"), options
23
+ @exceptions = []
24
+ @indent = 0
25
+ @prefixes = options[:prefixes] || {}
26
+ @delayed_announcements = []
27
+ end
28
+
29
+ def after_features(features)
30
+ print_summary(features) unless @options[:autoformat]
31
+ end
32
+
33
+ def before_feature(feature)
34
+ @exceptions = []
35
+ @indent = 0
36
+ if @options[:autoformat]
37
+ file = File.join(@options[:autoformat], feature.file)
38
+ dir = File.dirname(file)
39
+ mkdir_p(dir) unless File.directory?(dir)
40
+ @io = ensure_file(file, "pretty")
41
+ end
42
+ end
43
+
44
+ def comment_line(comment_line)
45
+ @io.puts(comment_line.indent(@indent))
46
+ @io.flush
47
+ end
48
+
49
+ def after_tags(tags)
50
+ if @indent == 1
51
+ @io.puts
52
+ @io.flush
53
+ end
54
+ end
55
+
56
+ def tag_name(tag_name)
57
+ tag = format_string(tag_name, :tag).indent(@indent)
58
+ @io.print(tag)
59
+ @io.flush
60
+ @indent = 1
61
+ end
62
+
63
+ def feature_name(name)
64
+ @io.puts(name)
65
+ @io.puts
66
+ @io.flush
67
+ end
68
+
69
+ def before_feature_element(feature_element)
70
+ record_tag_occurrences(feature_element, @options)
71
+ @indent = 2
72
+ @scenario_indent = 2
73
+ end
74
+
75
+ def after_feature_element(feature_element)
76
+ @io.puts
77
+ @io.flush
78
+ end
79
+
80
+ def before_background(background)
81
+ @indent = 2
82
+ @scenario_indent = 2
83
+ @in_background = true
84
+ end
85
+
86
+ def after_background(background)
87
+ @in_background = nil
88
+ @io.puts
89
+ @io.flush
90
+ end
91
+
92
+ def background_name(keyword, name, file_colon_line, source_indent)
93
+ print_feature_element_name(keyword, name, file_colon_line, source_indent)
94
+ end
95
+
96
+ def before_examples_array(examples_array)
97
+ @indent = 4
98
+ @io.puts
99
+ @visiting_first_example_name = true
100
+ end
101
+
102
+ def examples_name(keyword, name)
103
+ puts unless @visiting_first_example_name
104
+ @visiting_first_example_name = false
105
+ names = name.strip.empty? ? [name.strip] : name.split("\n")
106
+ @io.puts(" #{keyword} #{names[0]}")
107
+ names[1..-1].each {|s| @io.puts " #{s}" } unless names.empty?
108
+ @io.flush
109
+ @indent = 6
110
+ @scenario_indent = 6
111
+ end
112
+
113
+ def before_outline_table(outline_table)
114
+ @table = outline_table
115
+ end
116
+
117
+ def after_outline_table(outline_table)
118
+ @table = nil
119
+ @indent = 4
120
+ end
121
+
122
+ def scenario_name(keyword, name, file_colon_line, source_indent)
123
+ print_feature_element_name keyword, name, file_colon_line, source_indent
124
+ end
125
+
126
+ def before_step(step)
127
+ @current_step = step
128
+ @indent = 6
129
+ end
130
+
131
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
132
+ @hide_this_step = false
133
+ if exception
134
+ if @exceptions.include?(exception)
135
+ @hide_this_step = true
136
+ return
137
+ end
138
+ @exceptions << exception
139
+ end
140
+ if status != :failed && @in_background ^ background
141
+ @hide_this_step = true
142
+ return
143
+ end
144
+ @status = status
145
+ end
146
+
147
+ def step_name(keyword, step_match, status, source_indent, background)
148
+ return if @hide_this_step
149
+ source_indent = nil unless @options[:source]
150
+ name_to_report = format_step(keyword, step_match, status, source_indent)
151
+ @io.puts(name_to_report.indent(@scenario_indent + 2))
152
+ print_announcements
153
+ end
154
+
155
+ def py_string(string)
156
+ return if @hide_this_step
157
+ s = %{"""\n#{string}\n"""}.indent(@indent)
158
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
159
+ @io.puts(format_string(s, @current_step.status))
160
+ @io.flush
161
+ end
162
+
163
+ def exception(exception, status)
164
+ return if @hide_this_step
165
+ print_exception(exception, status, @indent)
166
+ @io.flush
167
+ end
168
+
169
+ def before_multiline_arg(multiline_arg)
170
+ return if @options[:no_multiline] || @hide_this_step
171
+ @table = multiline_arg
172
+ end
173
+
174
+ def after_multiline_arg(multiline_arg)
175
+ @table = nil
176
+ end
177
+
178
+ def before_table_row(table_row)
179
+ return if !@table || @hide_this_step
180
+ @col_index = 0
181
+ @io.print ' |'.indent(@indent-2)
182
+ end
183
+
184
+ def after_table_row(table_row)
185
+ return if !@table || @hide_this_step
186
+ print_table_row_announcements
187
+ @io.puts
188
+ if table_row.exception && !@exceptions.include?(table_row.exception)
189
+ print_exception(table_row.exception, table_row.status, @indent)
190
+ end
191
+ end
192
+
193
+ def after_table_cell(cell)
194
+ return unless @table
195
+ @col_index += 1
196
+ end
197
+
198
+ def table_cell_value(value, status)
199
+ return if !@table || @hide_this_step
200
+ status ||= @status || :passed
201
+ width = @table.col_width(@col_index)
202
+ cell_text = value.to_s || ''
203
+ padded = cell_text + (' ' * (width - cell_text.jlength))
204
+ prefix = cell_prefix(status)
205
+ @io.print(' ' + format_string("#{prefix}#{padded}", status) + ::Term::ANSIColor.reset(" |"))
206
+ @io.flush
207
+ end
208
+
209
+ private
210
+
211
+ def print_feature_element_name(keyword, name, file_colon_line, source_indent)
212
+ @io.puts if @scenario_indent == 6
213
+ names = name.empty? ? [name] : name.split("\n")
214
+ line = "#{keyword} #{names[0]}".indent(@scenario_indent)
215
+ @io.print(line)
216
+ if @options[:source]
217
+ line_comment = " # #{file_colon_line}".indent(source_indent)
218
+ @io.print(format_string(line_comment, :comment))
219
+ end
220
+ @io.puts
221
+ names[1..-1].each {|s| @io.puts " #{s}"}
222
+ @io.flush
223
+ end
224
+
225
+ def cell_prefix(status)
226
+ @prefixes[status]
227
+ end
228
+
229
+ def print_summary(features)
230
+ print_stats(features)
231
+ print_snippets(@options)
232
+ print_passing_wip(@options)
233
+ print_tag_limit_warnings(@options)
234
+ end
235
+ end
236
+ end
237
+ end