cucumber 2.0.0.rc.4 → 4.0.0.rc.2

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 (518) hide show
  1. checksums.yaml +5 -5
  2. data/{History.md → CHANGELOG.md} +734 -283
  3. data/CONTRIBUTING.md +26 -23
  4. data/LICENSE +1 -1
  5. data/README.md +25 -8
  6. data/bin/cucumber +3 -3
  7. data/lib/autotest/cucumber.rb +2 -0
  8. data/lib/autotest/cucumber_mixin.rb +45 -48
  9. data/lib/autotest/cucumber_rails.rb +2 -0
  10. data/lib/autotest/cucumber_rails_rspec.rb +2 -0
  11. data/lib/autotest/cucumber_rails_rspec2.rb +2 -0
  12. data/lib/autotest/cucumber_rspec.rb +2 -0
  13. data/lib/autotest/cucumber_rspec2.rb +2 -0
  14. data/lib/autotest/discover.rb +4 -2
  15. data/lib/cucumber.rb +3 -9
  16. data/lib/cucumber/cli/configuration.rb +23 -106
  17. data/lib/cucumber/cli/main.rb +45 -25
  18. data/lib/cucumber/cli/options.rb +411 -223
  19. data/lib/cucumber/cli/profile_loader.rb +64 -38
  20. data/lib/cucumber/cli/rerun_file.rb +31 -0
  21. data/lib/cucumber/configuration.rb +240 -8
  22. data/lib/cucumber/constantize.rb +9 -10
  23. data/lib/cucumber/core_ext/string.rb +3 -1
  24. data/lib/cucumber/deprecate.rb +30 -0
  25. data/lib/cucumber/encoding.rb +7 -0
  26. data/lib/cucumber/errors.rb +17 -8
  27. data/lib/cucumber/events.rb +40 -0
  28. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  29. data/lib/cucumber/events/gherkin_source_read.rb +14 -0
  30. data/lib/cucumber/events/step_activated.rb +26 -0
  31. data/lib/cucumber/events/step_definition_registered.rb +20 -0
  32. data/lib/cucumber/events/test_case_finished.rb +14 -0
  33. data/lib/cucumber/events/test_case_started.rb +11 -0
  34. data/lib/cucumber/events/test_run_finished.rb +11 -0
  35. data/lib/cucumber/events/test_run_started.rb +14 -0
  36. data/lib/cucumber/events/test_step_finished.rb +14 -0
  37. data/lib/cucumber/events/test_step_started.rb +11 -0
  38. data/lib/cucumber/file_specs.rb +8 -6
  39. data/lib/cucumber/filters.rb +4 -0
  40. data/lib/cucumber/filters/activate_steps.rb +48 -7
  41. data/lib/cucumber/filters/apply_after_hooks.rb +2 -0
  42. data/lib/cucumber/filters/apply_after_step_hooks.rb +2 -0
  43. data/lib/cucumber/filters/apply_around_hooks.rb +2 -0
  44. data/lib/cucumber/filters/apply_before_hooks.rb +2 -0
  45. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +28 -0
  46. data/lib/cucumber/filters/gated_receiver.rb +2 -2
  47. data/lib/cucumber/filters/prepare_world.rb +13 -11
  48. data/lib/cucumber/filters/quit.rb +4 -7
  49. data/lib/cucumber/filters/randomizer.rb +10 -5
  50. data/lib/cucumber/filters/retry.rb +32 -0
  51. data/lib/cucumber/filters/tag_limits.rb +6 -5
  52. data/lib/cucumber/filters/tag_limits/test_case_index.rb +2 -2
  53. data/lib/cucumber/filters/tag_limits/verifier.rb +5 -7
  54. data/lib/cucumber/formatter/ansicolor.rb +39 -45
  55. data/lib/cucumber/formatter/ast_lookup.rb +165 -0
  56. data/lib/cucumber/formatter/backtrace_filter.rb +54 -0
  57. data/lib/cucumber/formatter/console.rb +93 -115
  58. data/lib/cucumber/formatter/console_counts.rb +39 -0
  59. data/lib/cucumber/formatter/console_issues.rb +61 -0
  60. data/lib/cucumber/formatter/duration.rb +3 -1
  61. data/lib/cucumber/formatter/duration_extractor.rb +31 -0
  62. data/lib/cucumber/formatter/fail_fast.rb +23 -0
  63. data/lib/cucumber/formatter/fanout.rb +4 -3
  64. data/lib/cucumber/formatter/ignore_missing_messages.rb +3 -4
  65. data/lib/cucumber/formatter/interceptor.rb +13 -14
  66. data/lib/cucumber/formatter/io.rb +10 -5
  67. data/lib/cucumber/formatter/json.rb +310 -8
  68. data/lib/cucumber/formatter/junit.rb +175 -110
  69. data/lib/cucumber/formatter/pretty.rb +359 -154
  70. data/lib/cucumber/formatter/progress.rb +78 -72
  71. data/lib/cucumber/formatter/rerun.rb +34 -17
  72. data/lib/cucumber/formatter/stepdefs.rb +3 -2
  73. data/lib/cucumber/formatter/steps.rb +7 -7
  74. data/lib/cucumber/formatter/summary.rb +50 -20
  75. data/lib/cucumber/formatter/unicode.rb +17 -18
  76. data/lib/cucumber/formatter/usage.rb +61 -54
  77. data/lib/cucumber/gherkin/data_table_parser.rb +44 -0
  78. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +97 -0
  79. data/lib/cucumber/gherkin/formatter/escaping.rb +19 -0
  80. data/lib/cucumber/gherkin/i18n.rb +17 -0
  81. data/lib/cucumber/gherkin/steps_parser.rb +42 -0
  82. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +47 -26
  83. data/lib/cucumber/glue/hook.rb +51 -0
  84. data/lib/cucumber/glue/invoke_in_world.rb +65 -0
  85. data/lib/cucumber/glue/proto_world.rb +219 -0
  86. data/lib/cucumber/glue/registry_and_more.rb +192 -0
  87. data/lib/cucumber/glue/snippet.rb +205 -0
  88. data/lib/cucumber/glue/step_definition.rb +142 -0
  89. data/lib/cucumber/glue/world_factory.rb +21 -0
  90. data/lib/cucumber/hooks.rb +34 -21
  91. data/lib/cucumber/load_path.rb +2 -0
  92. data/lib/cucumber/multiline_argument.rb +10 -24
  93. data/lib/cucumber/multiline_argument/data_table.rb +157 -253
  94. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +154 -0
  95. data/lib/cucumber/multiline_argument/doc_string.rb +3 -2
  96. data/lib/cucumber/platform.rb +7 -10
  97. data/lib/cucumber/project_initializer.rb +44 -0
  98. data/lib/cucumber/rake/task.rb +37 -29
  99. data/lib/cucumber/rspec/disable_option_parser.rb +11 -8
  100. data/lib/cucumber/rspec/doubles.rb +3 -1
  101. data/lib/cucumber/running_test_case.rb +60 -0
  102. data/lib/cucumber/runtime.rb +84 -78
  103. data/lib/cucumber/runtime/after_hooks.rb +10 -7
  104. data/lib/cucumber/runtime/before_hooks.rb +12 -6
  105. data/lib/cucumber/runtime/for_programming_languages.rb +14 -44
  106. data/lib/cucumber/runtime/step_hooks.rb +8 -4
  107. data/lib/cucumber/runtime/support_code.rb +55 -159
  108. data/lib/cucumber/runtime/user_interface.rb +15 -24
  109. data/lib/cucumber/step_definition_light.rb +10 -6
  110. data/lib/cucumber/step_definitions.rb +6 -4
  111. data/lib/cucumber/step_match.rb +58 -38
  112. data/lib/cucumber/step_match_search.rb +67 -0
  113. data/lib/cucumber/term/ansicolor.rb +40 -39
  114. data/lib/cucumber/unit.rb +2 -0
  115. data/lib/cucumber/version +1 -0
  116. data/{spec → lib}/simplecov_setup.rb +3 -1
  117. metadata +260 -607
  118. data/.coveralls.yml +0 -1
  119. data/.rspec +0 -1
  120. data/.ruby-gemset +0 -1
  121. data/.travis.yml +0 -18
  122. data/.yardopts +0 -1
  123. data/Gemfile +0 -11
  124. data/Rakefile +0 -22
  125. data/bin/cuke +0 -60
  126. data/cucumber.gemspec +0 -50
  127. data/cucumber.yml +0 -20
  128. data/examples/i18n/README.textile +0 -3
  129. data/examples/i18n/Rakefile +0 -33
  130. data/examples/i18n/ar/Rakefile +0 -6
  131. data/examples/i18n/ar/features/addition.feature +0 -17
  132. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -24
  133. data/examples/i18n/ar/lib/calculator.rb +0 -11
  134. data/examples/i18n/bg/Rakefile +0 -6
  135. data/examples/i18n/bg/features/addition.feature +0 -12
  136. data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
  137. data/examples/i18n/bg/features/division.feature +0 -17
  138. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
  139. data/examples/i18n/bg/features/support/env.rb +0 -5
  140. data/examples/i18n/bg/features/support/world.rb +0 -8
  141. data/examples/i18n/bg/lib/calculator.rb +0 -24
  142. data/examples/i18n/ca/Rakefile +0 -6
  143. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -21
  144. data/examples/i18n/ca/features/suma.feature +0 -17
  145. data/examples/i18n/ca/lib/calculadora.rb +0 -16
  146. data/examples/i18n/cs/Rakefile +0 -6
  147. data/examples/i18n/cs/features/addition.feature +0 -17
  148. data/examples/i18n/cs/features/division.feature +0 -11
  149. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -24
  150. data/examples/i18n/cs/lib/calculator.rb +0 -14
  151. data/examples/i18n/da/Rakefile +0 -6
  152. data/examples/i18n/da/features/sammenlaegning.feature +0 -18
  153. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -24
  154. data/examples/i18n/da/lib/lommeregner.rb +0 -11
  155. data/examples/i18n/de/Rakefile +0 -6
  156. data/examples/i18n/de/features/addition.feature +0 -17
  157. data/examples/i18n/de/features/division.feature +0 -10
  158. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -24
  159. data/examples/i18n/de/lib/calculator.rb +0 -14
  160. data/examples/i18n/el/Rakefile +0 -6
  161. data/examples/i18n/el/features/addition.feature +0 -17
  162. data/examples/i18n/el/features/division.feature +0 -10
  163. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -24
  164. data/examples/i18n/el/lib/calculator.rb +0 -14
  165. data/examples/i18n/en-lol/Rakefile +0 -4
  166. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
  167. data/examples/i18n/en-lol/features/stuffing.feature +0 -8
  168. data/examples/i18n/en-lol/features/support/env.rb +0 -7
  169. data/examples/i18n/en-lol/lib/basket.rb +0 -12
  170. data/examples/i18n/en-lol/lib/belly.rb +0 -11
  171. data/examples/i18n/en/Rakefile +0 -6
  172. data/examples/i18n/en/features/addition.feature +0 -17
  173. data/examples/i18n/en/features/division.feature +0 -10
  174. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -24
  175. data/examples/i18n/en/lib/calculator.rb +0 -14
  176. data/examples/i18n/eo/Rakefile +0 -6
  177. data/examples/i18n/eo/features/adicio.feature +0 -17
  178. data/examples/i18n/eo/features/divido.feature +0 -10
  179. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -24
  180. data/examples/i18n/eo/lib/calculator.rb +0 -14
  181. data/examples/i18n/es/Rakefile +0 -6
  182. data/examples/i18n/es/features/adicion.feature +0 -17
  183. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -21
  184. data/examples/i18n/es/lib/calculador.rb +0 -14
  185. data/examples/i18n/et/Rakefile +0 -6
  186. data/examples/i18n/et/features/jagamine.feature +0 -10
  187. data/examples/i18n/et/features/liitmine.feature +0 -17
  188. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -24
  189. data/examples/i18n/et/lib/kalkulaator.rb +0 -14
  190. data/examples/i18n/fi/Rakefile +0 -6
  191. data/examples/i18n/fi/features/jakolasku.feature +0 -10
  192. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -24
  193. data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
  194. data/examples/i18n/fi/lib/laskin.rb +0 -14
  195. data/examples/i18n/fr/Rakefile +0 -8
  196. data/examples/i18n/fr/features/addition.feature +0 -18
  197. data/examples/i18n/fr/features/addition2.feature +0 -17
  198. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
  199. data/examples/i18n/fr/features/support/env.rb +0 -5
  200. data/examples/i18n/fr/lib/calculatrice.rb +0 -10
  201. data/examples/i18n/he/Rakefile +0 -6
  202. data/examples/i18n/he/features/addition.feature +0 -17
  203. data/examples/i18n/he/features/division.feature +0 -10
  204. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -24
  205. data/examples/i18n/he/lib/calculator.rb +0 -15
  206. data/examples/i18n/hi/Rakefile +0 -6
  207. data/examples/i18n/hi/features/addition.feature +0 -16
  208. data/examples/i18n/hi/features/division.feature +0 -10
  209. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -24
  210. data/examples/i18n/hi/lib/calculator.rb +0 -15
  211. data/examples/i18n/hu/Rakefile +0 -6
  212. data/examples/i18n/hu/features/osszeadas.feature +0 -17
  213. data/examples/i18n/hu/features/osztas.feature +0 -10
  214. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -25
  215. data/examples/i18n/hu/lib/calculator.rb +0 -14
  216. data/examples/i18n/id/Rakefile +0 -6
  217. data/examples/i18n/id/features/addition.feature +0 -17
  218. data/examples/i18n/id/features/division.feature +0 -10
  219. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -24
  220. data/examples/i18n/id/lib/calculator.rb +0 -14
  221. data/examples/i18n/it/Rakefile +0 -6
  222. data/examples/i18n/it/features/somma.feature +0 -11
  223. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -24
  224. data/examples/i18n/it/lib/calcolatrice.rb +0 -11
  225. data/examples/i18n/ja/Rakefile +0 -6
  226. data/examples/i18n/ja/features/addition.feature +0 -17
  227. data/examples/i18n/ja/features/division.feature +0 -10
  228. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
  229. data/examples/i18n/ja/features/support/env.rb +0 -5
  230. data/examples/i18n/ja/lib/calculator.rb +0 -14
  231. data/examples/i18n/ko/Rakefile +0 -6
  232. data/examples/i18n/ko/features/addition.feature +0 -17
  233. data/examples/i18n/ko/features/division.feature +0 -11
  234. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -24
  235. data/examples/i18n/ko/lib/calculator.rb +0 -14
  236. data/examples/i18n/lt/Rakefile +0 -6
  237. data/examples/i18n/lt/features/addition.feature +0 -17
  238. data/examples/i18n/lt/features/division.feature +0 -10
  239. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -24
  240. data/examples/i18n/lt/lib/calculator.rb +0 -14
  241. data/examples/i18n/lv/Rakefile +0 -6
  242. data/examples/i18n/lv/features/addition.feature +0 -17
  243. data/examples/i18n/lv/features/division.feature +0 -10
  244. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -24
  245. data/examples/i18n/lv/lib/calculator.rb +0 -14
  246. data/examples/i18n/no/Rakefile +0 -6
  247. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
  248. data/examples/i18n/no/features/summering.feature +0 -19
  249. data/examples/i18n/no/features/support/env.rb +0 -6
  250. data/examples/i18n/no/lib/kalkulator.rb +0 -11
  251. data/examples/i18n/pl/Rakefile +0 -6
  252. data/examples/i18n/pl/features/addition.feature +0 -17
  253. data/examples/i18n/pl/features/division.feature +0 -10
  254. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -24
  255. data/examples/i18n/pl/features/support/env.rb +0 -5
  256. data/examples/i18n/pl/lib/calculator.rb +0 -14
  257. data/examples/i18n/pt/Rakefile +0 -6
  258. data/examples/i18n/pt/features/adicao.feature +0 -11
  259. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
  260. data/examples/i18n/pt/features/support/env.rb +0 -5
  261. data/examples/i18n/pt/lib/calculadora.rb +0 -10
  262. data/examples/i18n/ro/Rakefile +0 -6
  263. data/examples/i18n/ro/features/adunare.feature +0 -12
  264. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -21
  265. data/examples/i18n/ro/lib/calculator.rb +0 -11
  266. data/examples/i18n/ru/Rakefile +0 -6
  267. data/examples/i18n/ru/features/addition.feature +0 -11
  268. data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
  269. data/examples/i18n/ru/features/division.feature +0 -16
  270. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
  271. data/examples/i18n/ru/features/support/env.rb +0 -5
  272. data/examples/i18n/ru/features/support/world.rb +0 -8
  273. data/examples/i18n/ru/lib/calculator.rb +0 -24
  274. data/examples/i18n/sk/Rakefile +0 -6
  275. data/examples/i18n/sk/features/addition.feature +0 -17
  276. data/examples/i18n/sk/features/division.feature +0 -10
  277. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -24
  278. data/examples/i18n/sk/lib/calculator.rb +0 -14
  279. data/examples/i18n/sr-Cyrl/Rakefile +0 -6
  280. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
  281. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
  282. data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -5
  283. data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
  284. data/examples/i18n/sr-Latn/Rakefile +0 -6
  285. data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
  286. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -24
  287. data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
  288. data/examples/i18n/sv/Rakefile +0 -6
  289. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -24
  290. data/examples/i18n/sv/features/summering.feature +0 -18
  291. data/examples/i18n/sv/lib/kalkulator.rb +0 -11
  292. data/examples/i18n/tr/Rakefile +0 -6
  293. data/examples/i18n/tr/features/bolme.feature +0 -10
  294. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -24
  295. data/examples/i18n/tr/features/toplama.feature +0 -18
  296. data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
  297. data/examples/i18n/uk/Rakefile +0 -6
  298. data/examples/i18n/uk/features/addition.feature +0 -11
  299. data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
  300. data/examples/i18n/uk/features/division.feature +0 -16
  301. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
  302. data/examples/i18n/uk/features/support/env.rb +0 -5
  303. data/examples/i18n/uk/features/support/world.rb +0 -8
  304. data/examples/i18n/uk/lib/calculator.rb +0 -24
  305. data/examples/i18n/uz/Rakefile +0 -6
  306. data/examples/i18n/uz/features/addition.feature +0 -10
  307. data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
  308. data/examples/i18n/uz/features/division.feature +0 -17
  309. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
  310. data/examples/i18n/uz/features/support/env.rb +0 -5
  311. data/examples/i18n/uz/features/support/world.rb +0 -8
  312. data/examples/i18n/uz/lib/calculator.rb +0 -24
  313. data/examples/i18n/zh-CN/Rakefile +0 -4
  314. data/examples/i18n/zh-CN/features/addition.feature +0 -18
  315. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -26
  316. data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
  317. data/examples/i18n/zh-TW/Rakefile +0 -4
  318. data/examples/i18n/zh-TW/features/addition.feature +0 -17
  319. data/examples/i18n/zh-TW/features/division.feature +0 -11
  320. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -24
  321. data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
  322. data/examples/rspec_doubles/Rakefile +0 -4
  323. data/examples/rspec_doubles/features/mocking.feature +0 -9
  324. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
  325. data/examples/rspec_doubles/features/support/env.rb +0 -12
  326. data/examples/sinatra/README.textile +0 -13
  327. data/examples/sinatra/Rakefile +0 -6
  328. data/examples/sinatra/app.rb +0 -14
  329. data/examples/sinatra/features/add.feature +0 -11
  330. data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
  331. data/examples/sinatra/features/support/env.rb +0 -10
  332. data/examples/sinatra/views/add.erb +0 -7
  333. data/examples/sinatra/views/layout.erb +0 -8
  334. data/examples/tcl/README.textile +0 -11
  335. data/examples/tcl/Rakefile +0 -6
  336. data/examples/tcl/features/fibonnacci.feature +0 -17
  337. data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
  338. data/examples/tcl/features/support/env.rb +0 -6
  339. data/examples/tcl/src/fib.tcl +0 -3
  340. data/examples/test_unit/Gemfile +0 -4
  341. data/examples/test_unit/Rakefile +0 -6
  342. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
  343. data/examples/test_unit/features/test_unit.feature +0 -9
  344. data/examples/watir/README.textile +0 -16
  345. data/examples/watir/Rakefile +0 -12
  346. data/examples/watir/cucumber.yml +0 -1
  347. data/examples/watir/features/search.feature +0 -12
  348. data/examples/watir/features/step_definitions/search_steps.rb +0 -26
  349. data/examples/watir/features/support/env.rb +0 -35
  350. data/examples/watir/features/support/screenshots.rb +0 -47
  351. data/features/docs/api/list_step_defs_as_json.feature +0 -50
  352. data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -29
  353. data/features/docs/cli/backtraces.feature +0 -36
  354. data/features/docs/cli/dry_run.feature +0 -25
  355. data/features/docs/cli/exclude_files.feature +0 -19
  356. data/features/docs/cli/execute_with_tag_filter.feature +0 -117
  357. data/features/docs/cli/randomize.feature +0 -46
  358. data/features/docs/cli/require.feature +0 -27
  359. data/features/docs/cli/run_scenarios_matching_name.feature +0 -104
  360. data/features/docs/cli/run_specific_scenarios.feature +0 -130
  361. data/features/docs/cli/showing_differences.feature +0 -43
  362. data/features/docs/cli/specifying_multiple_formatters.feature +0 -44
  363. data/features/docs/cli/strict_mode.feature +0 -41
  364. data/features/docs/defining_steps/nested_steps.feature +0 -129
  365. data/features/docs/defining_steps/nested_steps_i18n.feature +0 -34
  366. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -73
  367. data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
  368. data/features/docs/defining_steps/printing_messages.feature +0 -148
  369. data/features/docs/defining_steps/skip_scenario.feature +0 -62
  370. data/features/docs/defining_steps/snippets.feature +0 -56
  371. data/features/docs/defining_steps/table_diffing.feature +0 -50
  372. data/features/docs/defining_steps/transforms.feature +0 -63
  373. data/features/docs/exception_in_after_hook.feature +0 -126
  374. data/features/docs/exception_in_after_step_hook.feature +0 -102
  375. data/features/docs/exception_in_before_hook.feature +0 -96
  376. data/features/docs/extending_cucumber/custom_filter.feature +0 -29
  377. data/features/docs/extending_cucumber/custom_formatter.feature +0 -94
  378. data/features/docs/formatters/debug_formatter.feature +0 -47
  379. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  380. data/features/docs/formatters/html_formatter.feature +0 -90
  381. data/features/docs/formatters/json_formatter.feature +0 -696
  382. data/features/docs/formatters/junit_formatter.feature +0 -276
  383. data/features/docs/formatters/pretty_formatter.feature +0 -73
  384. data/features/docs/formatters/progress_formatter.feature +0 -31
  385. data/features/docs/formatters/rerun_formatter.feature +0 -136
  386. data/features/docs/formatters/usage_formatter.feature +0 -102
  387. data/features/docs/getting_started.feature +0 -27
  388. data/features/docs/gherkin/background.feature +0 -559
  389. data/features/docs/gherkin/doc_strings.feature +0 -74
  390. data/features/docs/gherkin/expand_option_for_outlines.feature +0 -46
  391. data/features/docs/gherkin/language_from_header.feature +0 -32
  392. data/features/docs/gherkin/language_help.feature +0 -37
  393. data/features/docs/gherkin/outlines.feature +0 -158
  394. data/features/docs/gherkin/unicode_table.feature +0 -32
  395. data/features/docs/gherkin/using_descriptions.feature +0 -88
  396. data/features/docs/gherkin/using_star_notation.feature +0 -37
  397. data/features/docs/iso-8859-1.feature +0 -6
  398. data/features/docs/post_configuration_hook.feature +0 -49
  399. data/features/docs/profiles.feature +0 -120
  400. data/features/docs/rake_task.feature +0 -141
  401. data/features/docs/raketask.feature +0 -44
  402. data/features/docs/report_called_undefined_steps.feature +0 -57
  403. data/features/docs/wire_protocol.feature +0 -337
  404. data/features/docs/wire_protocol_erb.feature +0 -56
  405. data/features/docs/wire_protocol_table_diffing.feature +0 -125
  406. data/features/docs/wire_protocol_tags.feature +0 -86
  407. data/features/docs/wire_protocol_timeouts.feature +0 -63
  408. data/features/docs/work_in_progress.feature +0 -154
  409. data/features/docs/writing_support_code/after_hooks.feature +0 -56
  410. data/features/docs/writing_support_code/around_hooks.feature +0 -229
  411. data/features/docs/writing_support_code/before_hook.feature +0 -61
  412. data/features/docs/writing_support_code/hook_order.feature +0 -61
  413. data/features/docs/writing_support_code/load_path.feature +0 -17
  414. data/features/docs/writing_support_code/state.feature +0 -32
  415. data/features/docs/writing_support_code/tagged_hooks.feature +0 -57
  416. data/features/lib/step_definitions/aruba_steps.rb +0 -22
  417. data/features/lib/step_definitions/cucumber_steps.rb +0 -50
  418. data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -12
  419. data/features/lib/step_definitions/json_steps.rb +0 -7
  420. data/features/lib/step_definitions/junit_steps.rb +0 -13
  421. data/features/lib/step_definitions/language_steps.rb +0 -8
  422. data/features/lib/step_definitions/profile_steps.rb +0 -15
  423. data/features/lib/step_definitions/ruby_steps.rb +0 -3
  424. data/features/lib/step_definitions/wire_steps.rb +0 -41
  425. data/features/lib/support/env.rb +0 -21
  426. data/features/lib/support/fake_wire_server.rb +0 -77
  427. data/features/lib/support/feature_factory.rb +0 -67
  428. data/features/lib/support/normalise_output.rb +0 -33
  429. data/gem_tasks/contributors.rake +0 -15
  430. data/gem_tasks/cov.rake +0 -5
  431. data/gem_tasks/cucumber.rake +0 -25
  432. data/gem_tasks/downloads.rb +0 -7
  433. data/gem_tasks/environment.rake +0 -7
  434. data/gem_tasks/examples.rake +0 -11
  435. data/gem_tasks/fix_cr_lf.rake +0 -10
  436. data/gem_tasks/flog.rake +0 -4
  437. data/gem_tasks/rspec.rake +0 -6
  438. data/gem_tasks/sass.rake +0 -4
  439. data/gem_tasks/stats +0 -16
  440. data/gem_tasks/versions.txt +0 -74
  441. data/lib/cucumber/ast.rb +0 -13
  442. data/lib/cucumber/ast/facade.rb +0 -117
  443. data/lib/cucumber/core_ext/instance_exec.rb +0 -70
  444. data/lib/cucumber/core_ext/proc.rb +0 -36
  445. data/lib/cucumber/formatter/cucumber.css +0 -285
  446. data/lib/cucumber/formatter/cucumber.sass +0 -247
  447. data/lib/cucumber/formatter/debug.rb +0 -35
  448. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +0 -201
  449. data/lib/cucumber/formatter/gpretty.rb +0 -24
  450. data/lib/cucumber/formatter/html.rb +0 -674
  451. data/lib/cucumber/formatter/jquery-min.js +0 -154
  452. data/lib/cucumber/formatter/json_pretty.rb +0 -10
  453. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1024
  454. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -376
  455. data/lib/cucumber/formatter/legacy_api/results.rb +0 -51
  456. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -30
  457. data/lib/cucumber/language_support.rb +0 -30
  458. data/lib/cucumber/language_support/language_methods.rb +0 -71
  459. data/lib/cucumber/rb_support/rb_hook.rb +0 -18
  460. data/lib/cucumber/rb_support/rb_language.rb +0 -160
  461. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -122
  462. data/lib/cucumber/rb_support/rb_transform.rb +0 -59
  463. data/lib/cucumber/rb_support/rb_world.rb +0 -142
  464. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +0 -21
  465. data/lib/cucumber/rb_support/snippet.rb +0 -149
  466. data/lib/cucumber/wire_support/configuration.rb +0 -38
  467. data/lib/cucumber/wire_support/connection.rb +0 -61
  468. data/lib/cucumber/wire_support/request_handler.rb +0 -32
  469. data/lib/cucumber/wire_support/wire_exception.rb +0 -32
  470. data/lib/cucumber/wire_support/wire_language.rb +0 -68
  471. data/lib/cucumber/wire_support/wire_packet.rb +0 -34
  472. data/lib/cucumber/wire_support/wire_protocol.rb +0 -43
  473. data/lib/cucumber/wire_support/wire_protocol/requests.rb +0 -133
  474. data/lib/cucumber/wire_support/wire_step_definition.rb +0 -19
  475. data/spec/cucumber/cli/configuration_spec.rb +0 -503
  476. data/spec/cucumber/cli/main_spec.rb +0 -105
  477. data/spec/cucumber/cli/options_spec.rb +0 -335
  478. data/spec/cucumber/cli/profile_loader_spec.rb +0 -46
  479. data/spec/cucumber/configuration_spec.rb +0 -23
  480. data/spec/cucumber/constantize_spec.rb +0 -19
  481. data/spec/cucumber/core_ext/proc_spec.rb +0 -69
  482. data/spec/cucumber/file_specs_spec.rb +0 -60
  483. data/spec/cucumber/filters/activate_steps_spec.rb +0 -57
  484. data/spec/cucumber/filters/gated_receiver_spec.rb +0 -47
  485. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -38
  486. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -57
  487. data/spec/cucumber/filters/tag_limits_spec.rb +0 -59
  488. data/spec/cucumber/formatter/ansicolor_spec.rb +0 -32
  489. data/spec/cucumber/formatter/debug_spec.rb +0 -64
  490. data/spec/cucumber/formatter/duration_spec.rb +0 -22
  491. data/spec/cucumber/formatter/html_spec.rb +0 -459
  492. data/spec/cucumber/formatter/interceptor_spec.rb +0 -136
  493. data/spec/cucumber/formatter/junit_spec.rb +0 -196
  494. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2002
  495. data/spec/cucumber/formatter/pretty_spec.rb +0 -810
  496. data/spec/cucumber/formatter/progress_spec.rb +0 -85
  497. data/spec/cucumber/formatter/rerun_spec.rb +0 -107
  498. data/spec/cucumber/formatter/spec_helper.rb +0 -67
  499. data/spec/cucumber/hooks_spec.rb +0 -30
  500. data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -514
  501. data/spec/cucumber/rake/forked_spec.rb +0 -53
  502. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -279
  503. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -152
  504. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
  505. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +0 -22
  506. data/spec/cucumber/rb_support/snippet_spec.rb +0 -137
  507. data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -36
  508. data/spec/cucumber/runtime/support_code_spec.rb +0 -123
  509. data/spec/cucumber/runtime_spec.rb +0 -46
  510. data/spec/cucumber/sell_cucumbers.feature +0 -19
  511. data/spec/cucumber/step_match_spec.rb +0 -79
  512. data/spec/cucumber/wire_support/configuration_spec.rb +0 -64
  513. data/spec/cucumber/wire_support/connection_spec.rb +0 -64
  514. data/spec/cucumber/wire_support/wire_exception_spec.rb +0 -50
  515. data/spec/cucumber/wire_support/wire_language_spec.rb +0 -46
  516. data/spec/cucumber/wire_support/wire_packet_spec.rb +0 -44
  517. data/spec/cucumber/world/pending_spec.rb +0 -46
  518. data/spec/spec_helper.rb +0 -32
@@ -1,35 +0,0 @@
1
- require 'cucumber/formatter/progress'
2
- require 'cucumber/step_definition_light'
3
-
4
- module Cucumber
5
- module Formatter
6
- class Debug
7
- def initialize(runtime, io, options)
8
- @io = io
9
- end
10
-
11
- def log(message)
12
- return unless ENV['DEBUG']
13
- @io.puts "* #{message}"
14
- end
15
-
16
- def respond_to?(*args)
17
- true
18
- end
19
-
20
- def method_missing(name, *args)
21
- print(name)
22
- end
23
-
24
- def puts(*args)
25
- print("puts")
26
- end
27
-
28
- private
29
-
30
- def print(text)
31
- @io.puts text
32
- end
33
- end
34
- end
35
- end
@@ -1,201 +0,0 @@
1
- require 'cucumber/formatter/io'
2
- require 'gherkin/formatter/argument'
3
-
4
- module Cucumber
5
- module Formatter
6
- # Adapts Cucumber formatter events to Gherkin formatter events
7
- # This class will disappear when Cucumber is based on Gherkin's model.
8
- class GherkinFormatterAdapter
9
- def initialize(gherkin_formatter, print_empty_match, options)
10
- @gf = gherkin_formatter
11
- @print_empty_match = print_empty_match
12
- @options = options
13
- @delayed_messages = []
14
- @delayed_embeddings = []
15
- end
16
-
17
- def before_feature(feature)
18
- @gf.uri(feature.file)
19
- @gf.feature(feature.gherkin_statement)
20
- end
21
-
22
- def before_background(background)
23
- @outline = false
24
- @before_steps = true
25
- @gf.background(background.gherkin_statement)
26
- end
27
-
28
- def before_feature_element(feature_element)
29
- @before_steps = true
30
- case(feature_element)
31
- when Core::Ast::Scenario
32
- @outline = false
33
- @gf.scenario(feature_element.gherkin_statement)
34
- when Core::Ast::ScenarioOutline
35
- @outline = true
36
- if @options[:expand]
37
- @in_instantiated_scenario = false
38
- @current_scenario_hash = to_hash(feature_element.gherkin_statement)
39
- else
40
- @gf.scenario_outline(feature_element.gherkin_statement)
41
- end
42
- else
43
- raise "Bad type: #{feature_element.class}"
44
- end
45
- end
46
-
47
- def scenario_name(keyword, name, file_colon_line, source_indent)
48
- if @outline and @options[:expand]
49
- return if not @in_instantiated_scenario
50
- if @new_example_table
51
- @example_row = 1
52
- @new_example_table = false
53
- else
54
- @example_row += 1
55
- end
56
- example_row_hash = @current_example_rows[@example_row].to_hash
57
- scenario = Gherkin::Formatter::Model::Scenario.new(
58
- @current_scenario_hash['comments'],
59
- @current_scenario_hash['tags'],
60
- @current_scenario_hash['keyword'],
61
- @current_scenario_hash['name'],
62
- @current_scenario_hash['description'],
63
- example_row_hash['line'],
64
- example_row_hash['id'])
65
- @gf.scenario(scenario)
66
- end
67
- end
68
-
69
- def before_step(step)
70
- unless @outline and @options[:expand]
71
- @gf.step(step.gherkin_statement)
72
- pass_delayed_output
73
- @before_steps = false
74
- else
75
- if @in_instantiated_scenario
76
- @current_step_hash = to_hash(step.gherkin_statement)
77
- end
78
- end
79
- if @print_empty_match
80
- if(@outline)
81
- match = Gherkin::Formatter::Model::Match.new(step.gherkin_statement.outline_args, nil)
82
- else
83
- match = Gherkin::Formatter::Model::Match.new([], nil)
84
- end
85
- @gf.match(match)
86
- end
87
- end
88
-
89
- def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
90
- arguments = step_match.step_arguments.map{|a| Gherkin::Formatter::Argument.new(a.offset, a.val)}
91
- location = step_match.file_colon_line
92
- match = Gherkin::Formatter::Model::Match.new(arguments, location)
93
- if @print_empty_match
94
- # Trick the formatter to believe that's what was printed previously so we get arg highlights on #result
95
- @gf.instance_variable_set('@match', match)
96
- else
97
- unless @outline and @options[:expand]
98
- @gf.match(match)
99
- end
100
- end
101
-
102
- error_message = exception ? "#{exception.message} (#{exception.class})\n#{exception.backtrace.join("\n")}" : nil
103
- unless @outline
104
- @gf.result(Gherkin::Formatter::Model::Result.new(status, nil, error_message))
105
- else
106
- if @options[:expand] and @in_instantiated_scenario
107
- @current_match = match
108
- @current_result = Gherkin::Formatter::Model::Result.new(status, nil, error_message)
109
- end
110
- end
111
- end
112
-
113
- def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
114
- if @outline and @options[:expand] and @in_instantiated_scenario
115
- @gf.step(Gherkin::Formatter::Model::Step.new(
116
- @current_step_hash['comments'],
117
- @current_step_hash['keyword'],
118
- step_match.format_args(),
119
- file_colon_line.split(':')[1].to_i,
120
- @current_step_hash['rows'],
121
- @current_step_hash['doc_string']))
122
- pass_delayed_output
123
- @before_steps = false
124
- @gf.match(@current_match)
125
- @gf.result(@current_result)
126
- end
127
- end
128
-
129
- def before_examples(examples)
130
- unless @options[:expand]
131
- @gf.examples(examples.gherkin_statement)
132
- else
133
- @in_instantiated_scenario = true
134
- @new_example_table = true
135
- @current_example_rows = to_hash(examples.gherkin_statement)['rows']
136
- end
137
- end
138
-
139
- #used for capturing duration
140
- def after_step(step)
141
- unless @outline and @options[:expand] and not @in_instantiated_scenario
142
- step.duration.tap { |duration| @gf.append_duration(duration.nanoseconds / 10 ** 9.0) }
143
- end
144
- end
145
-
146
- def after_feature(feature)
147
- @gf.eof
148
- end
149
-
150
- def after_features(features)
151
- @gf.done
152
- end
153
-
154
- def embed(file, mime_type, label)
155
- if File.file?(file)
156
- data = File.open(file, 'rb') { |f| f.read }
157
- else
158
- if mime_type =~ /;base64$/
159
- mime_type = mime_type[0..-8]
160
- data = Base64.decode64(file)
161
- else
162
- data = file
163
- end
164
- end
165
- if defined?(JRUBY_VERSION)
166
- data = data.to_java_bytes
167
- end
168
- unless @before_steps
169
- @gf.embedding(mime_type, data)
170
- else
171
- @delayed_embeddings.push [mime_type, data]
172
- end
173
- end
174
-
175
- def puts(message)
176
- unless @before_steps
177
- @gf.write(message)
178
- else
179
- @delayed_messages.push message
180
- end
181
- end
182
-
183
- private
184
-
185
- def to_hash(gherkin_statement)
186
- if defined?(JRUBY_VERSION)
187
- gherkin_statement.toMap()
188
- else
189
- gherkin_statement.to_hash
190
- end
191
- end
192
-
193
- def pass_delayed_output
194
- @delayed_messages.each { |message| @gf.write(message) }
195
- @delayed_embeddings.each { |embed_data| @gf.embedding(embed_data[0], embed_data[1]) }
196
- @delayed_messages = []
197
- @delayed_embeddings = []
198
- end
199
- end
200
- end
201
- end
@@ -1,24 +0,0 @@
1
- require 'cucumber/formatter/gherkin_formatter_adapter'
2
- require 'cucumber/formatter/io'
3
- require 'gherkin/formatter/argument'
4
- require 'gherkin/formatter/pretty_formatter'
5
-
6
- module Cucumber
7
- module Formatter
8
- # The formatter used for <tt>--format gpretty</tt>
9
- class Gpretty < GherkinFormatterAdapter
10
- include Io
11
-
12
- def initialize(runtime, io, options)
13
- @io = ensure_io(io, "json")
14
- super(Gherkin::Formatter::PrettyFormatter.new(@io, false), true)
15
- end
16
-
17
- def after_feature(feature)
18
- super
19
- @io.puts
20
- end
21
- end
22
- end
23
- end
24
-
@@ -1,674 +0,0 @@
1
- require 'erb'
2
- require 'builder'
3
- require 'cucumber/formatter/duration'
4
- require 'cucumber/formatter/io'
5
- require 'pathname'
6
-
7
- module Cucumber
8
- module Formatter
9
- class Html
10
-
11
- # TODO: remove coupling to types
12
- AST_CLASSES = {
13
- Cucumber::Core::Ast::Scenario => 'scenario',
14
- Cucumber::Core::Ast::ScenarioOutline => 'scenario outline'
15
- }
16
- AST_DATA_TABLE = LegacyApi::Ast::MultilineArg::DataTable
17
-
18
- include ERB::Util # for the #h method
19
- include Duration
20
- include Io
21
-
22
- def initialize(runtime, path_or_io, options)
23
- @io = ensure_io(path_or_io, "html")
24
- @runtime = runtime
25
- @options = options
26
- @buffer = {}
27
- @builder = create_builder(@io)
28
- @feature_number = 0
29
- @scenario_number = 0
30
- @step_number = 0
31
- @header_red = nil
32
- @delayed_messages = []
33
- @img_id = 0
34
- @text_id = 0
35
- @inside_outline = false
36
- @previous_step_keyword = nil
37
- end
38
-
39
- def embed(src, mime_type, label)
40
- case(mime_type)
41
- when /^image\/(png|gif|jpg|jpeg)/
42
- unless File.file?(src) or src =~ /^data:image\/(png|gif|jpg|jpeg);base64,/
43
- type = mime_type =~ /;base[0-9]+$/ ? mime_type : mime_type + ";base64"
44
- src = "data:" + type + "," + src
45
- end
46
- embed_image(src, label)
47
- when /^text\/plain/
48
- embed_text(src, label)
49
- end
50
- end
51
-
52
- def embed_image(src, label)
53
- id = "img_#{@img_id}"
54
- @img_id += 1
55
- if @io.respond_to?(:path) and File.file?(src)
56
- out_dir = Pathname.new(File.dirname(File.absolute_path(@io.path)))
57
- src = Pathname.new(File.absolute_path(src)).relative_path_from(out_dir)
58
- end
59
- @builder.span(:class => 'embed') do |pre|
60
- pre << %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">#{label}</a><br>&nbsp;
61
- <img id="#{id}" style="display: none" src="#{src}"/>}
62
- end
63
- end
64
-
65
- def embed_text(src, label)
66
- id = "text_#{@text_id}"
67
- @text_id += 1
68
- @builder.span(:class => 'embed') do |pre|
69
- pre << %{<a id="#{id}" href="#{src}" title="#{label}">#{label}</a>}
70
- end
71
- end
72
-
73
-
74
- def before_features(features)
75
- @step_count = features && features.step_count || 0 #TODO: Make this work with core!
76
-
77
- # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
78
- @builder.declare!(
79
- :DOCTYPE,
80
- :html,
81
- :PUBLIC,
82
- '-//W3C//DTD XHTML 1.0 Strict//EN',
83
- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
84
- )
85
-
86
- @builder << '<html xmlns ="http://www.w3.org/1999/xhtml">'
87
- @builder.head do
88
- @builder.meta('http-equiv' => 'Content-Type', :content => 'text/html;charset=utf-8')
89
- @builder.title 'Cucumber'
90
- inline_css
91
- inline_js
92
- end
93
- @builder << '<body>'
94
- @builder << "<!-- Step count #{@step_count}-->"
95
- @builder << '<div class="cucumber">'
96
- @builder.div(:id => 'cucumber-header') do
97
- @builder.div(:id => 'label') do
98
- @builder.h1('Cucumber Features')
99
- end
100
- @builder.div(:id => 'summary') do
101
- @builder.p('',:id => 'totals')
102
- @builder.p('',:id => 'duration')
103
- @builder.div(:id => 'expand-collapse') do
104
- @builder.p('Expand All', :id => 'expander')
105
- @builder.p('Collapse All', :id => 'collapser')
106
- end
107
- end
108
- end
109
- end
110
-
111
- def after_features(features)
112
- print_stats(features)
113
- @builder << '</div>'
114
- @builder << '</body>'
115
- @builder << '</html>'
116
- end
117
-
118
- def before_feature(feature)
119
- @exceptions = []
120
- @builder << '<div class="feature">'
121
- end
122
-
123
- def after_feature(feature)
124
- @builder << '</div>'
125
- end
126
-
127
- def before_comment(comment)
128
- @builder << '<pre class="comment">'
129
- end
130
-
131
- def after_comment(comment)
132
- @builder << '</pre>'
133
- end
134
-
135
- def comment_line(comment_line)
136
- @builder.text!(comment_line)
137
- @builder.br
138
- end
139
-
140
- def after_tags(tags)
141
- @tag_spacer = nil
142
- end
143
-
144
- def tag_name(tag_name)
145
- @builder.text!(@tag_spacer) if @tag_spacer
146
- @tag_spacer = ' '
147
- @builder.span(tag_name, :class => 'tag')
148
- end
149
-
150
- def feature_name(keyword, name)
151
- lines = name.split(/\r?\n/)
152
- return if lines.empty?
153
- @builder.h2 do |h2|
154
- @builder.span(keyword + ': ' + lines[0], :class => 'val')
155
- end
156
- @builder.p(:class => 'narrative') do
157
- lines[1..-1].each do |line|
158
- @builder.text!(line.strip)
159
- @builder.br
160
- end
161
- end
162
- end
163
-
164
- def before_test_case(test_case)
165
- @previous_step_keyword = nil
166
- end
167
-
168
- def before_background(background)
169
- @in_background = true
170
- @builder << '<div class="background">'
171
- end
172
-
173
- def after_background(background)
174
- @in_background = nil
175
- @builder << '</div>'
176
- end
177
-
178
- def background_name(keyword, name, file_colon_line, source_indent)
179
- @listing_background = true
180
- @builder.h3(:id => "background_#{@scenario_number}") do |h3|
181
- @builder.span(keyword, :class => 'keyword')
182
- @builder.text!(' ')
183
- @builder.span(name, :class => 'val')
184
- end
185
- end
186
-
187
- def before_feature_element(feature_element)
188
- @scenario_number+=1
189
- @scenario_red = false
190
- css_class = AST_CLASSES[feature_element.class]
191
- @builder << "<div class='#{css_class}'>"
192
- @in_scenario_outline = feature_element.class == Cucumber::Core::Ast::ScenarioOutline
193
- end
194
-
195
- def after_feature_element(feature_element)
196
- unless @in_scenario_outline
197
- print_messages
198
- @builder << '</ol>'
199
- end
200
- @builder << '</div>'
201
- @in_scenario_outline = nil
202
- end
203
-
204
- def scenario_name(keyword, name, file_colon_line, source_indent)
205
- @builder.span(:class => 'scenario_file') do
206
- @builder << file_colon_line
207
- end
208
- @listing_background = false
209
- @builder.h3(:id => "scenario_#{@scenario_number}") do
210
- @builder.span(keyword + ':', :class => 'keyword')
211
- @builder.text!(' ')
212
- @builder.span(name, :class => 'val')
213
- end
214
- end
215
-
216
- def before_outline_table(outline_table)
217
- @inside_outline = true
218
- @outline_row = 0
219
- @builder << '<table>'
220
- end
221
-
222
- def after_outline_table(outline_table)
223
- @builder << '</table>'
224
- @outline_row = nil
225
- @inside_outline = false
226
- end
227
-
228
- def before_examples(examples)
229
- @builder << '<div class="examples">'
230
- end
231
-
232
- def after_examples(examples)
233
- @builder << '</div>'
234
- end
235
-
236
- def examples_name(keyword, name)
237
- @builder.h4 do
238
- @builder.span(keyword, :class => 'keyword')
239
- @builder.text!(' ')
240
- @builder.span(name, :class => 'val')
241
- end
242
- end
243
-
244
- def before_steps(steps)
245
- @builder << '<ol>'
246
- end
247
-
248
- def after_steps(steps)
249
- print_messages
250
- @builder << '</ol>' if @in_background or @in_scenario_outline
251
- end
252
-
253
- def before_step(step)
254
- print_messages
255
- @step_id = step.dom_id
256
- @step_number += 1
257
- @step = step
258
- end
259
-
260
- def after_step(step)
261
- move_progress
262
- end
263
-
264
- def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
265
- @step_match = step_match
266
- @hide_this_step = false
267
- if exception
268
- if @exceptions.include?(exception)
269
- @hide_this_step = true
270
- return
271
- end
272
- @exceptions << exception
273
- end
274
- if status != :failed && @in_background ^ background
275
- @hide_this_step = true
276
- return
277
- end
278
- @status = status
279
- return if @hide_this_step
280
- set_scenario_color(status)
281
- @builder << "<li id='#{@step_id}' class='step #{status}'>"
282
- end
283
-
284
- def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
285
- return if @hide_this_step
286
- # print snippet for undefined steps
287
- unless outline_step?(@step)
288
- keyword = @step.actual_keyword(@previous_step_keyword)
289
- @previous_step_keyword = keyword
290
- end
291
- if status == :undefined
292
- @builder.pre do |pre|
293
- # TODO: snippet text should be an event sent to the formatter so we don't
294
- # have this couping to the runtime.
295
- pre << @runtime.snippet_text(keyword,step_match.instance_variable_get("@name") || '', @step.multiline_arg)
296
- end
297
- end
298
- @builder << '</li>'
299
- print_messages
300
- end
301
-
302
- def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
303
- background_in_scenario = background && !@listing_background
304
- @skip_step = background_in_scenario
305
-
306
- unless @skip_step
307
- build_step(keyword, step_match, status)
308
- end
309
- end
310
-
311
- def exception(exception, status)
312
- return if @hide_this_step
313
- print_messages
314
- build_exception_detail(exception)
315
- end
316
-
317
- def extra_failure_content(file_colon_line)
318
- @snippet_extractor ||= SnippetExtractor.new
319
- "<pre class=\"ruby\"><code>#{@snippet_extractor.snippet(file_colon_line)}</code></pre>"
320
- end
321
-
322
- def before_multiline_arg(multiline_arg)
323
- return if @hide_this_step || @skip_step
324
- if AST_DATA_TABLE === multiline_arg
325
- @builder << '<table>'
326
- end
327
- end
328
-
329
- def after_multiline_arg(multiline_arg)
330
- return if @hide_this_step || @skip_step
331
- if AST_DATA_TABLE === multiline_arg
332
- @builder << '</table>'
333
- end
334
- end
335
-
336
- def doc_string(string)
337
- return if @hide_this_step
338
- @builder.pre(:class => 'val') do |pre|
339
- @builder << h(string).gsub("\n", '&#x000A;')
340
- end
341
- end
342
-
343
- def before_table_row(table_row)
344
- @row_id = table_row.dom_id
345
- @col_index = 0
346
- return if @hide_this_step
347
- @builder << "<tr class='step' id='#{@row_id}'>"
348
- end
349
-
350
- def after_table_row(table_row)
351
- return if @hide_this_step
352
- print_table_row_messages
353
- @builder << '</tr>'
354
- if table_row.exception
355
- @builder.tr do
356
- @builder.td(:colspan => @col_index.to_s, :class => 'failed') do
357
- @builder.pre do |pre|
358
- pre << h(format_exception(table_row.exception))
359
- end
360
- end
361
- end
362
- if table_row.exception.is_a? ::Cucumber::Pending
363
- set_scenario_color_pending
364
- else
365
- set_scenario_color_failed
366
- end
367
- end
368
- if @outline_row
369
- @outline_row += 1
370
- end
371
- @step_number += 1
372
- move_progress
373
- end
374
-
375
- def table_cell_value(value, status)
376
- return if @hide_this_step
377
-
378
- @cell_type = @outline_row == 0 ? :th : :td
379
- attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'step'}
380
- attributes[:class] += " #{status}" if status
381
- build_cell(@cell_type, value, attributes)
382
- set_scenario_color(status) if @inside_outline
383
- @col_index += 1
384
- end
385
-
386
- def puts(message)
387
- @delayed_messages << message
388
- #@builder.pre(message, :class => 'message')
389
- end
390
-
391
- def print_messages
392
- return if @delayed_messages.empty?
393
-
394
- #@builder.ol do
395
- @delayed_messages.each do |ann|
396
- @builder.li(:class => 'step message') do
397
- @builder << ann
398
- end
399
- end
400
- #end
401
- empty_messages
402
- end
403
-
404
- def print_table_row_messages
405
- return if @delayed_messages.empty?
406
-
407
- @builder.td(:class => 'message') do
408
- @builder << @delayed_messages.join(", ")
409
- end
410
- empty_messages
411
- end
412
-
413
- def empty_messages
414
- @delayed_messages = []
415
- end
416
-
417
- protected
418
-
419
- def build_exception_detail(exception)
420
- backtrace = Array.new
421
- @builder.div(:class => 'message') do
422
- message = exception.message
423
- if defined?(RAILS_ROOT) && message.include?('Exception caught')
424
- matches = message.match(/Showing <i>(.+)<\/i>(?:.+) #(\d+)/)
425
- backtrace += ["#{RAILS_ROOT}/#{matches[1]}:#{matches[2]}"] if matches
426
- matches = message.match(/<code>([^(\/)]+)<\//m)
427
- message = matches ? matches[1] : ""
428
- end
429
-
430
- unless exception.instance_of?(RuntimeError)
431
- message = "#{message} (#{exception.class})"
432
- end
433
-
434
- @builder.pre do
435
- @builder.text!(message)
436
- end
437
- end
438
- @builder.div(:class => 'backtrace') do
439
- @builder.pre do
440
- backtrace = exception.backtrace
441
- backtrace.delete_if { |x| x =~ /\/gems\/(cucumber|rspec)/ }
442
- @builder << backtrace_line(backtrace.join("\n"))
443
- end
444
- end
445
- extra = extra_failure_content(backtrace)
446
- @builder << extra unless extra == ""
447
- end
448
-
449
- def set_scenario_color(status)
450
- if status.nil? or status == :undefined or status == :pending
451
- set_scenario_color_pending
452
- end
453
- if status == :failed
454
- set_scenario_color_failed
455
- end
456
- end
457
-
458
- def set_scenario_color_failed
459
- @builder.script do
460
- @builder.text!("makeRed('cucumber-header');") unless @header_red
461
- @header_red = true
462
- scenario_or_background = @in_background ? "background" : "scenario"
463
- @builder.text!("makeRed('#{scenario_or_background}_#{@scenario_number}');") unless @scenario_red
464
- @scenario_red = true
465
- end
466
- end
467
-
468
- def set_scenario_color_pending
469
- @builder.script do
470
- @builder.text!("makeYellow('cucumber-header');") unless @header_red
471
- scenario_or_background = @in_background ? "background" : "scenario"
472
- @builder.text!("makeYellow('#{scenario_or_background}_#{@scenario_number}');") unless @scenario_red
473
- end
474
- end
475
-
476
- def build_step(keyword, step_match, status)
477
- step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
478
- @builder.div(:class => 'step_name') do |div|
479
- @builder.span(keyword, :class => 'keyword')
480
- @builder.span(:class => 'step val') do |name|
481
- name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
482
- end
483
- end
484
-
485
- step_file = step_match.file_colon_line
486
- step_file.gsub(/^([^:]*\.rb):(\d*)/) do
487
- if ENV['TM_PROJECT_DIRECTORY']
488
- step_file = "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
489
- end
490
- end
491
-
492
- @builder.div(:class => 'step_file') do |div|
493
- @builder.span do
494
- @builder << step_file
495
- end
496
- end
497
- end
498
-
499
- def build_cell(cell_type, value, attributes)
500
- @builder.__send__(cell_type, attributes) do
501
- @builder.div do
502
- @builder.span(value,:class => 'step param')
503
- end
504
- end
505
- end
506
-
507
- def inline_css
508
- @builder.style(:type => 'text/css') do
509
- @builder << File.read(File.dirname(__FILE__) + '/cucumber.css')
510
- end
511
- end
512
-
513
- def inline_js
514
- @builder.script(:type => 'text/javascript') do
515
- @builder << inline_jquery
516
- @builder << inline_js_content
517
- end
518
- end
519
-
520
- def inline_jquery
521
- File.read(File.dirname(__FILE__) + '/jquery-min.js')
522
- end
523
-
524
- def inline_js_content
525
- <<-EOF
526
-
527
- SCENARIOS = "h3[id^='scenario_'],h3[id^=background_]";
528
-
529
- $(document).ready(function() {
530
- $(SCENARIOS).css('cursor', 'pointer');
531
- $(SCENARIOS).click(function() {
532
- $(this).siblings().toggle(250);
533
- });
534
-
535
- $("#collapser").css('cursor', 'pointer');
536
- $("#collapser").click(function() {
537
- $(SCENARIOS).siblings().hide();
538
- });
539
-
540
- $("#expander").css('cursor', 'pointer');
541
- $("#expander").click(function() {
542
- $(SCENARIOS).siblings().show();
543
- });
544
- })
545
-
546
- function moveProgressBar(percentDone) {
547
- $("cucumber-header").css('width', percentDone +"%");
548
- }
549
- function makeRed(element_id) {
550
- $('#'+element_id).css('background', '#C40D0D');
551
- $('#'+element_id).css('color', '#FFFFFF');
552
- }
553
- function makeYellow(element_id) {
554
- $('#'+element_id).css('background', '#FAF834');
555
- $('#'+element_id).css('color', '#000000');
556
- }
557
-
558
- EOF
559
- end
560
-
561
- def move_progress
562
- @builder << " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
563
- end
564
-
565
- def percent_done
566
- result = 100.0
567
- if @step_count != 0
568
- result = ((@step_number).to_f / @step_count.to_f * 1000).to_i / 10.0
569
- end
570
- result
571
- end
572
-
573
- def format_exception(exception)
574
- (["#{exception.message}"] + exception.backtrace).join("\n")
575
- end
576
-
577
- def backtrace_line(line)
578
- line.gsub(/^([^:]*\.(?:rb|feature|haml)):(\d*).*$/) do
579
- if ENV['TM_PROJECT_DIRECTORY']
580
- "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
581
- else
582
- line
583
- end
584
- end
585
- end
586
-
587
- def print_stats(features)
588
- @builder << "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{format_duration(features.duration)} seconds</strong>\";</script>"
589
- @builder << "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{print_stat_string(features)}\";</script>"
590
- end
591
-
592
- def print_stat_string(features)
593
- string = String.new
594
- string << dump_count(@runtime.scenarios.length, "scenario")
595
- scenario_count = print_status_counts{|status| @runtime.scenarios(status)}
596
- string << scenario_count if scenario_count
597
- string << "<br />"
598
- string << dump_count(@runtime.steps.length, "step")
599
- step_count = print_status_counts{|status| @runtime.steps(status)}
600
- string << step_count if step_count
601
- end
602
-
603
- def print_status_counts
604
- counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
605
- elements = yield status
606
- elements.any? ? "#{elements.length} #{status.to_s}" : nil
607
- end.compact
608
- return " (#{counts.join(', ')})" if counts.any?
609
- end
610
-
611
- def dump_count(count, what, state=nil)
612
- [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
613
- end
614
-
615
- def create_builder(io)
616
- Builder::XmlMarkup.new(:target => io, :indent => 0)
617
- end
618
-
619
- def outline_step?(step)
620
- not @step.step.respond_to?(:actual_keyword)
621
- end
622
-
623
- class SnippetExtractor #:nodoc:
624
- class NullConverter; def convert(code, pre); code; end; end #:nodoc:
625
- begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
626
-
627
- def snippet(error)
628
- raw_code, line = snippet_for(error[0])
629
- highlighted = @@converter.convert(raw_code, false)
630
- highlighted << "\n<span class=\"comment\"># gem install syntax to get syntax highlighting</span>" if @@converter.is_a?(NullConverter)
631
- post_process(highlighted, line)
632
- end
633
-
634
- def snippet_for(error_line)
635
- if error_line =~ /(.*):(\d+)/
636
- file = $1
637
- line = $2.to_i
638
- [lines_around(file, line), line]
639
- else
640
- ["# Couldn't get snippet for #{error_line}", 1]
641
- end
642
- end
643
-
644
- def lines_around(file, line)
645
- if File.file?(file)
646
- begin
647
- lines = File.open(file).read.split("\n")
648
- rescue ArgumentError
649
- return "# Couldn't get snippet for #{file}"
650
- end
651
- min = [0, line-3].max
652
- max = [line+1, lines.length-1].min
653
- selected_lines = []
654
- selected_lines.join("\n")
655
- lines[min..max].join("\n")
656
- else
657
- "# Couldn't get snippet for #{file}"
658
- end
659
- end
660
-
661
- def post_process(highlighted, offending_line)
662
- new_lines = []
663
- highlighted.split("\n").each_with_index do |line, i|
664
- new_line = "<span class=\"linenum\">#{offending_line+i-2}</span>#{line}"
665
- new_line = "<span class=\"offending\">#{new_line}</span>" if i == 2
666
- new_lines << new_line
667
- end
668
- new_lines.join("\n")
669
- end
670
-
671
- end
672
- end
673
- end
674
- end