engineyard-cucumber 0.3.101

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 (454) hide show
  1. data/History.txt +1073 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en-lol/Rakefile +6 -0
  46. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  47. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  48. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  49. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  50. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  51. data/examples/i18n/en/Rakefile +6 -0
  52. data/examples/i18n/en/features/addition.feature +17 -0
  53. data/examples/i18n/en/features/division.feature +10 -0
  54. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  55. data/examples/i18n/en/lib/calculator.rb +14 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -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/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter.feature +7 -0
  279. data/features/html_formatter/a.html +183 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber.rb +10 -0
  315. data/lib/cucumber/ast.rb +29 -0
  316. data/lib/cucumber/ast/background.rb +63 -0
  317. data/lib/cucumber/ast/comment.rb +31 -0
  318. data/lib/cucumber/ast/examples.rb +32 -0
  319. data/lib/cucumber/ast/feature.rb +81 -0
  320. data/lib/cucumber/ast/feature_element.rb +61 -0
  321. data/lib/cucumber/ast/features.rb +40 -0
  322. data/lib/cucumber/ast/outline_table.rb +146 -0
  323. data/lib/cucumber/ast/py_string.rb +57 -0
  324. data/lib/cucumber/ast/scenario.rb +108 -0
  325. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  326. data/lib/cucumber/ast/step.rb +116 -0
  327. data/lib/cucumber/ast/step_collection.rb +76 -0
  328. data/lib/cucumber/ast/step_invocation.rb +166 -0
  329. data/lib/cucumber/ast/table.rb +626 -0
  330. data/lib/cucumber/ast/tags.rb +44 -0
  331. data/lib/cucumber/ast/visitor.rb +115 -0
  332. data/lib/cucumber/broadcaster.rb +13 -0
  333. data/lib/cucumber/cli/configuration.rb +190 -0
  334. data/lib/cucumber/cli/drb_client.rb +26 -0
  335. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  336. data/lib/cucumber/cli/main.rb +116 -0
  337. data/lib/cucumber/cli/options.rb +394 -0
  338. data/lib/cucumber/cli/profile_loader.rb +70 -0
  339. data/lib/cucumber/constantize.rb +28 -0
  340. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  341. data/lib/cucumber/core_ext/proc.rb +29 -0
  342. data/lib/cucumber/core_ext/string.rb +48 -0
  343. data/lib/cucumber/feature_file.rb +54 -0
  344. data/lib/cucumber/filter.rb +52 -0
  345. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  346. data/lib/cucumber/formatter/color_io.rb +23 -0
  347. data/lib/cucumber/formatter/console.rb +185 -0
  348. data/lib/cucumber/formatter/cucumber.css +132 -0
  349. data/lib/cucumber/formatter/cucumber.sass +139 -0
  350. data/lib/cucumber/formatter/duration.rb +13 -0
  351. data/lib/cucumber/formatter/html.rb +261 -0
  352. data/lib/cucumber/formatter/junit.rb +121 -0
  353. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  354. data/lib/cucumber/formatter/pdf.rb +217 -0
  355. data/lib/cucumber/formatter/pretty.rb +222 -0
  356. data/lib/cucumber/formatter/profile.rb +78 -0
  357. data/lib/cucumber/formatter/progress.rb +67 -0
  358. data/lib/cucumber/formatter/rerun.rb +46 -0
  359. data/lib/cucumber/formatter/steps.rb +50 -0
  360. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  361. data/lib/cucumber/formatter/unicode.rb +35 -0
  362. data/lib/cucumber/formatter/usage.rb +86 -0
  363. data/lib/cucumber/formatters/unicode.rb +7 -0
  364. data/lib/cucumber/language_support.rb +30 -0
  365. data/lib/cucumber/language_support/language_methods.rb +75 -0
  366. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  367. data/lib/cucumber/languages.yml +561 -0
  368. data/lib/cucumber/parser.rb +6 -0
  369. data/lib/cucumber/parser/feature.rb +1838 -0
  370. data/lib/cucumber/parser/feature.tt +351 -0
  371. data/lib/cucumber/parser/i18n.tt +42 -0
  372. data/lib/cucumber/parser/natural_language.rb +72 -0
  373. data/lib/cucumber/parser/table.rb +417 -0
  374. data/lib/cucumber/parser/table.tt +71 -0
  375. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  376. data/lib/cucumber/platform.rb +27 -0
  377. data/lib/cucumber/py_support/py_dsl.py +8 -0
  378. data/lib/cucumber/py_support/py_language.py +2 -0
  379. data/lib/cucumber/py_support/py_language.rb +68 -0
  380. data/lib/cucumber/rails/rspec.rb +10 -0
  381. data/lib/cucumber/rails/world.rb +100 -0
  382. data/lib/cucumber/rake/task.rb +241 -0
  383. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  384. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  385. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  386. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  387. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  388. data/lib/cucumber/rspec_neuter.rb +23 -0
  389. data/lib/cucumber/step_match.rb +61 -0
  390. data/lib/cucumber/step_mother.rb +307 -0
  391. data/lib/cucumber/version.rb +10 -0
  392. data/lib/cucumber/webrat/element_locator.rb +87 -0
  393. data/lib/cucumber/webrat/table_locator.rb +1 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -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,261 @@
1
+ require 'cucumber/formatter/ordered_xml_markup'
2
+ require 'cucumber/formatter/duration'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # The formatter used for <tt>--format html</tt>
7
+ class Html < Ast::Visitor
8
+ include ERB::Util # for the #h method
9
+ include Duration
10
+
11
+ def initialize(step_mother, io, options)
12
+ super(step_mother)
13
+ @options = options
14
+ @builder = create_builder(io)
15
+ end
16
+
17
+ def create_builder(io)
18
+ OrderedXmlMarkup.new(:target => io, :indent => 0)
19
+ end
20
+
21
+ def visit_features(features)
22
+ # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
23
+ @builder.declare!(
24
+ :DOCTYPE,
25
+ :html,
26
+ :PUBLIC,
27
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
28
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
29
+ )
30
+ @builder.html(:xmlns => 'http://www.w3.org/1999/xhtml') do
31
+ @builder.head do
32
+ @builder.meta(:content => 'text/html;charset=utf-8')
33
+ @builder.title 'Cucumber'
34
+ inline_css
35
+ end
36
+ @builder.body do
37
+ @builder.div(:class => 'cucumber') do
38
+ super
39
+ @builder.div(format_duration(features.duration), :class => 'duration')
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ def visit_comment(comment)
46
+ @builder.pre(:class => 'comment') do
47
+ super
48
+ end
49
+ end
50
+
51
+ def visit_comment_line(comment_line)
52
+ @builder.text!(comment_line)
53
+ @builder.br
54
+ end
55
+
56
+ def visit_feature(feature)
57
+ @exceptions = []
58
+ @builder.div(:class => 'feature') do
59
+ super
60
+ end
61
+ end
62
+
63
+ def visit_tags(tags)
64
+ super
65
+ @tag_spacer = nil
66
+ end
67
+
68
+ def visit_tag_name(tag_name)
69
+ @builder.text!(@tag_spacer) if @tag_spacer
70
+ @tag_spacer = ' '
71
+ @builder.span("@#{tag_name}", :class => 'tag')
72
+ end
73
+
74
+ def visit_feature_name(name)
75
+ lines = name.split(/\r?\n/)
76
+ return if lines.empty?
77
+ @builder.h2 do |h2|
78
+ @builder.span(lines[0], :class => 'val')
79
+ end
80
+ @builder.p(:class => 'narrative') do
81
+ lines[1..-1].each do |line|
82
+ @builder.text!(line.strip)
83
+ @builder.br
84
+ end
85
+ end
86
+ end
87
+
88
+ def visit_background(background)
89
+ @builder.div(:class => 'background') do
90
+ @in_background = true
91
+ super
92
+ @in_background = nil
93
+ end
94
+ end
95
+
96
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
97
+ @listing_background = true
98
+ @builder.h3 do |h3|
99
+ @builder.span(keyword, :class => 'keyword')
100
+ @builder.text!(' ')
101
+ @builder.span(name, :class => 'val')
102
+ end
103
+ end
104
+
105
+ def visit_feature_element(feature_element)
106
+ css_class = {
107
+ Ast::Scenario => 'scenario',
108
+ Ast::ScenarioOutline => 'scenario outline'
109
+ }[feature_element.class]
110
+ @builder.div(:class => css_class) do
111
+ super
112
+ end
113
+ @open_step_list = true
114
+ end
115
+
116
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
117
+ @listing_background = false
118
+ @builder.h3 do
119
+ @builder.span(keyword, :class => 'keyword')
120
+ @builder.text!(' ')
121
+ @builder.span(name, :class => 'val')
122
+ end
123
+ end
124
+
125
+ def visit_outline_table(outline_table)
126
+ @outline_row = 0
127
+ @builder.table do
128
+ super(outline_table)
129
+ end
130
+ @outline_row = nil
131
+ end
132
+
133
+ def visit_examples(examples)
134
+ @builder.div(:class => 'examples') do
135
+ super(examples)
136
+ end
137
+ end
138
+
139
+ def visit_examples_name(keyword, name)
140
+ @builder.h4 do
141
+ @builder.span(keyword, :class => 'keyword')
142
+ @builder.text!(' ')
143
+ @builder.span(name, :class => 'val')
144
+ end
145
+ end
146
+
147
+ def visit_steps(steps)
148
+ @builder.ol do
149
+ super
150
+ end
151
+ end
152
+
153
+ def visit_step(step)
154
+ @step_id = step.dom_id
155
+ super
156
+ end
157
+
158
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
159
+ if exception
160
+ return if @exceptions.index(exception)
161
+ @exceptions << exception
162
+ end
163
+ return if status != :failed && @in_background ^ background
164
+ @status = status
165
+ @builder.li(:id => @step_id, :class => "step #{status}") do
166
+ super(keyword, step_match, multiline_arg, status, exception, source_indent, background)
167
+ end
168
+ end
169
+
170
+ def visit_step_name(keyword, step_match, status, source_indent, background)
171
+ @step_matches ||= []
172
+ background_in_scenario = background && !@listing_background
173
+ @skip_step = @step_matches.index(step_match) || background_in_scenario
174
+ @step_matches << step_match
175
+
176
+ unless @skip_step
177
+ build_step(keyword, step_match, status)
178
+ end
179
+ end
180
+
181
+ def visit_exception(exception, status)
182
+ @builder.pre(format_exception(exception), :class => status)
183
+ end
184
+
185
+ def visit_multiline_arg(multiline_arg)
186
+ return if @skip_step
187
+ if Ast::Table === multiline_arg
188
+ @builder.table do
189
+ super
190
+ end
191
+ else
192
+ super
193
+ end
194
+ end
195
+
196
+ def visit_py_string(string)
197
+ @builder.pre(:class => 'val') do |pre|
198
+ @builder << string.gsub("\n", '&#x000A;')
199
+ end
200
+ end
201
+
202
+ def visit_table_row(table_row)
203
+ @row_id = table_row.dom_id
204
+ @col_index = 0
205
+ @builder.tr(:id => @row_id) do
206
+ super
207
+ end
208
+ if table_row.exception
209
+ @builder.tr do
210
+ @builder.td(:colspan => @col_index.to_s, :class => 'failed') do
211
+ @builder.pre do |pre|
212
+ pre << format_exception(table_row.exception)
213
+ end
214
+ end
215
+ end
216
+ end
217
+ @outline_row += 1 if @outline_row
218
+ end
219
+
220
+ def visit_table_cell_value(value, status)
221
+ cell_type = @outline_row == 0 ? :th : :td
222
+ attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'val'}
223
+ attributes[:class] += " #{status}" if status
224
+ build_cell(cell_type, value, attributes)
225
+ @col_index += 1
226
+ end
227
+
228
+ def announce(announcement)
229
+ @builder.pre(announcement, :class => 'announcement')
230
+ end
231
+
232
+ protected
233
+
234
+ def build_step(keyword, step_match, status)
235
+ step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
236
+ @builder.div do |div|
237
+ @builder.span(keyword, :class => 'keyword')
238
+ @builder.text!(' ')
239
+ @builder.span(:class => 'step val') do |name|
240
+ name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
241
+ end
242
+ end
243
+ end
244
+
245
+ def build_cell(cell_type, value, attributes)
246
+ @builder.__send__(cell_type, value, attributes)
247
+ end
248
+
249
+ def inline_css
250
+ @builder.style(:type => 'text/css') do
251
+ @builder.text!(File.read(File.dirname(__FILE__) + '/cucumber.css'))
252
+ end
253
+ end
254
+
255
+ def format_exception(exception)
256
+ h((["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n"))
257
+ end
258
+
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,121 @@
1
+ require 'cucumber/formatter/ordered_xml_markup'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ # The formatter used for <tt>--format junit</tt>
6
+ class Junit < Cucumber::Ast::Visitor
7
+
8
+ def initialize(step_mother, io, options)
9
+ super(step_mother)
10
+ raise "You *must* specify --out DIR for the junit formatter" unless String === io && File.directory?(io)
11
+ @reportdir = io
12
+ @options = options
13
+ end
14
+
15
+ def visit_feature(feature)
16
+ @failures = @errors = @tests = 0
17
+ @builder = OrderedXmlMarkup.new( :indent => 2 )
18
+ @time = 0
19
+ super
20
+
21
+ @testsuite = OrderedXmlMarkup.new( :indent => 2 )
22
+ @testsuite.instruct!
23
+ @testsuite.testsuite(
24
+ :failures => @failures,
25
+ :errors => @errors,
26
+ :tests => @tests,
27
+ :time => "%.6f" % @time,
28
+ :name => @feature_name ) do
29
+ @testsuite << @builder.target!
30
+ end
31
+
32
+ basename = File.basename(feature.file)[0...-File.extname(feature.file).length]
33
+ feature_filename = File.join(@reportdir, "TEST-#{basename}.xml")
34
+ File.open(feature_filename, 'w') { |file| file.write(@testsuite.target!) }
35
+ end
36
+
37
+ def visit_background(name)
38
+ @in_background = true
39
+ super
40
+ @in_background = false
41
+ end
42
+
43
+ def visit_feature_name(name)
44
+ lines = name.split(/\r?\n/)
45
+ @feature_name = lines[0].sub(/Feature\:/, '').strip
46
+ end
47
+
48
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
49
+ scenario_name = name.strip.delete(".\r\n")
50
+ scenario_name = "Unnamed scenario" if name.blank?
51
+ @scenario = scenario_name
52
+ @outline = keyword.include?('Scenario Outline')
53
+ @output = "Scenario#{ " outline" if @outline}: #{@scenario}\n\n"
54
+ end
55
+
56
+ def visit_steps(steps)
57
+ return if @in_background
58
+ start = Time.now
59
+ super
60
+ duration = Time.now - start
61
+ unless @outline
62
+ if steps.failed?
63
+ steps.each { |step| @output += "#{step.keyword} #{step.name}\n" }
64
+ @output += "\nMessage:\n"
65
+ end
66
+ build_testcase(duration, steps.status, steps.exception)
67
+ end
68
+ end
69
+
70
+ def visit_outline_table(outline_table)
71
+ @header_row = true
72
+ super(outline_table)
73
+ end
74
+
75
+ def visit_table_row(table_row)
76
+ if @outline
77
+ start = Time.now
78
+ super(table_row)
79
+ duration = Time.now - start
80
+ unless @header_row
81
+ name_suffix = " (outline example : #{table_row.name})"
82
+ if table_row.failed?
83
+ @output += "Example row: #{table_row.name}\n"
84
+ @output += "\nMessage:\n"
85
+ end
86
+ build_testcase(duration, table_row.status, table_row.exception, name_suffix)
87
+ end
88
+ else
89
+ super(table_row)
90
+ end
91
+ @header_row = false
92
+ end
93
+
94
+ private
95
+
96
+ def build_testcase(duration, status, exception = nil, suffix = "")
97
+ @time += duration
98
+ classname = "#{@feature_name}.#{@scenario}"
99
+ name = "#{@scenario}#{suffix}"
100
+ failed = (status == :failed || (status == :pending && @options[:strict]))
101
+ #puts "FAILED:!!#{failed}"
102
+ if status == :passed || failed
103
+ @builder.testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
104
+ if failed
105
+ @builder.failure(:message => "#{status.to_s} #{name}", :type => status.to_s) do
106
+ @builder.text! @output
107
+ @builder.text!(format_exception(exception)) if exception
108
+ end
109
+ @failures += 1
110
+ end
111
+ end
112
+ @tests += 1
113
+ end
114
+ end
115
+
116
+ def format_exception(exception)
117
+ (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
118
+ end
119
+ end
120
+ end
121
+ 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,217 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'fileutils'
3
+ require 'prawn'
4
+ require "prawn/layout"
5
+ require "prawn/format"
6
+
7
+ module Cucumber
8
+ module Formatter
9
+
10
+ BLACK = '000000'
11
+ GREY = '999999'
12
+
13
+ class Pdf < Ast::Visitor
14
+ include FileUtils
15
+ include Console
16
+ attr_writer :indent
17
+
18
+ def initialize(step_mother, io, options)
19
+ super(step_mother)
20
+ raise "You *must* specify --out FILE for the pdf formatter" unless File === io
21
+
22
+ if(options[:dry_run])
23
+ @status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK}
24
+ else
25
+ @status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202'}
26
+ end
27
+
28
+ @pdf = Prawn::Document.new
29
+ @scrap = Prawn::Document.new
30
+ @doc = @scrap
31
+ @io = io
32
+ @options = options
33
+ @exceptions = []
34
+ @indent = 0
35
+ @buffer = []
36
+ puts "writing to #{io.path}"
37
+ begin
38
+ @pdf.image open("features/support/logo.png"), :position => :center, :width => 500
39
+ rescue
40
+ end
41
+ @pdf.text "\n\n\nCucumber features", :align => :center, :size => 32
42
+ @pdf.text "Generated: #{Time.now.strftime("%Y-%m-%d %H:%M")}", :size => 10, :at => [0, 24]
43
+ @pdf.text "Command: <code>cucumber #{ARGV.join(" ")}</code>", :size => 10, :at => [0,10]
44
+ unless options[:dry_run]
45
+ @pdf.bounding_box [450,100] , :width => 100 do
46
+ @pdf.text 'Legend', :size => 10
47
+ @status_colors.each do |k,v|
48
+ @pdf.fill_color v
49
+ @pdf.text k.to_s, :size => 10
50
+ @pdf.fill_color BLACK
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ def keep_with(&block)
57
+ @buffer << block
58
+ end
59
+
60
+ def render(doc)
61
+ @doc = doc
62
+ @buffer.each do |proc|
63
+ proc.call
64
+ end
65
+ end
66
+
67
+ # This method does a 'test' rendering on a blank page, to see the rendered height of the buffer
68
+ # if that too high for the space left on the age in the real document, we do a page break.
69
+ # This obviously doesn't work if a scenario is longer than a whole page (God forbid)
70
+ def flush
71
+ @scrap.start_new_page
72
+ oldy = @scrap.y
73
+ render @scrap
74
+ height = (oldy - @scrap.y) + 36 # whops magic number
75
+ if ((@pdf.y - height) < @pdf.bounds.bottom)
76
+ @pdf.start_new_page
77
+ end
78
+ render @pdf
79
+ @pdf.move_down(20)
80
+ @buffer = []
81
+ end
82
+
83
+ # regular visitor entries
84
+ def visit_features(features)
85
+ super
86
+ @pdf.render_file(@io.path)
87
+ puts "\ndone"
88
+ end
89
+
90
+ def visit_feature_name(name)
91
+ @pdf.start_new_page
92
+ name["Feature:"] = "" if name["Feature:"]
93
+ names = name.split("\n")
94
+ @pdf.fill_color GREY
95
+ @pdf.text('Feature', :align => :center)
96
+ @pdf.fill_color BLACK
97
+ names.each_with_index do |nameline, i|
98
+ case i
99
+ when 0
100
+ @pdf.text(nameline.strip, :size => 30, :align => :center )
101
+ @pdf.text("\n")
102
+ else
103
+ @pdf.text(nameline.strip, :size => 12)
104
+ end
105
+ end
106
+ @pdf.move_down(30)
107
+ end
108
+
109
+ def visit_feature_element(feature_element)
110
+ record_tag_occurrences(feature_element, @options)
111
+ super
112
+ flush
113
+ end
114
+
115
+ def visit_feature(feature)
116
+ super
117
+ flush
118
+ end
119
+
120
+ def visit_feature_element_name(keyword, name)
121
+ names = name.empty? ? [name] : name.split("\n")
122
+ print "."
123
+ STDOUT.flush
124
+
125
+ keep_with do
126
+ @doc.move_down(20)
127
+ @doc.fill_color GREY
128
+ @doc.text("#{keyword}", :size => 8)
129
+ @doc.fill_color BLACK
130
+ @doc.text("#{names[0]}", :size => 16)
131
+ names[1..-1].each { |s| @doc.text(s, :size => 12) }
132
+ @doc.text("\n")
133
+ end
134
+ end
135
+
136
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
137
+ if exception
138
+ return if @exceptions.index(exception)
139
+ @exceptions << exception
140
+ end
141
+ return if status != :failed && @in_background ^ background
142
+ @status = status
143
+ super
144
+ end
145
+
146
+ def colorize(text, status)
147
+ keep_with do
148
+ @doc.fill_color(@status_colors[status] || BLACK)
149
+ @doc.text(text)
150
+ @doc.fill_color(BLACK)
151
+ end
152
+ end
153
+
154
+ def visit_step_name(keyword, step_match, status, source_indent, background)
155
+ line = "<b>#{keyword}</b> #{step_match.format_args("%s").gsub('<', '&lt;').gsub('>', '&gt;')}"
156
+ colorize(line, status)
157
+ end
158
+
159
+ def visit_background(background)
160
+ @in_background = true
161
+ super
162
+ @in_background = nil
163
+ end
164
+
165
+ def visit_multiline_arg(table)
166
+ if(table.kind_of? Cucumber::Ast::Table)
167
+ keep_with do
168
+ @doc.table(table.rows << table.headers , :position => :center, :row_colors => ['ffffff', 'f0f0f0'])
169
+ end
170
+ end
171
+ super
172
+ end
173
+
174
+ #using row_color hack to highlight each row correctly
175
+ def visit_outline_table(table)
176
+ row_colors = table.example_rows.map { |r| @status_colors[r.status] unless r.status == :skipped}
177
+ keep_with do
178
+ @doc.table(table.rows, :headers => table.headers, :position => :center, :row_colors => row_colors)
179
+ end
180
+ end
181
+
182
+ def visit_py_string(string)
183
+ s = %{"""\n#{string}\n"""}.indent(10)
184
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}
185
+ s.each do |line|
186
+ line.gsub!('<', '&lt;')
187
+ line.gsub!('>', '&gt;')
188
+ keep_with { @doc.text line, :size => 8 }
189
+ end
190
+ end
191
+
192
+ def visit_comment(comment)
193
+ comment.accept(self)
194
+ end
195
+
196
+ def visit_comment_line(comment_line)
197
+ end
198
+
199
+ def visit_tag_name(tag_name)
200
+ tag = format_string("@#{tag_name}", :tag).indent(@indent)
201
+ # TODO should we render tags at all? skipped for now. difficult to place due to page breaks
202
+ end
203
+
204
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
205
+ visit_feature_element_name(keyword, name)
206
+ end
207
+
208
+ def visit_examples_name(keyword, name)
209
+ visit_feature_element_name(keyword, name)
210
+ end
211
+
212
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
213
+ visit_feature_element_name(keyword, name)
214
+ end
215
+ end
216
+ end
217
+ end