cucumber 3.0.0.pre.1 → 3.0.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.cucumberproignore +6 -0
  3. data/.rubocop.yml +13 -0
  4. data/.rubocop_todo.yml +1075 -0
  5. data/.travis.yml +42 -8
  6. data/CONTRIBUTING.md +8 -1
  7. data/Gemfile +16 -10
  8. data/History.md +96 -36
  9. data/README.md +12 -3
  10. data/Rakefile +12 -2
  11. data/appveyor.yml +26 -0
  12. data/cucumber.gemspec +15 -10
  13. data/cucumber.yml +9 -10
  14. data/examples/i18n/Rakefile +1 -1
  15. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +2 -2
  16. data/examples/i18n/ar/lib/calculator.rb +2 -2
  17. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
  18. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +4 -4
  19. data/examples/i18n/ca/lib/calculadora.rb +2 -2
  20. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +4 -4
  21. data/examples/i18n/cs/lib/calculator.rb +3 -3
  22. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +4 -4
  23. data/examples/i18n/da/lib/lommeregner.rb +2 -2
  24. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +4 -4
  25. data/examples/i18n/de/lib/calculator.rb +2 -2
  26. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +5 -5
  27. data/examples/i18n/el/lib/calculator.rb +2 -2
  28. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
  29. data/examples/i18n/en-lol/lib/basket.rb +2 -2
  30. data/examples/i18n/en-lol/lib/belly.rb +2 -2
  31. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +4 -4
  32. data/examples/i18n/en/lib/calculator.rb +2 -2
  33. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +4 -4
  34. data/examples/i18n/eo/lib/calculator.rb +2 -2
  35. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +5 -5
  36. data/examples/i18n/es/lib/calculador.rb +2 -2
  37. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +4 -4
  38. data/examples/i18n/et/lib/kalkulaator.rb +3 -3
  39. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +3 -3
  40. data/examples/i18n/fi/lib/laskin.rb +1 -1
  41. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
  42. data/examples/i18n/fr/features/support/env.rb +1 -1
  43. data/examples/i18n/fr/lib/calculatrice.rb +2 -2
  44. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +4 -4
  45. data/examples/i18n/he/lib/calculator.rb +1 -1
  46. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +3 -3
  47. data/examples/i18n/hi/lib/calculator.rb +1 -1
  48. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +4 -4
  49. data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
  50. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +4 -4
  51. data/examples/i18n/hu/lib/calculator.rb +1 -1
  52. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +4 -4
  53. data/examples/i18n/id/lib/calculator.rb +2 -2
  54. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +4 -4
  55. data/examples/i18n/it/lib/calcolatrice.rb +3 -3
  56. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
  57. data/examples/i18n/ja/features/support/env.rb +1 -1
  58. data/examples/i18n/ja/lib/calculator.rb +2 -2
  59. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +4 -4
  60. data/examples/i18n/ko/lib/calculator.rb +2 -2
  61. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +4 -4
  62. data/examples/i18n/lt/lib/calculator.rb +2 -2
  63. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +4 -4
  64. data/examples/i18n/lv/lib/calculator.rb +2 -2
  65. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
  66. data/examples/i18n/no/features/support/env.rb +1 -1
  67. data/examples/i18n/no/lib/kalkulator.rb +2 -2
  68. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +4 -4
  69. data/examples/i18n/pl/lib/calculator.rb +2 -2
  70. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
  71. data/examples/i18n/pt/features/support/env.rb +1 -1
  72. data/examples/i18n/pt/lib/calculadora.rb +1 -1
  73. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +5 -5
  74. data/examples/i18n/ro/lib/calculator.rb +1 -1
  75. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
  76. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +4 -4
  77. data/examples/i18n/sk/lib/calculator.rb +2 -2
  78. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
  79. data/examples/i18n/sr-Cyrl/features/support/env.rb +1 -1
  80. data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
  81. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +4 -4
  82. data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
  83. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +3 -3
  84. data/examples/i18n/sv/lib/kalkulator.rb +2 -2
  85. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +4 -4
  86. data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
  87. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
  88. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
  89. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +5 -5
  90. data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
  91. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +4 -4
  92. data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
  93. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
  94. data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
  95. data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
  96. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
  97. data/examples/watir/features/step_definitions/search_steps.rb +3 -3
  98. data/examples/watir/features/support/screenshots.rb +5 -5
  99. data/features/docs/api/list_step_defs_as_json.feature +21 -7
  100. data/features/docs/api/listen_for_events.feature +1 -1
  101. data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
  102. data/features/docs/cli/dry_run.feature +3 -0
  103. data/features/docs/cli/execute_with_tag_filter.feature +4 -4
  104. data/features/docs/cli/fail_fast.feature +2 -0
  105. data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
  106. data/features/docs/cli/randomize.feature +2 -2
  107. data/features/docs/cli/retry_failing_tests.feature +28 -3
  108. data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
  109. data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
  110. data/features/docs/cli/strict_mode.feature +6 -0
  111. data/features/docs/defining_steps/nested_steps.feature +5 -1
  112. data/features/docs/defining_steps/nested_steps_i18n.feature +1 -0
  113. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
  114. data/features/docs/defining_steps/printing_messages.feature +1 -1
  115. data/features/docs/defining_steps/skip_scenario.feature +1 -0
  116. data/features/docs/defining_steps/snippets.feature +18 -18
  117. data/features/docs/events/gherkin_source_read_event.feature +43 -0
  118. data/features/docs/events/step_activated_event.feature +36 -0
  119. data/features/docs/events/step_definition_registered_event.feature +29 -0
  120. data/features/docs/events/test_case_finished_event.feature +35 -0
  121. data/features/docs/events/test_case_starting_event.feature +54 -0
  122. data/features/docs/events/test_run_finished_event.feature +40 -0
  123. data/features/docs/events/test_run_starting_event.feature +41 -0
  124. data/features/docs/events/test_step_finished_event.feature +47 -0
  125. data/features/docs/events/test_step_starting_event.feature +43 -0
  126. data/features/docs/exception_in_after_hook.feature +3 -2
  127. data/features/docs/exception_in_after_step_hook.feature +2 -0
  128. data/features/docs/exception_in_around_hook.feature +2 -0
  129. data/features/docs/exception_in_before_hook.feature +3 -1
  130. data/features/docs/extending_cucumber/custom_formatter.feature +21 -1
  131. data/features/docs/formatters/json_formatter.feature +4 -4
  132. data/features/docs/formatters/junit_formatter.feature +7 -6
  133. data/features/docs/formatters/pretty_formatter.feature +1 -0
  134. data/features/docs/formatters/progress_formatter.feature +1 -0
  135. data/features/docs/formatters/rerun_formatter.feature +2 -0
  136. data/features/docs/formatters/summary_formatter.feature +1 -0
  137. data/features/docs/formatters/usage_formatter.feature +3 -0
  138. data/features/docs/getting_started.feature +2 -1
  139. data/features/docs/gherkin/background.feature +5 -5
  140. data/features/docs/gherkin/doc_strings.feature +2 -0
  141. data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
  142. data/features/docs/gherkin/outlines.feature +4 -0
  143. data/features/docs/gherkin/unicode_table.feature +1 -0
  144. data/features/docs/gherkin/using_descriptions.feature +1 -0
  145. data/features/docs/gherkin/using_star_notation.feature +1 -1
  146. data/features/docs/post_configuration_hook.feature +1 -1
  147. data/features/docs/rake_task.feature +5 -0
  148. data/features/docs/raketask.feature +3 -1
  149. data/features/docs/work_in_progress.feature +5 -2
  150. data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
  151. data/features/docs/writing_support_code/around_hooks.feature +6 -0
  152. data/features/docs/writing_support_code/before_hook.feature +1 -0
  153. data/features/docs/writing_support_code/hook_order.feature +3 -1
  154. data/features/docs/writing_support_code/parameter_types.feature +75 -0
  155. data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
  156. data/features/lib/step_definitions/aruba_steps.rb +4 -10
  157. data/features/lib/step_definitions/cli_steps.rb +2 -2
  158. data/features/lib/step_definitions/cucumber_steps.rb +8 -12
  159. data/features/lib/step_definitions/iso-8859-1_steps.rb +2 -2
  160. data/features/lib/step_definitions/json_steps.rb +1 -1
  161. data/features/lib/step_definitions/junit_steps.rb +1 -1
  162. data/features/lib/step_definitions/language_steps.rb +2 -2
  163. data/features/lib/step_definitions/profile_steps.rb +6 -6
  164. data/features/lib/step_definitions/retry_steps.rb +3 -3
  165. data/features/lib/step_definitions/ruby_steps.rb +1 -1
  166. data/features/lib/support/env.rb +1 -1
  167. data/features/lib/support/fake_wire_server.rb +7 -2
  168. data/features/lib/support/feature_factory.rb +1 -1
  169. data/features/lib/support/normalise_output.rb +13 -12
  170. data/features/lib/support/parameter_types.rb +8 -0
  171. data/gem_tasks/contributors.rake +9 -6
  172. data/gem_tasks/environment.rake +1 -5
  173. data/gem_tasks/examples.rake +1 -1
  174. data/gem_tasks/fix_cr_lf.rake +1 -1
  175. data/gem_tasks/flog.rake +2 -2
  176. data/gem_tasks/rspec.rake +1 -1
  177. data/lib/autotest/cucumber_mixin.rb +15 -15
  178. data/lib/autotest/discover.rb +2 -2
  179. data/lib/cucumber/cli/configuration.rb +7 -13
  180. data/lib/cucumber/cli/main.rb +6 -6
  181. data/lib/cucumber/cli/options.rb +163 -126
  182. data/lib/cucumber/cli/profile_loader.rb +24 -20
  183. data/lib/cucumber/configuration.rb +12 -17
  184. data/lib/cucumber/constantize.rb +1 -1
  185. data/lib/cucumber/core_ext/string.rb +1 -1
  186. data/lib/cucumber/deprecate.rb +1 -1
  187. data/lib/cucumber/events.rb +11 -1
  188. data/lib/cucumber/events/gherkin_source_read.rb +17 -0
  189. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +2 -2
  190. data/lib/cucumber/events/step_definition_registered.rb +1 -1
  191. data/lib/cucumber/events/test_case_finished.rb +18 -0
  192. data/lib/cucumber/events/test_case_starting.rb +15 -0
  193. data/lib/cucumber/events/test_run_starting.rb +16 -0
  194. data/lib/cucumber/events/test_step_finished.rb +20 -0
  195. data/lib/cucumber/events/test_step_starting.rb +17 -0
  196. data/lib/cucumber/filters.rb +1 -0
  197. data/lib/cucumber/filters/activate_steps.rb +1 -1
  198. data/lib/cucumber/filters/broadcast_test_run_starting_event.rb +27 -0
  199. data/lib/cucumber/filters/retry.rb +1 -1
  200. data/lib/cucumber/filters/tag_limits.rb +3 -3
  201. data/lib/cucumber/filters/tag_limits/verifier.rb +1 -1
  202. data/lib/cucumber/formatter/ansicolor.rb +8 -11
  203. data/lib/cucumber/formatter/backtrace_filter.rb +19 -7
  204. data/lib/cucumber/formatter/console.rb +16 -19
  205. data/lib/cucumber/formatter/console_counts.rb +8 -21
  206. data/lib/cucumber/formatter/console_issues.rb +30 -9
  207. data/lib/cucumber/formatter/duration.rb +1 -1
  208. data/lib/cucumber/formatter/fail_fast.rb +1 -1
  209. data/lib/cucumber/formatter/html.rb +168 -242
  210. data/lib/cucumber/formatter/html_builder.rb +110 -0
  211. data/lib/cucumber/formatter/inline-js.js +30 -0
  212. data/lib/cucumber/formatter/interceptor.rb +2 -2
  213. data/lib/cucumber/formatter/json.rb +12 -12
  214. data/lib/cucumber/formatter/junit.rb +11 -11
  215. data/lib/cucumber/formatter/legacy_api/adapter.rb +27 -27
  216. data/lib/cucumber/formatter/legacy_api/ast.rb +16 -20
  217. data/lib/cucumber/formatter/legacy_api/results.rb +6 -8
  218. data/lib/cucumber/formatter/pretty.rb +17 -17
  219. data/lib/cucumber/formatter/progress.rb +11 -12
  220. data/lib/cucumber/formatter/rerun.rb +1 -1
  221. data/lib/cucumber/formatter/steps.rb +1 -1
  222. data/lib/cucumber/formatter/unicode.rb +1 -1
  223. data/lib/cucumber/formatter/usage.rb +12 -12
  224. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +1 -1
  225. data/lib/cucumber/gherkin/formatter/escaping.rb +1 -1
  226. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +44 -17
  227. data/lib/cucumber/glue/hook.rb +43 -0
  228. data/lib/cucumber/glue/invoke_in_world.rb +70 -0
  229. data/lib/cucumber/glue/proto_world.rb +225 -0
  230. data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +45 -86
  231. data/lib/cucumber/{rb_support → glue}/snippet.rb +62 -25
  232. data/lib/cucumber/glue/step_definition.rb +143 -0
  233. data/lib/cucumber/glue/world_factory.rb +23 -0
  234. data/lib/cucumber/hooks.rb +4 -4
  235. data/lib/cucumber/multiline_argument.rb +2 -2
  236. data/lib/cucumber/multiline_argument/data_table.rb +40 -178
  237. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
  238. data/lib/cucumber/platform.rb +3 -5
  239. data/lib/cucumber/rake/task.rb +11 -11
  240. data/lib/cucumber/rspec/disable_option_parser.rb +1 -1
  241. data/lib/cucumber/rspec/doubles.rb +1 -1
  242. data/lib/cucumber/running_test_case.rb +2 -2
  243. data/lib/cucumber/runtime.rb +46 -34
  244. data/lib/cucumber/runtime/after_hooks.rb +1 -1
  245. data/lib/cucumber/runtime/for_programming_languages.rb +1 -36
  246. data/lib/cucumber/runtime/support_code.rb +19 -15
  247. data/lib/cucumber/runtime/user_interface.rb +4 -11
  248. data/lib/cucumber/step_argument.rb +0 -2
  249. data/lib/cucumber/step_definition_light.rb +1 -0
  250. data/lib/cucumber/step_match.rb +16 -15
  251. data/lib/cucumber/step_match_search.rb +2 -3
  252. data/lib/cucumber/term/ansicolor.rb +1 -1
  253. data/lib/cucumber/version +1 -1
  254. data/lib/simplecov_setup.rb +1 -1
  255. data/scripts/invite-collaborator +40 -0
  256. data/scripts/update-history +83 -0
  257. data/spec/cucumber/cli/configuration_spec.rb +95 -97
  258. data/spec/cucumber/cli/main_spec.rb +7 -7
  259. data/spec/cucumber/cli/options_spec.rb +112 -78
  260. data/spec/cucumber/cli/profile_loader_spec.rb +24 -5
  261. data/spec/cucumber/cli/rerun_spec.rb +20 -20
  262. data/spec/cucumber/configuration_spec.rb +47 -47
  263. data/spec/cucumber/constantize_spec.rb +2 -2
  264. data/spec/cucumber/events_spec.rb +9 -0
  265. data/spec/cucumber/file_specs_spec.rb +25 -25
  266. data/spec/cucumber/filters/activate_steps_spec.rb +16 -16
  267. data/spec/cucumber/filters/gated_receiver_spec.rb +6 -6
  268. data/spec/cucumber/filters/retry_spec.rb +22 -9
  269. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +11 -11
  270. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +14 -14
  271. data/spec/cucumber/filters/tag_limits_spec.rb +8 -8
  272. data/spec/cucumber/formatter/ansicolor_spec.rb +9 -9
  273. data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
  274. data/spec/cucumber/formatter/console_counts_spec.rb +1 -1
  275. data/spec/cucumber/formatter/duration_spec.rb +3 -3
  276. data/spec/cucumber/formatter/fail_fast_spec.rb +21 -21
  277. data/spec/cucumber/formatter/html_spec.rb +58 -58
  278. data/spec/cucumber/formatter/json_spec.rb +44 -46
  279. data/spec/cucumber/formatter/junit_spec.rb +43 -45
  280. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +43 -43
  281. data/spec/cucumber/formatter/pretty_spec.rb +107 -107
  282. data/spec/cucumber/formatter/progress_spec.rb +20 -20
  283. data/spec/cucumber/formatter/rerun_spec.rb +1 -1
  284. data/spec/cucumber/formatter/spec_helper.rb +6 -5
  285. data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +20 -5
  286. data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
  287. data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +61 -25
  288. data/spec/cucumber/glue/step_definition_spec.rb +207 -0
  289. data/spec/cucumber/hooks_spec.rb +3 -3
  290. data/spec/cucumber/multiline_argument/data_table_spec.rb +177 -133
  291. data/spec/cucumber/project_initializer_spec.rb +10 -10
  292. data/spec/cucumber/rake/forked_spec.rb +10 -10
  293. data/spec/cucumber/rake/task_spec.rb +20 -20
  294. data/spec/cucumber/running_test_case_spec.rb +35 -35
  295. data/spec/cucumber/runtime/for_programming_languages_spec.rb +1 -30
  296. data/spec/cucumber/runtime_spec.rb +2 -2
  297. data/spec/cucumber/step_argument_spec.rb +5 -5
  298. data/spec/cucumber/step_match_search_spec.rb +31 -41
  299. data/spec/cucumber/step_match_spec.rb +33 -33
  300. data/spec/cucumber/world/pending_spec.rb +10 -10
  301. metadata +117 -47
  302. data/features/docs/formatters/debug_formatter.feature +0 -47
  303. data/features/docs/writing_support_code/transforms.feature +0 -98
  304. data/features/lib/step_definitions/wire_steps.rb +0 -59
  305. data/gem_tasks/cucumber.rake +0 -26
  306. data/lib/cucumber/core_ext/instance_exec.rb +0 -71
  307. data/lib/cucumber/formatter/debug.rb +0 -36
  308. data/lib/cucumber/rb_support/rb_hook.rb +0 -20
  309. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -132
  310. data/lib/cucumber/rb_support/rb_transform.rb +0 -60
  311. data/lib/cucumber/rb_support/rb_world.rb +0 -171
  312. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -5
  313. data/spec/cucumber/formatter/debug_spec.rb +0 -65
  314. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -321
  315. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -200
  316. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -47
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+ require 'builder'
3
+ require 'pathname'
4
+
5
+ module Cucumber
6
+ module Formatter
7
+ class HtmlBuilder < Builder::XmlMarkup
8
+ def embed_text(src: nil, label: nil, id: nil)
9
+ raise ArgumentError, 'missing required argument' unless src && label && id # for Ruby 2.0 compatibility
10
+
11
+ prepend_to_span('embed', %{<a id="#{id}" href="#{src}" title="#{label}">#{label}</a>})
12
+ end
13
+
14
+ def embed_image(src: nil, label: nil, id: nil)
15
+ raise ArgumentError, 'missing required argument' unless src && label && id # for Ruby 2.0 compatibility
16
+
17
+ prepend_to_span(
18
+ 'embed',
19
+ %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">#{label}</a><br>&nbsp;
20
+ <img id="#{id}" style="display: none" src="#{src}"/>}
21
+ )
22
+ end
23
+
24
+ def declare!
25
+ super(:DOCTYPE, :html, :PUBLIC, '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd')
26
+ end
27
+
28
+ def build_document!
29
+ declare! # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
30
+
31
+ self << '<html xmlns ="http://www.w3.org/1999/xhtml">'
32
+
33
+ set_head_tags
34
+ end
35
+
36
+ def format_features!(features)
37
+ step_count = features && features.step_count || 0
38
+
39
+ self << '<body>'
40
+ self << "<!-- Step count #{step_count}-->"
41
+ self << '<div class="cucumber">'
42
+
43
+ div(id: 'cucumber-header') do
44
+ div(id: 'label') do
45
+ h1 'Cucumber Features'
46
+ end
47
+
48
+ summary_div
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def summary_div
55
+ div(id: 'summary') do
56
+ p('', id: 'totals')
57
+ p('', id: 'duration')
58
+
59
+ expand_collapse
60
+ end
61
+ end
62
+
63
+ def expand_collapse
64
+ div(id: 'expand-collapse') do
65
+ p('Expand All', id: 'expander')
66
+ p('Collapse All', id: 'collapser')
67
+ end
68
+ end
69
+
70
+ def prepend_to_span(span_class, content)
71
+ span(class: span_class) do |pre|
72
+ pre << content
73
+ end
74
+ end
75
+
76
+ def inline_css
77
+ style(type: 'text/css') do
78
+ pn = ::Pathname.new(::File.dirname(__FILE__) + '/cucumber.css')
79
+ self << pn.read
80
+ end
81
+ end
82
+
83
+ def inline_js
84
+ script(type: 'text/javascript') do
85
+ self << inline_jquery
86
+ self << inline_js_content
87
+ end
88
+ end
89
+
90
+ def inline_jquery
91
+ pn = ::Pathname.new(::File.dirname(__FILE__) + '/jquery-min.js')
92
+ pn.read
93
+ end
94
+
95
+ def inline_js_content # rubocop:disable
96
+ pn = ::Pathname.new(::File.dirname(__FILE__) + '/inline-js.js')
97
+ pn.read
98
+ end
99
+
100
+ def set_head_tags
101
+ head do
102
+ meta('http-equiv' => 'Content-Type', :content => 'text/html;charset=utf-8')
103
+ title 'Cucumber'
104
+ inline_css
105
+ inline_js
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,30 @@
1
+ SCENARIOS = "h3[id^='scenario_'],h3[id^=background_]";
2
+
3
+ $(document).ready(function() {
4
+ $(SCENARIOS).css('cursor', 'pointer');
5
+ $(SCENARIOS).click(function() {
6
+ $(this).siblings().toggle(250);
7
+ });
8
+
9
+ $("#collapser").css('cursor', 'pointer');
10
+ $("#collapser").click(function() {
11
+ $(SCENARIOS).siblings().hide();
12
+ });
13
+
14
+ $("#expander").css('cursor', 'pointer');
15
+ $("#expander").click(function() {
16
+ $(SCENARIOS).siblings().show();
17
+ });
18
+ })
19
+
20
+ function moveProgressBar(percentDone) {
21
+ $("cucumber-header").css('width', percentDone +"%");
22
+ }
23
+ function makeRed(element_id) {
24
+ $('#'+element_id).css('background', '#C40D0D');
25
+ $('#'+element_id).css('color', '#FFFFFF');
26
+ }
27
+ function makeYellow(element_id) {
28
+ $('#'+element_id).css('background', '#FAF834');
29
+ $('#'+element_id).css('color', '#000000');
30
+ }
@@ -13,7 +13,7 @@ module Cucumber
13
13
  end
14
14
 
15
15
  def write(str)
16
- lock.synchronize do
16
+ lock.synchronize do
17
17
  @buffer << str if @wrapped
18
18
  return @pipe.write(str)
19
19
  end
@@ -71,7 +71,7 @@ module Cucumber
71
71
  end
72
72
  end
73
73
 
74
- private
74
+ private
75
75
  def lock
76
76
  @lock||=Mutex.new
77
77
  end
@@ -66,12 +66,12 @@ module Cucumber
66
66
  end
67
67
 
68
68
  def on_test_case_finished(event)
69
- test_case, result = *event.attributes
69
+ _test_case, result = *event.attributes
70
70
  result = result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
71
71
  add_failed_around_hook(result) if result.failed? && !@any_step_failed
72
72
  end
73
73
 
74
- def on_test_run_finished(event)
74
+ def on_test_run_finished(_event)
75
75
  @io.write(MultiJson.dump(@feature_hashes, pretty: true))
76
76
  end
77
77
 
@@ -170,7 +170,7 @@ module Cucumber
170
170
  end
171
171
 
172
172
  def create_doc_string_hash(doc_string)
173
- content_type = doc_string.content_type ? doc_string.content_type : ""
173
+ content_type = doc_string.content_type ? doc_string.content_type : ''
174
174
  {
175
175
  value: doc_string.content,
176
176
  content_type: content_type,
@@ -192,12 +192,12 @@ module Cucumber
192
192
  def add_failed_around_hook(result)
193
193
  @step_or_hook_hash = {}
194
194
  around_hooks << @step_or_hook_hash
195
- @step_or_hook_hash[:match] = { location: "unknown_hook_location:1" }
195
+ @step_or_hook_hash[:match] = { location: 'unknown_hook_location:1' }
196
196
 
197
197
  @step_or_hook_hash[:result] = create_result_hash(result)
198
198
  end
199
199
 
200
- def create_match_hash(test_step, result)
200
+ def create_match_hash(test_step, _result)
201
201
  { location: test_step.action_location.to_s }
202
202
  end
203
203
 
@@ -218,7 +218,7 @@ module Cucumber
218
218
 
219
219
  def encode64(data)
220
220
  # strip newlines from the encoded data
221
- Base64.encode64(data).gsub(/\n/, '')
221
+ Base64.encode64(data).delete("\n")
222
222
  end
223
223
 
224
224
  class Builder
@@ -245,11 +245,11 @@ module Cucumber
245
245
  }
246
246
  unless feature.tags.empty?
247
247
  @feature_hash[:tags] = create_tags_array(feature.tags)
248
- if @test_case_hash[:tags]
249
- @test_case_hash[:tags] = @feature_hash[:tags] + @test_case_hash[:tags]
250
- else
251
- @test_case_hash[:tags] = @feature_hash[:tags]
252
- end
248
+ @test_case_hash[:tags] = if @test_case_hash[:tags]
249
+ @feature_hash[:tags] + @test_case_hash[:tags]
250
+ else
251
+ @feature_hash[:tags]
252
+ end
253
253
  end
254
254
  @feature_hash[:comments] = Formatter.create_comments_array(feature.comments) unless feature.comments.empty?
255
255
  @test_case_hash[:id].insert(0, @feature_hash[:id] + ';')
@@ -316,7 +316,7 @@ module Cucumber
316
316
  private
317
317
 
318
318
  def create_id(element)
319
- element.name.downcase.gsub(/ /, '-')
319
+ element.name.downcase.tr(' ', '-')
320
320
  end
321
321
 
322
322
  def create_tags_array(tags)
@@ -23,7 +23,7 @@ module Cucumber
23
23
  config.on_event :test_case_finished, &method(:on_test_case_finished)
24
24
  config.on_event :test_step_finished, &method(:on_test_step_finished)
25
25
  config.on_event :test_run_finished, &method(:on_test_run_finished)
26
- @reportdir = ensure_dir(config.out_stream, "junit")
26
+ @reportdir = ensure_dir(config.out_stream, 'junit')
27
27
  @config = config
28
28
  @features_data = Hash.new { |h,k| h[k] = {
29
29
  feature: nil,
@@ -68,7 +68,7 @@ module Cucumber
68
68
  Interceptor::Pipe.unwrap! :stderr
69
69
  end
70
70
 
71
- def on_test_run_finished(event)
71
+ def on_test_run_finished(_event)
72
72
  @features_data.each { |file, data| end_feature(data) }
73
73
  end
74
74
 
@@ -92,7 +92,7 @@ module Cucumber
92
92
  :errors => feature_data[:errors],
93
93
  :skipped => feature_data[:skipped],
94
94
  :tests => feature_data[:tests],
95
- :time => "%.6f" % feature_data[:time],
95
+ :time => format('%.6f', feature_data[:time]),
96
96
  :name => feature_data[:feature].name ) do
97
97
  @testsuite << feature_data[:builder].target!
98
98
  end
@@ -103,8 +103,8 @@ module Cucumber
103
103
  def create_output_string(test_case, scenario, result, row_name)
104
104
  output = "#{test_case.keyword}: #{scenario}\n\n"
105
105
  return output if result.ok?(@config.strict?)
106
- if test_case.keyword == "Scenario"
107
- output += "#{@failing_step_source.keyword}" unless hook?(@failing_step_source)
106
+ if test_case.keyword == 'Scenario'
107
+ output += @failing_step_source.keyword.to_s unless hook?(@failing_step_source)
108
108
  output += "#{@failing_step_source.name}\n"
109
109
  else
110
110
  output += "Example row: #{row_name}\n"
@@ -113,7 +113,7 @@ module Cucumber
113
113
  end
114
114
 
115
115
  def hook?(step)
116
- ["Before hook", "After hook", "AfterStep hook"].include? step.name
116
+ ['Before hook', 'After hook', 'AfterStep hook'].include? step.name
117
117
  end
118
118
 
119
119
  def build_testcase(result, scenario_designation, output)
@@ -122,7 +122,7 @@ module Cucumber
122
122
  classname = @current_feature_data[:feature].name
123
123
  name = scenario_designation
124
124
 
125
- @current_feature_data[:builder].testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
125
+ @current_feature_data[:builder].testcase(:classname => classname, :name => name, :time => format('%.6f', duration)) do
126
126
  if !result.passed? && result.ok?(@config.strict?)
127
127
  @current_feature_data[:builder].skipped
128
128
  @current_feature_data[:skipped] += 1
@@ -182,8 +182,8 @@ module Cucumber
182
182
  attr_reader :scenario_name, :name_suffix, :row_name
183
183
 
184
184
  def initialize(test_case)
185
- @name_suffix = ""
186
- @row_name = ""
185
+ @name_suffix = ''
186
+ @row_name = ''
187
187
  test_case.describe_source_to self
188
188
  end
189
189
 
@@ -192,12 +192,12 @@ module Cucumber
192
192
  end
193
193
 
194
194
  def scenario(scenario)
195
- @scenario_name = (scenario.name.nil? || scenario.name == "") ? "Unnamed scenario" : scenario.name
195
+ @scenario_name = (scenario.name.nil? || scenario.name == '') ? 'Unnamed scenario' : scenario.name
196
196
  self
197
197
  end
198
198
 
199
199
  def scenario_outline(outline)
200
- @scenario_name = (outline.name.nil? || outline.name == "") ? "Unnamed scenario outline" : outline.name
200
+ @scenario_name = (outline.name.nil? || outline.name == '') ? 'Unnamed scenario outline' : outline.name
201
201
  self
202
202
  end
203
203
 
@@ -61,7 +61,7 @@ module Cucumber
61
61
 
62
62
  def collect_matches
63
63
  result = {}
64
- config.on_event(:step_match) do |event|
64
+ config.on_event(:step_activated) do |event|
65
65
  test_step, step_match = *event.attributes
66
66
  result[test_step.source.last] = step_match
67
67
  end
@@ -151,7 +151,7 @@ module Cucumber
151
151
  @result = CaseSource.new
152
152
  end
153
153
 
154
- def method_missing(name, node, test_case_result, *args)
154
+ def method_missing(name, node, _test_case_result, *_args)
155
155
  result.send "#{name}=", node
156
156
  end
157
157
  end
@@ -175,7 +175,7 @@ module Cucumber
175
175
  @result = StepSource.new
176
176
  end
177
177
 
178
- def method_missing(name, node, step_result, *args)
178
+ def method_missing(name, node, step_result, *_args)
179
179
  result.send "#{name}=", node
180
180
  result.send "#{name}_result=", LegacyResultBuilder.new(step_result)
181
181
  end
@@ -220,7 +220,7 @@ module Cucumber
220
220
 
221
221
  attr_reader :current_test_step_source
222
222
 
223
- def before_test_case(test_case)
223
+ def before_test_case(_test_case)
224
224
  @before_hook_results = Ast::HookResultCollection.new
225
225
  @test_step_results = []
226
226
  end
@@ -258,22 +258,22 @@ module Cucumber
258
258
  @previous_test_case_scenario_outline = current_test_step_source && current_test_step_source.scenario_outline
259
259
  end
260
260
 
261
- def before_hook(location, result)
261
+ def before_hook(_location, result)
262
262
  @before_hook_results << Ast::HookResult.new(LegacyResultBuilder.new(result), @delayed_messages, @delayed_embeddings)
263
263
  @delayed_messages = []
264
264
  @delayed_embeddings = []
265
265
  end
266
266
 
267
- def after_hook(location, result)
267
+ def after_hook(_location, result)
268
268
  # if the scenario has no steps, we can hit this before we've created the scenario printer
269
269
  # ideally we should call switch_step_container in before_step_step
270
- switch_step_container if !@child
270
+ switch_step_container if !@child
271
271
  @child.after_hook Ast::HookResult.new(LegacyResultBuilder.new(result), @delayed_messages, @delayed_embeddings)
272
272
  @delayed_messages = []
273
273
  @delayed_embeddings = []
274
274
  end
275
275
 
276
- def after_step_hook(hook, result)
276
+ def after_step_hook(_hook, result)
277
277
  p current_test_step_source if current_test_step_source.step.nil?
278
278
  line = current_test_step_source.step.backtrace_line
279
279
  @child.after_step_hook Ast::HookResult.new(LegacyResultBuilder.new(result).
@@ -359,7 +359,7 @@ module Cucumber
359
359
 
360
360
  if @failed_hidden_background_step
361
361
  indent = Indent.new(@child.node)
362
- step_invocation = @failed_hidden_background_step.build_step_invocation(indent, matches, config, messages = [], embeddings = [])
362
+ step_invocation = @failed_hidden_background_step.build_step_invocation(indent, matches, config, [], [])
363
363
  @child.step_invocation(step_invocation, @failed_hidden_background_step)
364
364
  @failed_hidden_background_step = nil
365
365
  end
@@ -388,11 +388,11 @@ module Cucumber
388
388
  @previous_outline_child.after unless same_scenario_outline_as_previous_test_case?(source)
389
389
  end
390
390
  end
391
- unless from_scenario_outline_to_hidden_backgroud(@child, child)
392
- @child.after
393
- @previous_outline_child = nil
394
- else
391
+ if from_scenario_outline_to_hidden_backgroud(@child, child)
395
392
  @previous_outline_child = @child
393
+ else
394
+ @child.after
395
+ @previous_outline_child = nil
396
396
  end
397
397
  end
398
398
  child.before unless to_scenario_outline(child) and same_scenario_outline_as_previous_test_case?(source)
@@ -495,7 +495,7 @@ module Cucumber
495
495
  return @source_of_failed_step
496
496
  end
497
497
 
498
- def step_invocation(step_invocation, source)
498
+ def step_invocation(_step_invocation, source)
499
499
  if source.step_result.status == :failed
500
500
  @source_of_failed_step = source
501
501
  end
@@ -522,7 +522,7 @@ module Cucumber
522
522
  self
523
523
  end
524
524
 
525
- def step_invocation(step_invocation, source)
525
+ def step_invocation(step_invocation, _source)
526
526
  @child ||= StepsPrinter.new(formatter).before
527
527
  @child.step_invocation step_invocation
528
528
  end
@@ -531,7 +531,7 @@ module Cucumber
531
531
  result.accept formatter
532
532
  end
533
533
 
534
- def after_test_case(test_case, result)
534
+ def after_test_case(_test_case, result)
535
535
  @test_case_result = result
536
536
  after
537
537
  end
@@ -592,7 +592,7 @@ module Cucumber
592
592
  end
593
593
 
594
594
  def step_invocation(step_invocation, source)
595
- node, result = source.step, source.step_result
595
+ _node, result = source.step, source.step_result
596
596
  @last_step_result = result
597
597
  @child.step_invocation(step_invocation, source)
598
598
  end
@@ -636,14 +636,14 @@ module Cucumber
636
636
  steps_printer.after
637
637
  end
638
638
 
639
- def scenario_outline(node, &descend)
639
+ def scenario_outline(_node, &descend)
640
640
  descend.call(self)
641
641
  end
642
642
 
643
643
  def outline_step(step)
644
644
  step_match = NoStepMatch.new(step, step.name)
645
645
  step_invocation = LegacyResultBuilder.new(Core::Test::Result::Skipped.new).
646
- step_invocation(step_match, step, indent, background = nil, configuration, messages = [], embeddings = [])
646
+ step_invocation(step_match, step, indent, nil, configuration, [], [])
647
647
  steps_printer.step_invocation step_invocation
648
648
  end
649
649
 
@@ -699,11 +699,11 @@ module Cucumber
699
699
  return if examples_table_row == @current
700
700
  @child.after if @child
701
701
  row = ExampleTableRow.new(examples_table_row)
702
- if !configuration.expand?
703
- @child = TableRowPrinter.new(formatter, row, before_hook_results).before
704
- else
705
- @child = ExpandTableRowPrinter.new(formatter, row, before_hook_results).before
706
- end
702
+ @child = if !configuration.expand?
703
+ TableRowPrinter.new(formatter, row, before_hook_results).before
704
+ else
705
+ ExpandTableRowPrinter.new(formatter, row, before_hook_results).before
706
+ end
707
707
  @current = examples_table_row
708
708
  end
709
709
 
@@ -746,7 +746,7 @@ module Cucumber
746
746
  descend.call(self)
747
747
  end
748
748
 
749
- def examples_table_row(row, &descend)
749
+ def examples_table_row(row, &_descend)
750
750
  width = char_length_of(row.values[index])
751
751
  @result = width if width > result
752
752
  end
@@ -771,7 +771,7 @@ module Cucumber
771
771
  @after_step_hook_result << result
772
772
  end
773
773
 
774
- def after_test_case(*args)
774
+ def after_test_case(*_args)
775
775
  after
776
776
  end
777
777
 
@@ -999,7 +999,7 @@ module Cucumber
999
999
  Cucumber::Formatter::BacktraceFilter.new(@exception.dup).exception
1000
1000
  end
1001
1001
 
1002
- def filtered_step_exception(step)
1002
+ def filtered_step_exception(_step)
1003
1003
  exception = filtered_exception
1004
1004
  return Cucumber::Formatter::BacktraceFilter.new(exception).exception
1005
1005
  end