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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -11,7 +11,7 @@ module Cucumber
11
11
  end
12
12
 
13
13
  def args_from(profile)
14
- unless cucumber_yml.has_key?(profile)
14
+ unless cucumber_yml.key?(profile)
15
15
  raise(ProfileNotFound, <<-END_OF_ERROR)
16
16
  Could not find profile: '#{profile}'
17
17
 
@@ -22,34 +22,39 @@ Defined profiles in cucumber.yml:
22
22
 
23
23
  args_from_yml = cucumber_yml[profile] || ''
24
24
 
25
- case(args_from_yml)
26
- when String
27
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
28
- if(Cucumber::WINDOWS)
29
- #Shellwords treats backslash as an escape character so here's a rudimentary approximation of the same code
30
- args_from_yml = args_from_yml.split
31
- args_from_yml = args_from_yml.collect {|x| x.gsub(/^\"(.*)\"/,'\1') }
32
- else
33
- require 'shellwords'
34
- args_from_yml = Shellwords.shellwords(args_from_yml)
35
- end
36
- when Array
37
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
25
+ require 'shellwords'
26
+
27
+ case args_from_yml
28
+ when String
29
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
30
+ if Cucumber::WINDOWS
31
+ # Shellwords treats backslash as an escape character so we have to mask it out temporarily
32
+
33
+ placeholder = 'pseudo_unique_backslash_placeholder'
34
+ sanitized_line = args_from_yml.gsub('\\', placeholder)
35
+
36
+ args_from_yml = Shellwords.shellwords(sanitized_line).collect { |argument| argument.gsub(placeholder, '\\') }
38
37
  else
39
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
38
+ args_from_yml = Shellwords.shellwords(args_from_yml)
39
+ end
40
+ when Array
41
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
42
+ else
43
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
40
44
  end
45
+
41
46
  args_from_yml
42
47
  end
43
48
 
44
49
  def has_profile?(profile)
45
- cucumber_yml.has_key?(profile)
50
+ cucumber_yml.key?(profile)
46
51
  end
47
52
 
48
53
  def cucumber_yml_defined?
49
54
  cucumber_file && File.exist?(cucumber_file)
50
55
  end
51
56
 
52
- private
57
+ private
53
58
 
54
59
  # Loads the profile, processing it through ERB and YAML, and returns it as a hash.
55
60
  def cucumber_yml
@@ -62,13 +67,13 @@ Defined profiles in cucumber.yml:
62
67
  require 'yaml'
63
68
  begin
64
69
  @cucumber_erb = ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
65
- rescue Exception => e
70
+ rescue StandardError
66
71
  raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
67
72
  end
68
73
 
69
74
  begin
70
75
  @cucumber_yml = YAML::load(@cucumber_erb)
71
- rescue StandardError => e
76
+ rescue StandardError
72
77
  raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
73
78
  end
74
79
 
@@ -89,4 +94,3 @@ Defined profiles in cucumber.yml:
89
94
  end
90
95
  end
91
96
  end
92
-
@@ -4,7 +4,6 @@ require 'cucumber/cli/rerun_file'
4
4
  require 'cucumber/events'
5
5
  require 'cucumber/core/event_bus'
6
6
  require 'forwardable'
7
- require 'cucumber/core/gherkin/tag_expression'
8
7
  require 'cucumber'
9
8
 
10
9
  module Cucumber
@@ -130,13 +129,8 @@ module Cucumber
130
129
  with_default_features_path(dirs)
131
130
  end
132
131
 
133
- # todo: remove
134
- def tag_expression
135
- Cucumber::Core::Gherkin::TagExpression.new(@options[:tag_expressions])
136
- end
137
-
138
132
  def tag_limits
139
- tag_expression.limits.to_hash
133
+ @options[:tag_limits]
140
134
  end
141
135
 
142
136
  def tag_expressions
@@ -153,7 +147,7 @@ module Cucumber
153
147
 
154
148
  def feature_files
155
149
  potential_feature_files = with_default_features_path(paths).map do |path|
156
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
150
+ path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
157
151
  path = path.chomp('/')
158
152
 
159
153
  # TODO: Move to using feature loading strategies stored in
@@ -179,7 +173,7 @@ module Cucumber
179
173
 
180
174
  def all_files_to_load
181
175
  files = require_dirs.map do |path|
182
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
176
+ path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
183
177
  path = path.gsub(/\/$/, '') # Strip trailing slash.
184
178
  File.directory?(path) ? Dir["#{path}/**/*"] : path
185
179
  end.flatten.uniq
@@ -195,12 +189,13 @@ module Cucumber
195
189
  end
196
190
 
197
191
  def formatter_factories
198
- @options[:formats].map do |format_and_out|
199
- format = format_and_out[0]
200
- path_or_io = format_and_out[1]
192
+ formats.map do |format, formatter_options, path_or_io|
201
193
  begin
202
194
  factory = formatter_class(format)
203
- yield factory, path_or_io, Cli::Options.new(STDOUT, STDERR, @options)
195
+ yield factory,
196
+ formatter_options,
197
+ path_or_io,
198
+ Cli::Options.new(STDOUT, STDERR, @options)
204
199
  rescue Exception => e
205
200
  raise e, "#{e.message}\nError creating formatter: #{format}", e.backtrace
206
201
  end
@@ -208,7 +203,7 @@ module Cucumber
208
203
  end
209
204
 
210
205
  def formatter_class(format)
211
- if(builtin = Cli::Options::BUILTIN_FORMATS[format])
206
+ if (builtin = Cli::Options::BUILTIN_FORMATS[format])
212
207
  constantize(builtin[0])
213
208
  else
214
209
  constantize(format)
@@ -242,7 +237,7 @@ module Cucumber
242
237
  @options[:event_bus]
243
238
  end
244
239
 
245
- private
240
+ private
246
241
 
247
242
  def default_options
248
243
  {
@@ -261,12 +256,12 @@ module Cucumber
261
256
  :snippets => true,
262
257
  :source => true,
263
258
  :duration => true,
264
- :event_bus => Core::EventBus.new(Core::Events.registry.merge(Cucumber::Events.registry))
259
+ :event_bus => Cucumber::Events.make_event_bus
265
260
  }
266
261
  end
267
262
 
268
263
  def default_features_paths
269
- ["features"]
264
+ ['features']
270
265
  end
271
266
 
272
267
  def with_default_features_path(paths)
@@ -29,7 +29,7 @@ module Cucumber
29
29
  camel_cased_word.to_s.gsub(/::/, '/').
30
30
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
31
31
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
32
- tr("-", "_").
32
+ tr('-', '_').
33
33
  downcase
34
34
  end
35
35
 
@@ -4,7 +4,7 @@ class String #:nodoc:
4
4
  if n >= 0
5
5
  gsub(/^/, ' ' * n)
6
6
  else
7
- gsub(/^ {0,#{-n}}/, "")
7
+ gsub(/^ {0,#{-n}}/, '')
8
8
  end
9
9
  end
10
10
  end
@@ -13,7 +13,7 @@ module Cucumber
13
13
  end
14
14
 
15
15
  module ForDevelopers
16
- def self.call(message, method, remove_after_version)
16
+ def self.call(_message, _method, remove_after_version)
17
17
  if Cucumber::VERSION > remove_after_version
18
18
  raise "This method is due for removal after version #{remove_after_version}"
19
19
  end
@@ -18,11 +18,21 @@ module Cucumber
18
18
  # end
19
19
  #
20
20
  module Events
21
+ def self.make_event_bus
22
+ Core::EventBus.new(registry)
23
+ end
24
+
21
25
  def self.registry
22
26
  Core::Events.build_registry(
27
+ TestCaseStarting,
28
+ TestCaseFinished,
29
+ TestStepFinished,
30
+ TestStepStarting,
23
31
  StepDefinitionRegistered,
24
- StepMatch,
32
+ StepActivated,
25
33
  TestRunFinished,
34
+ GherkinSourceRead,
35
+ TestRunStarting
26
36
  )
27
37
  end
28
38
  end
@@ -0,0 +1,17 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Fired after we've read in the contents of a feature file
7
+ class GherkinSourceRead < Core::Event.new(:path, :body)
8
+
9
+ # The path to the file
10
+ attr_reader :path
11
+
12
+ # The raw Gherkin source
13
+ attr_reader :body
14
+ end
15
+
16
+ end
17
+ end
@@ -4,8 +4,8 @@ require 'cucumber/core/events'
4
4
  module Cucumber
5
5
  module Events
6
6
 
7
- # Event fired when a step is matched to a definition
8
- class StepMatch < Core::Event.new(:test_step, :step_match)
7
+ # Event fired when a step is activated
8
+ class StepActivated < Core::Event.new(:test_step, :step_match)
9
9
 
10
10
  # The test step that was matched.
11
11
  #
@@ -10,7 +10,7 @@ module Cucumber
10
10
 
11
11
  #_The step definition that was just registered.
12
12
  #
13
- # @return [Cucumber::Core::Test::Case]
13
+ # @return [RbSupport::RbStepDefinition]
14
14
  attr_reader :step_definition
15
15
 
16
16
  #_@private
@@ -0,0 +1,18 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Case} has finished executing
7
+ class TestCaseFinished < Core::Events::TestCaseFinished
8
+
9
+ # @return [Cucumber::Core::Test::Case] that was executed
10
+ attr_reader :test_case
11
+
12
+ # @return [Cucumber::Core::Test::Result] the result of running the {Cucumber::Core::Test::Step}
13
+ attr_reader :result
14
+
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Case} is about to be executed
7
+ class TestCaseStarting < Core::Events::TestCaseStarting
8
+
9
+ # @return [Cucumber::Core::Test::Case] the test case to be executed
10
+ attr_reader :test_case
11
+
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/core/events'
3
+
4
+ module Cucumber
5
+ module Events
6
+
7
+ # Event fired once all test cases have been filtered before
8
+ # the first one is executed.
9
+ class TestRunStarting < Core::Event.new(:test_cases)
10
+
11
+ # @return [Array<Cucumber::Core::Test::Case>] the test cases to be executed
12
+ attr_reader :test_cases
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Step} has finished executing
7
+ class TestStepFinished < Core::Events::TestStepFinished
8
+
9
+ # @return [Cucumber::Core::Test::Step] the test step that was executed
10
+ attr_reader :test_step
11
+
12
+ # @return [Cucumber::Core::Test::Result] the result of running the {Cucumber::Core::Test::Step}
13
+ attr_reader :result
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+
20
+
@@ -0,0 +1,17 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Step} is about to be executed
7
+ class TestStepStarting < Core::Events::TestStepStarting
8
+
9
+ # @return [Cucumber::Core::Test::Step] the test step to be executed
10
+ attr_reader :test_step
11
+
12
+ end
13
+
14
+ end
15
+ end
16
+
17
+
@@ -4,6 +4,7 @@ require 'cucumber/filters/apply_after_step_hooks'
4
4
  require 'cucumber/filters/apply_before_hooks'
5
5
  require 'cucumber/filters/apply_after_hooks'
6
6
  require 'cucumber/filters/apply_around_hooks'
7
+ require 'cucumber/filters/broadcast_test_run_starting_event'
7
8
  require 'cucumber/filters/prepare_world'
8
9
  require 'cucumber/filters/quit'
9
10
  require 'cucumber/filters/randomizer'
@@ -44,7 +44,7 @@ module Cucumber
44
44
 
45
45
  def result
46
46
  return NoStepMatch.new(test_step.source.last, test_step.name) unless matches.any?
47
- configuration.notify :step_match, test_step, match
47
+ configuration.notify :step_activated, test_step, match
48
48
  return SkippingStepMatch.new if configuration.dry_run?
49
49
  match
50
50
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module Cucumber
3
+ module Filters
4
+ # Added at the end of the filter chain to broadcast a list of
5
+ # all of the test cases that have made it through the filters.
6
+ class BroadcastTestRunStartingEvent < Core::Filter.new(:config)
7
+ def initialize(config, receiver=nil)
8
+ super
9
+ @test_cases = []
10
+ end
11
+
12
+ def test_case(test_case)
13
+ @test_cases << test_case
14
+ self
15
+ end
16
+
17
+ def done
18
+ config.notify :test_run_starting, @test_cases
19
+ @test_cases.map do |test_case|
20
+ test_case.describe_to(@receiver)
21
+ end
22
+ super
23
+ self
24
+ end
25
+ end
26
+ end
27
+ end
@@ -12,7 +12,7 @@ module Cucumber
12
12
  next unless retry_required?(test_case, event)
13
13
 
14
14
  test_case_counts[test_case] += 1
15
- event.test_case.describe_to(receiver)
15
+ test_case.describe_to(receiver)
16
16
  end
17
17
 
18
18
  super
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require "cucumber/filters/gated_receiver"
3
- require "cucumber/filters/tag_limits/test_case_index"
4
- require "cucumber/filters/tag_limits/verifier"
2
+ require 'cucumber/filters/gated_receiver'
3
+ require 'cucumber/filters/tag_limits/test_case_index'
4
+ require 'cucumber/filters/tag_limits/verifier'
5
5
 
6
6
  module Cucumber
7
7
  module Filters
@@ -28,7 +28,7 @@ module Cucumber
28
28
  attr_reader :tag_limits
29
29
 
30
30
  class Breach
31
- INDENT = (" " * 2).freeze
31
+ INDENT = (' ' * 2).freeze
32
32
 
33
33
  def initialize(tag_name, limit, locations)
34
34
  @tag_name = tag_name
@@ -9,7 +9,7 @@ if Cucumber::WINDOWS_MRI
9
9
  end
10
10
  end
11
11
 
12
- Cucumber::Term::ANSIColor.coloring = false if !STDOUT.tty? && !ENV.has_key?("AUTOTEST")
12
+ Cucumber::Term::ANSIColor.coloring = false if !STDOUT.tty? && !ENV.key?('AUTOTEST')
13
13
 
14
14
  module Cucumber
15
15
  module Formatter
@@ -60,6 +60,7 @@ module Cucumber
60
60
  end.merge({
61
61
  'undefined' => 'yellow',
62
62
  'pending' => 'yellow',
63
+ 'flaky' => 'yellow',
63
64
  'failed' => 'red',
64
65
  'passed' => 'green',
65
66
  'outline' => 'cyan',
@@ -105,7 +106,7 @@ module Cucumber
105
106
  begin
106
107
  gem 'genki-ruby-terminfo'
107
108
  require 'terminfo'
108
- case TermInfo.default_object.tigetnum("colors")
109
+ case TermInfo.default_object.tigetnum('colors')
109
110
  when 0
110
111
  raise "Your terminal doesn't support colours."
111
112
  when 1
@@ -118,9 +119,9 @@ module Cucumber
118
119
  end
119
120
  rescue Exception => e
120
121
  if e.class.name == 'TermInfo::TermInfoError'
121
- STDERR.puts "*** WARNING ***"
122
+ STDERR.puts '*** WARNING ***'
122
123
  STDERR.puts "You have the genki-ruby-terminfo gem installed, but you haven't set your TERM variable."
123
- STDERR.puts "Try setting it to TERM=xterm-256color to get grey colour in output."
124
+ STDERR.puts 'Try setting it to TERM=xterm-256color to get grey colour in output.'
124
125
  STDERR.puts "\n"
125
126
  alias grey white
126
127
  else
@@ -130,19 +131,15 @@ module Cucumber
130
131
  end
131
132
 
132
133
  def self.define_real_grey #:nodoc:
133
- def grey(string) #:nodoc:
134
- if ::Cucumber::Term::ANSIColor.coloring?
135
- "\e[90m#{string}\e[0m"
136
- else
137
- string
138
- end
134
+ define_method :grey do |string|
135
+ ::Cucumber::Term::ANSIColor.coloring? ? "\e[90m#{string}\e[0m" : string
139
136
  end
140
137
  end
141
138
 
142
139
  define_grey
143
140
 
144
141
  def cukes(n)
145
- ("(::) " * n).strip
142
+ ('(::) ' * n).strip
146
143
  end
147
144
 
148
145
  def green_cukes(n)