cucumber 3.0.0.pre.1 → 4.0.0.rc.4

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