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
@@ -23,7 +23,7 @@ module Cucumber
23
23
  # ExampleTableRow#keyword is never called on them,
24
24
  # but this will pass silently if it happens anyway
25
25
  class NullLanguage
26
- def method_missing(*args, &block)
26
+ def method_missing(*_args, &_block)
27
27
  self
28
28
  end
29
29
 
@@ -80,17 +80,15 @@ module Cucumber
80
80
  end
81
81
 
82
82
  def send_output_to(formatter)
83
- unless @already_accepted
84
- @messages.each { |message| formatter.puts(message) }
85
- @embeddings.each { |embedding| embedding.send_to_formatter(formatter) }
86
- end
83
+ return if @already_accepted
84
+ @messages.each { |message| formatter.puts(message) }
85
+ @embeddings.each { |embedding| embedding.send_to_formatter(formatter) }
87
86
  end
88
87
 
89
88
  def describe_exception_to(formatter)
90
- unless @already_accepted
91
- @result.describe_exception_to(formatter)
92
- @already_accepted = true
93
- end
89
+ return if @already_accepted
90
+ @result.describe_exception_to(formatter)
91
+ @already_accepted = true
94
92
  end
95
93
  end
96
94
 
@@ -112,20 +110,20 @@ module Cucumber
112
110
  Ast::Comments.new(step.comments).accept(formatter)
113
111
  messages.each { |message| formatter.puts(message) }
114
112
  embeddings.each { |embedding| embedding.send_to_formatter(formatter) }
115
- formatter.before_step_result *step_result_attributes
113
+ formatter.before_step_result(*step_result_attributes)
116
114
  print_step_name(formatter)
117
115
  Ast::MultilineArg.for(multiline_arg).accept(formatter)
118
116
  print_exception(formatter)
119
- formatter.after_step_result *step_result_attributes
117
+ formatter.after_step_result(*step_result_attributes)
120
118
  formatter.after_step(self)
121
119
  end
122
120
 
123
121
  def step_result_attributes
124
122
  legacy_multiline_arg = if multiline_arg.kind_of?(Core::Ast::EmptyMultilineArgument)
125
- nil
126
- else
127
- step.multiline_arg
128
- end
123
+ nil
124
+ else
125
+ step.multiline_arg
126
+ end
129
127
  [keyword, step_match, legacy_multiline_arg, status, exception, source_indent, background, file_colon_line]
130
128
  end
131
129
 
@@ -280,7 +278,7 @@ module Cucumber
280
278
  end
281
279
 
282
280
  Scenario = Struct.new(:status, :name, :location) do
283
- def backtrace_line(step_name = "#{name}", line = self.location.line)
281
+ def backtrace_line(step_name = name.to_s, line = self.location.line)
284
282
  "#{location.on_line(line)}:in `#{step_name}'"
285
283
  end
286
284
 
@@ -294,7 +292,7 @@ module Cucumber
294
292
  end
295
293
 
296
294
  ScenarioOutline = Struct.new(:status, :name, :location) do
297
- def backtrace_line(step_name = "#{name}", line = self.location.line)
295
+ def backtrace_line(step_name = name.to_s, line = self.location.line)
298
296
  "#{location.on_line(line)}:in `#{step_name}'"
299
297
  end
300
298
 
@@ -379,9 +377,7 @@ module Cucumber
379
377
  @feature = feature
380
378
  end
381
379
 
382
- def feature
383
- @feature
384
- end
380
+ attr_reader :feature
385
381
  end
386
382
 
387
383
  end
@@ -13,19 +13,17 @@ module Cucumber
13
13
  def step_visited(step) #:nodoc:
14
14
  step_id = step.object_id
15
15
 
16
- unless @inserted_steps.has_key?(step_id)
17
- @inserted_steps[step_id] = step
18
- steps.push(step)
19
- end
16
+ return if @inserted_steps.key?(step_id)
17
+ @inserted_steps[step_id] = step
18
+ steps.push(step)
20
19
  end
21
20
 
22
21
  def scenario_visited(scenario) #:nodoc:
23
22
  scenario_id = scenario.object_id
24
23
 
25
- unless @inserted_scenarios.has_key?(scenario_id)
26
- @inserted_scenarios[scenario_id] = scenario
27
- scenarios.push(scenario)
28
- end
24
+ return if @inserted_scenarios.key?(scenario_id)
25
+ @inserted_scenarios[scenario_id] = scenario
26
+ scenarios.push(scenario)
29
27
  end
30
28
 
31
29
  def steps(status = nil) #:nodoc:
@@ -36,7 +36,7 @@ module Cucumber
36
36
  @issues = ConsoleIssues.new(runtime.configuration)
37
37
  end
38
38
 
39
- def before_features(features)
39
+ def before_features(_features)
40
40
  print_profile_information
41
41
  end
42
42
 
@@ -44,7 +44,7 @@ module Cucumber
44
44
  print_summary(features)
45
45
  end
46
46
 
47
- def before_feature(feature)
47
+ def before_feature(_feature)
48
48
  @exceptions = []
49
49
  @indent = 0
50
50
  end
@@ -54,7 +54,7 @@ module Cucumber
54
54
  @io.flush
55
55
  end
56
56
 
57
- def after_tags(tags)
57
+ def after_tags(_tags)
58
58
  if @indent == 1
59
59
  @io.puts
60
60
  @io.flush
@@ -74,24 +74,24 @@ module Cucumber
74
74
  @io.flush
75
75
  end
76
76
 
77
- def before_feature_element(feature_element)
77
+ def before_feature_element(_feature_element)
78
78
  @indent = 2
79
79
  @scenario_indent = 2
80
80
  end
81
81
 
82
- def after_feature_element(feature_element)
82
+ def after_feature_element(_feature_element)
83
83
  print_messages
84
84
  @io.puts
85
85
  @io.flush
86
86
  end
87
87
 
88
- def before_background(background)
88
+ def before_background(_background)
89
89
  @indent = 2
90
90
  @scenario_indent = 2
91
91
  @in_background = true
92
92
  end
93
93
 
94
- def after_background(background)
94
+ def after_background(_background)
95
95
  print_messages
96
96
  @in_background = nil
97
97
  @io.puts
@@ -102,7 +102,7 @@ module Cucumber
102
102
  print_feature_element_name(keyword, name, file_colon_line, source_indent)
103
103
  end
104
104
 
105
- def before_examples_array(examples_array)
105
+ def before_examples_array(_examples_array)
106
106
  @indent = 4
107
107
  @io.puts
108
108
  @visiting_first_example_name = true
@@ -121,7 +121,7 @@ module Cucumber
121
121
  @table = outline_table
122
122
  end
123
123
 
124
- def after_outline_table(outline_table)
124
+ def after_outline_table(_outline_table)
125
125
  @table = nil
126
126
  @indent = 4
127
127
  end
@@ -136,7 +136,7 @@ module Cucumber
136
136
  print_messages
137
137
  end
138
138
 
139
- def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
139
+ def before_step_result(_keyword, _step_match, _multiline_arg, status, exception, _source_indent, background, _file_colon_line)
140
140
  @hide_this_step = false
141
141
  if exception
142
142
  if @exceptions.include?(exception)
@@ -152,7 +152,7 @@ module Cucumber
152
152
  @status = status
153
153
  end
154
154
 
155
- def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
155
+ def step_name(keyword, step_match, status, source_indent, _background, _file_colon_line)
156
156
  return if @hide_this_step
157
157
  source_indent = nil unless @options[:source]
158
158
  name_to_report = format_step(keyword, step_match, status, source_indent)
@@ -180,11 +180,11 @@ module Cucumber
180
180
  @table = multiline_arg
181
181
  end
182
182
 
183
- def after_multiline_arg(multiline_arg)
183
+ def after_multiline_arg(_multiline_arg)
184
184
  @table = nil
185
185
  end
186
186
 
187
- def before_table_row(table_row)
187
+ def before_table_row(_table_row)
188
188
  return if !@table || @hide_this_step
189
189
  @col_index = 0
190
190
  @io.print ' |'.indent(@indent-2)
@@ -199,7 +199,7 @@ module Cucumber
199
199
  end
200
200
  end
201
201
 
202
- def after_table_cell(cell)
202
+ def after_table_cell(_cell)
203
203
  return unless @table
204
204
  @col_index += 1
205
205
  end
@@ -211,11 +211,11 @@ module Cucumber
211
211
  cell_text = escape_cell(value.to_s || '')
212
212
  padded = cell_text + (' ' * (width - cell_text.unpack('U*').length))
213
213
  prefix = cell_prefix(status)
214
- @io.print(' ' + format_string("#{prefix}#{padded}", status) + ::Cucumber::Term::ANSIColor.reset(" |"))
214
+ @io.print(' ' + format_string("#{prefix}#{padded}", status) + ::Cucumber::Term::ANSIColor.reset(' |'))
215
215
  @io.flush
216
216
  end
217
217
 
218
- def before_test_case(test_case)
218
+ def before_test_case(_test_case)
219
219
  @previous_step_keyword = nil
220
220
  end
221
221
 
@@ -235,7 +235,7 @@ module Cucumber
235
235
  @io.print(format_string(line_comment, :comment))
236
236
  end
237
237
  @io.puts
238
- names[1..-1].each {|s| @io.puts "#{s}"}
238
+ names[1..-1].each {|s| @io.puts s.to_s}
239
239
  @io.flush
240
240
  end
241
241
 
@@ -30,14 +30,14 @@ module Cucumber
30
30
  @passed_test_cases = []
31
31
  @counts = ConsoleCounts.new(config)
32
32
  @issues = ConsoleIssues.new(config)
33
- config.on_event :step_match, &method(:on_step_match)
33
+ config.on_event :step_activated, &method(:on_step_activated)
34
34
  config.on_event :test_case_starting, &method(:on_test_case_starting)
35
35
  config.on_event :test_step_finished, &method(:on_test_step_finished)
36
36
  config.on_event :test_case_finished, &method(:on_test_case_finished)
37
37
  config.on_event :test_run_finished, &method(:on_test_run_finished)
38
38
  end
39
39
 
40
- def on_step_match(event)
40
+ def on_step_activated(event)
41
41
  @matches[event.test_step.source] = event.step_match
42
42
  end
43
43
 
@@ -53,11 +53,11 @@ module Cucumber
53
53
  test_step = event.test_step
54
54
  result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
55
55
  progress(result.to_sym) if !HookQueryVisitor.new(test_step).hook? || result.failed?
56
- unless HookQueryVisitor.new(test_step).hook?
57
- collect_snippet_data(test_step, result)
58
- @pending_step_matches << @matches[test_step.source] if result.pending?
59
- @failed_results << result if result.failed?
60
- end
56
+
57
+ return if HookQueryVisitor.new(test_step).hook?
58
+ collect_snippet_data(test_step, result)
59
+ @pending_step_matches << @matches[test_step.source] if result.pending?
60
+ @failed_results << result if result.failed?
61
61
  end
62
62
 
63
63
  def on_test_case_finished(event)
@@ -84,12 +84,11 @@ module Cucumber
84
84
  snippet_text(step_keyword, step_name, multiline_arg)
85
85
  }
86
86
  do_print_snippets(snippet_text_proc) if config.snippets? && summary.test_steps.total(:undefined) > 0
87
- if config.wip?
88
- messages = @passed_test_cases.map do |test_case|
89
- message = linebreaks("#{test_case.location.on_line(test_case.location.line)}:in `#{test_case.name}'", ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)
90
- end
91
- do_print_passing_wip(messages)
87
+ return unless config.wip?
88
+ messages = @passed_test_cases.map do |test_case|
89
+ linebreaks("#{test_case.location.on_line(test_case.location.line)}:in `#{test_case.name}'", ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)
92
90
  end
91
+ do_print_passing_wip(messages)
93
92
  end
94
93
 
95
94
  CHARS = {
@@ -18,7 +18,7 @@ module Cucumber
18
18
  end
19
19
  config.on_event :test_run_finished do
20
20
  next if @failures.empty?
21
- @io.print file_failures.join(' ')
21
+ @io.print file_failures.join('\n')
22
22
  end
23
23
  end
24
24
 
@@ -10,7 +10,7 @@ module Cucumber
10
10
  @step_definition_files = collect_steps(runtime)
11
11
  end
12
12
 
13
- def after_features(features)
13
+ def after_features(_features)
14
14
  print_summary
15
15
  end
16
16
 
@@ -15,7 +15,7 @@ if Cucumber::WINDOWS
15
15
  Cucumber::CODEPAGE = "cp#{$1.to_i}"
16
16
  end
17
17
  else
18
- Cucumber::CODEPAGE = "cp1252"
18
+ Cucumber::CODEPAGE = 'cp1252'
19
19
  STDERR.puts("WARNING: Couldn't detect your output codepage. Assuming it is 1252. You may have to chcp 1252 or SET CUCUMBER_OUTPUT_ENCODING=cp1252.")
20
20
  end
21
21
 
@@ -15,7 +15,7 @@ module Cucumber
15
15
  @stepdef_to_match = Hash.new { |h, stepdef_key| h[stepdef_key] = [] }
16
16
  @total_duration = 0
17
17
  @matches = {}
18
- config.on_event :step_match do |event|
18
+ config.on_event :step_activated do |event|
19
19
  test_step, step_match = *event.attributes
20
20
  @matches[test_step.source] = step_match
21
21
  end
@@ -23,7 +23,7 @@ module Cucumber
23
23
  end
24
24
 
25
25
  def on_step_definition_registered(event)
26
- stepdef_key = StepDefKey.new(event.step_definition.regexp_source, event.step_definition.location)
26
+ stepdef_key = StepDefKey.new(event.step_definition.expression.to_s, event.step_definition.location)
27
27
  @stepdef_to_match[stepdef_key] = []
28
28
  end
29
29
 
@@ -39,7 +39,7 @@ module Cucumber
39
39
  result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
40
40
  step_match = @matches[test_step.source]
41
41
  step_definition = step_match.step_definition
42
- stepdef_key = StepDefKey.new(step_definition.regexp_source, step_definition.location)
42
+ stepdef_key = StepDefKey.new(step_definition.expression.to_s, step_definition.location)
43
43
  unless @stepdef_to_match[stepdef_key].map { |key| key[:location] }.include? test_step.location
44
44
  duration = DurationExtractor.new(result).result_duration
45
45
 
@@ -59,11 +59,11 @@ module Cucumber
59
59
  def print_summary
60
60
  aggregate_info
61
61
 
62
- if config.dry_run?
63
- keys = @stepdef_to_match.keys.sort {|a,b| a.regexp_source <=> b.regexp_source}
64
- else
65
- keys = @stepdef_to_match.keys.sort {|a,b| a.mean_duration <=> b.mean_duration}.reverse
66
- end
62
+ keys = if config.dry_run?
63
+ @stepdef_to_match.keys.sort {|a,b| a.regexp_source <=> b.regexp_source}
64
+ else
65
+ @stepdef_to_match.keys.sort {|a,b| a.mean_duration <=> b.mean_duration}.reverse
66
+ end
67
67
 
68
68
  keys.each do |stepdef_key|
69
69
  print_step_definition(stepdef_key)
@@ -71,7 +71,7 @@ module Cucumber
71
71
  if @stepdef_to_match[stepdef_key].any?
72
72
  print_steps(stepdef_key)
73
73
  else
74
- @io.puts(" " + format_string("NOT MATCHED BY ANY STEPS", :failed))
74
+ @io.puts(' ' + format_string('NOT MATCHED BY ANY STEPS', :failed))
75
75
  end
76
76
  end
77
77
  @io.puts
@@ -79,7 +79,7 @@ module Cucumber
79
79
  end
80
80
 
81
81
  def print_step_definition(stepdef_key)
82
- @io.print format_string(sprintf("%.7f", stepdef_key.mean_duration), :skipped) + " " unless config.dry_run?
82
+ @io.print format_string(format('%.7f', stepdef_key.mean_duration), :skipped) + ' ' unless config.dry_run?
83
83
  @io.print format_string(stepdef_key.regexp_source, stepdef_key.status)
84
84
  if config.source?
85
85
  indent = max_length - stepdef_key.regexp_source.unpack('U*').length
@@ -91,8 +91,8 @@ module Cucumber
91
91
 
92
92
  def print_steps(stepdef_key)
93
93
  @stepdef_to_match[stepdef_key].each do |step|
94
- @io.print " "
95
- @io.print format_string(sprintf("%.7f", step[:duration]), :skipped) + " " unless config.dry_run?
94
+ @io.print ' '
95
+ @io.print format_string(format('%.7f', step[:duration]), :skipped) + ' ' unless config.dry_run?
96
96
  @io.print format_step(step[:keyword], step[:step_match], step[:status], nil)
97
97
  if config.source?
98
98
  indent = max_length - (step[:keyword].unpack('U*').length + step[:step_match].format_args.unpack('U*').length)
@@ -84,7 +84,7 @@ module Gherkin
84
84
  ALIASES["#{key}_arg"].split(',').map{|color| COLORS[color]}.join('')
85
85
  end
86
86
  end
87
-
87
+
88
88
  def reset
89
89
  "\e[0m"
90
90
  end
@@ -10,7 +10,7 @@ module Gherkin
10
10
  #
11
11
  # This is used in the pretty formatter.
12
12
  def escape_cell(s)
13
- s.gsub(/\\(?!\|)/, "\\\\\\\\").gsub(/\n/, "\\n").gsub(/\|/, "\\|")
13
+ s.gsub(/\\(?!\|)/, '\\\\\\\\').gsub(/\n/, '\\n').gsub(/\|/, '\\|')
14
14
  end
15
15
  end
16
16
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
+ require 'cucumber/cucumber_expressions/parameter_type'
3
+ require 'cucumber/deprecate'
4
+
2
5
  module Cucumber
3
- module RbSupport
4
- # This module defines the methods you can use to define pure Ruby
5
- # Step Definitions and Hooks. This module is mixed into the toplevel
6
- # object.
7
- module RbDsl
6
+ module Glue
7
+ # This module provides the methods the DSL you can use to define
8
+ # steps, hooks, transforms etc.
9
+ module Dsl
8
10
  class << self
9
11
  attr_writer :rb_language
10
12
 
@@ -20,8 +22,8 @@ module Cucumber
20
22
  @rb_language.register_rb_hook(phase, tag_names, proc)
21
23
  end
22
24
 
23
- def register_rb_transform(regexp, proc)
24
- @rb_language.register_rb_transform(regexp, proc)
25
+ def define_parameter_type(parameter_type)
26
+ @rb_language.define_parameter_type(parameter_type)
25
27
  end
26
28
 
27
29
  def register_rb_step_definition(regexp, proc_or_sym, options = {})
@@ -54,19 +56,19 @@ module Cucumber
54
56
  # World(my_module: MyModule)
55
57
  #
56
58
  def World(*world_modules, **namespaced_world_modules, &proc)
57
- RbDsl.build_rb_world_factory(world_modules, namespaced_world_modules, proc)
59
+ Dsl.build_rb_world_factory(world_modules, namespaced_world_modules, proc)
58
60
  end
59
61
 
60
62
  # Registers a proc that will run before each Scenario. You can register as many
61
63
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
62
64
  def Before(*tag_expressions, &proc)
63
- RbDsl.register_rb_hook('before', tag_expressions, proc)
65
+ Dsl.register_rb_hook('before', tag_expressions, proc)
64
66
  end
65
67
 
66
68
  # Registers a proc that will run after each Scenario. You can register as many
67
69
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
68
70
  def After(*tag_expressions, &proc)
69
- RbDsl.register_rb_hook('after', tag_expressions, proc)
71
+ Dsl.register_rb_hook('after', tag_expressions, proc)
70
72
  end
71
73
 
72
74
  # Registers a proc that will be wrapped around each scenario. The proc
@@ -75,13 +77,13 @@ module Cucumber
75
77
  # blocks in 1.8), on which it should call the .call method. You can register
76
78
  # as many as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
77
79
  def Around(*tag_expressions, &proc)
78
- RbDsl.register_rb_hook('around', tag_expressions, proc)
80
+ Dsl.register_rb_hook('around', tag_expressions, proc)
79
81
  end
80
82
 
81
83
  # Registers a proc that will run after each Step. You can register as
82
84
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
83
85
  def AfterStep(*tag_expressions, &proc)
84
- RbDsl.register_rb_hook('after_step', tag_expressions, proc)
86
+ Dsl.register_rb_hook('after_step', tag_expressions, proc)
85
87
  end
86
88
 
87
89
  # Registers a proc that will be called with a step definition argument if it
@@ -90,14 +92,38 @@ module Cucumber
90
92
  # provided proc. The return value of the proc is consequently yielded to the
91
93
  # step definition.
92
94
  def Transform(regexp, &proc)
93
- RbDsl.register_rb_transform(regexp, proc)
95
+ Cucumber.deprecate(
96
+ 'Use ParameterType(...) instead',
97
+ 'Transform',
98
+ '2.6.0'
99
+ )
100
+ parameter_type = CucumberExpressions::ParameterType.new(
101
+ regexp.to_s,
102
+ regexp,
103
+ Object,
104
+ proc,
105
+ false,
106
+ true
107
+ )
108
+ Dsl.define_parameter_type(parameter_type)
109
+ end
110
+
111
+ def ParameterType(options)
112
+ parameter_type = CucumberExpressions::ParameterType.new(
113
+ options[:name],
114
+ options[:regexp],
115
+ options[:type],
116
+ options[:transformer],
117
+ options[:use_for_snippets],
118
+ options[:prefer_for_regexp_match]
119
+ )
120
+ Dsl.define_parameter_type(parameter_type)
94
121
  end
95
122
 
96
123
  # Registers a proc that will run after Cucumber is configured. You can register as
97
124
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
98
- # TODO: Deprecate this
99
125
  def AfterConfiguration(&proc)
100
- RbDsl.register_rb_hook('after_configuration', [], proc)
126
+ Dsl.register_rb_hook('after_configuration', [], proc)
101
127
  end
102
128
 
103
129
  # Registers a new Ruby StepDefinition. This method is aliased
@@ -117,10 +143,11 @@ module Cucumber
117
143
  # the context of the <tt>World</tt> object.
118
144
  def register_rb_step_definition(regexp, symbol = nil, options = {}, &proc)
119
145
  proc_or_sym = symbol || proc
120
- RbDsl.register_rb_step_definition(regexp, proc_or_sym, options)
146
+ Dsl.register_rb_step_definition(regexp, proc_or_sym, options)
121
147
  end
122
148
  end
123
149
  end
124
150
  end
125
151
 
126
- extend(Cucumber::RbSupport::RbDsl)
152
+ # TODO: can we avoid adding methods to the global namespace (Kernel)
153
+ extend(Cucumber::Glue::Dsl)