cucumber 2.99.0 → 3.0.0

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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/.cucumberproignore +6 -0
  3. data/.gitattributes +32 -0
  4. data/.github/ISSUE_TEMPLATE.md +1 -1
  5. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  6. data/.rubocop.yml +13 -0
  7. data/.rubocop_todo.yml +991 -0
  8. data/.travis.yml +56 -10
  9. data/{History.md → CHANGELOG.md} +166 -32
  10. data/CONTRIBUTING.md +21 -1
  11. data/Gemfile +18 -5
  12. data/README.md +13 -4
  13. data/Rakefile +12 -2
  14. data/appveyor.yml +27 -0
  15. data/bin/cucumber +2 -1
  16. data/cucumber.gemspec +15 -10
  17. data/cucumber.yml +10 -11
  18. data/examples/i18n/Rakefile +1 -1
  19. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +8 -3
  20. data/examples/i18n/ar/lib/calculator.rb +2 -2
  21. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
  22. data/examples/i18n/bg/features/support/env.rb +6 -1
  23. data/examples/i18n/bg/lib/calculator.rb +2 -1
  24. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +10 -5
  25. data/examples/i18n/ca/lib/calculadora.rb +2 -2
  26. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +10 -5
  27. data/examples/i18n/cs/lib/calculator.rb +3 -3
  28. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +10 -5
  29. data/examples/i18n/da/lib/lommeregner.rb +2 -2
  30. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +10 -5
  31. data/examples/i18n/de/lib/calculator.rb +2 -2
  32. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +10 -5
  33. data/examples/i18n/el/lib/calculator.rb +2 -2
  34. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +9 -4
  35. data/examples/i18n/en/lib/calculator.rb +2 -2
  36. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
  37. data/examples/i18n/en-lol/features/support/env.rb +6 -2
  38. data/examples/i18n/en-lol/lib/basket.rb +2 -2
  39. data/examples/i18n/en-lol/lib/belly.rb +2 -2
  40. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +9 -4
  41. data/examples/i18n/eo/lib/calculator.rb +2 -2
  42. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +10 -5
  43. data/examples/i18n/es/lib/calculador.rb +2 -2
  44. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +10 -5
  45. data/examples/i18n/et/lib/kalkulaator.rb +3 -3
  46. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +9 -4
  47. data/examples/i18n/fi/lib/laskin.rb +1 -1
  48. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
  49. data/examples/i18n/fr/features/support/env.rb +7 -2
  50. data/examples/i18n/fr/lib/calculatrice.rb +2 -2
  51. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +10 -5
  52. data/examples/i18n/he/lib/calculator.rb +1 -1
  53. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +9 -4
  54. data/examples/i18n/hi/lib/calculator.rb +1 -1
  55. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +9 -5
  56. data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
  57. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +10 -5
  58. data/examples/i18n/hu/lib/calculator.rb +1 -1
  59. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +10 -5
  60. data/examples/i18n/id/lib/calculator.rb +2 -2
  61. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +10 -5
  62. data/examples/i18n/it/lib/calcolatrice.rb +3 -3
  63. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
  64. data/examples/i18n/ja/features/support/env.rb +7 -2
  65. data/examples/i18n/ja/lib/calculator.rb +2 -2
  66. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +10 -5
  67. data/examples/i18n/ko/lib/calculator.rb +2 -2
  68. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +10 -5
  69. data/examples/i18n/lt/lib/calculator.rb +2 -2
  70. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +10 -5
  71. data/examples/i18n/lv/lib/calculator.rb +2 -2
  72. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
  73. data/examples/i18n/no/features/support/env.rb +7 -2
  74. data/examples/i18n/no/lib/kalkulator.rb +2 -2
  75. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +10 -5
  76. data/examples/i18n/pl/features/support/env.rb +6 -1
  77. data/examples/i18n/pl/lib/calculator.rb +2 -2
  78. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
  79. data/examples/i18n/pt/features/support/env.rb +7 -2
  80. data/examples/i18n/pt/lib/calculadora.rb +1 -1
  81. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +11 -6
  82. data/examples/i18n/ro/lib/calculator.rb +1 -1
  83. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
  84. data/examples/i18n/ru/features/support/env.rb +6 -1
  85. data/examples/i18n/ru/lib/calculator.rb +2 -1
  86. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +10 -5
  87. data/examples/i18n/sk/lib/calculator.rb +2 -2
  88. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
  89. data/examples/i18n/sr-Cyrl/features/support/env.rb +7 -2
  90. data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
  91. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +10 -5
  92. data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
  93. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +9 -4
  94. data/examples/i18n/sv/lib/kalkulator.rb +2 -2
  95. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +10 -5
  96. data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
  97. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
  98. data/examples/i18n/uk/features/support/env.rb +6 -1
  99. data/examples/i18n/uk/lib/calculator.rb +2 -1
  100. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
  101. data/examples/i18n/uz/features/support/env.rb +6 -1
  102. data/examples/i18n/uz/lib/calculator.rb +2 -1
  103. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +11 -6
  104. data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
  105. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +10 -5
  106. data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
  107. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
  108. data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
  109. data/examples/sinatra/features/support/env.rb +6 -1
  110. data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
  111. data/examples/tcl/features/support/env.rb +2 -1
  112. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
  113. data/examples/watir/features/step_definitions/search_steps.rb +6 -5
  114. data/examples/watir/features/support/env.rb +5 -1
  115. data/examples/watir/features/support/screenshots.rb +5 -5
  116. data/features/docs/api/list_step_defs_as_json.feature +21 -7
  117. data/features/docs/api/listen_for_events.feature +9 -8
  118. data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
  119. data/features/docs/cli/dry_run.feature +3 -0
  120. data/features/docs/cli/execute_with_tag_filter.feature +8 -6
  121. data/features/docs/cli/fail_fast.feature +2 -0
  122. data/features/docs/cli/help.feature +8 -0
  123. data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
  124. data/features/docs/cli/randomize.feature +2 -2
  125. data/features/docs/cli/retry_failing_tests.feature +75 -15
  126. data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
  127. data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
  128. data/features/docs/cli/strict_mode.feature +6 -0
  129. data/features/docs/defining_steps/ambiguous_steps.feature +89 -0
  130. data/features/docs/defining_steps/nested_steps.feature +5 -1
  131. data/features/docs/defining_steps/nested_steps_i18n.feature +3 -0
  132. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
  133. data/features/docs/defining_steps/printing_messages.feature +1 -2
  134. data/features/docs/defining_steps/skip_scenario.feature +1 -34
  135. data/features/docs/defining_steps/snippets.feature +18 -18
  136. data/features/docs/events/gherkin_source_read_event.feature +43 -0
  137. data/features/docs/events/step_activated_event.feature +36 -0
  138. data/features/docs/events/step_definition_registered_event.feature +29 -0
  139. data/features/docs/events/test_case_finished_event.feature +35 -0
  140. data/features/docs/events/test_case_started_event.feature +54 -0
  141. data/features/docs/events/test_run_finished_event.feature +40 -0
  142. data/features/docs/events/test_run_started_event.feature +41 -0
  143. data/features/docs/events/test_step_finished_event.feature +47 -0
  144. data/features/docs/events/test_step_started_event.feature +43 -0
  145. data/features/docs/exception_in_after_hook.feature +3 -2
  146. data/features/docs/exception_in_after_step_hook.feature +2 -0
  147. data/features/docs/exception_in_around_hook.feature +2 -0
  148. data/features/docs/exception_in_before_hook.feature +3 -1
  149. data/features/docs/extending_cucumber/custom_formatter.feature +12 -48
  150. data/features/docs/formatters/json_formatter.feature +4 -4
  151. data/features/docs/formatters/junit_formatter.feature +7 -6
  152. data/features/docs/formatters/pretty_formatter.feature +1 -0
  153. data/features/docs/formatters/progress_formatter.feature +1 -0
  154. data/features/docs/formatters/rerun_formatter.feature +2 -0
  155. data/features/docs/formatters/summary_formatter.feature +35 -0
  156. data/features/docs/formatters/usage_formatter.feature +3 -0
  157. data/features/docs/getting_started.feature +2 -1
  158. data/features/docs/gherkin/background.feature +5 -5
  159. data/features/docs/gherkin/doc_strings.feature +2 -0
  160. data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
  161. data/features/docs/gherkin/outlines.feature +6 -4
  162. data/features/docs/gherkin/unicode_table.feature +2 -1
  163. data/features/docs/gherkin/using_descriptions.feature +1 -0
  164. data/features/docs/gherkin/using_star_notation.feature +1 -1
  165. data/features/docs/post_configuration_hook.feature +1 -17
  166. data/features/docs/rake_task.feature +5 -0
  167. data/features/docs/raketask.feature +3 -1
  168. data/features/docs/work_in_progress.feature +5 -2
  169. data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
  170. data/features/docs/writing_support_code/around_hooks.feature +6 -0
  171. data/features/docs/writing_support_code/before_hook.feature +1 -0
  172. data/features/docs/writing_support_code/hook_order.feature +3 -1
  173. data/features/docs/writing_support_code/parameter_types.feature +53 -0
  174. data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
  175. data/features/docs/writing_support_code/world.feature +129 -0
  176. data/features/lib/step_definitions/aruba_steps.rb +5 -10
  177. data/features/lib/step_definitions/cli_steps.rb +4 -0
  178. data/features/lib/step_definitions/cucumber_steps.rb +9 -12
  179. data/features/lib/step_definitions/iso-8859-1_steps.rb +9 -5
  180. data/features/lib/step_definitions/json_steps.rb +2 -1
  181. data/features/lib/step_definitions/junit_steps.rb +2 -1
  182. data/features/lib/step_definitions/language_steps.rb +3 -2
  183. data/features/lib/step_definitions/profile_steps.rb +7 -6
  184. data/features/lib/step_definitions/retry_steps.rb +33 -13
  185. data/features/lib/step_definitions/ruby_steps.rb +2 -1
  186. data/features/lib/support/env.rb +3 -2
  187. data/features/lib/support/fake_wire_server.rb +17 -3
  188. data/features/lib/support/feature_factory.rb +2 -1
  189. data/features/lib/support/normalise_output.rb +14 -12
  190. data/features/lib/support/parameter_types.rb +5 -0
  191. data/gem_tasks/contributors.rake +10 -6
  192. data/gem_tasks/cov.rake +1 -0
  193. data/gem_tasks/downloads.rb +1 -0
  194. data/gem_tasks/environment.rake +2 -5
  195. data/gem_tasks/examples.rake +3 -2
  196. data/gem_tasks/fix_cr_lf.rake +19 -7
  197. data/gem_tasks/flog.rake +4 -3
  198. data/gem_tasks/rspec.rake +2 -1
  199. data/gem_tasks/sass.rake +2 -1
  200. data/lib/autotest/cucumber.rb +1 -0
  201. data/lib/autotest/cucumber_mixin.rb +17 -16
  202. data/lib/autotest/cucumber_rails.rb +1 -0
  203. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  204. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  205. data/lib/autotest/cucumber_rspec.rb +1 -0
  206. data/lib/autotest/cucumber_rspec2.rb +1 -0
  207. data/lib/autotest/discover.rb +3 -2
  208. data/lib/cucumber/cli/configuration.rb +12 -21
  209. data/lib/cucumber/cli/main.rb +8 -7
  210. data/lib/cucumber/cli/options.rb +341 -217
  211. data/lib/cucumber/cli/profile_loader.rb +26 -21
  212. data/lib/cucumber/cli/rerun_file.rb +1 -0
  213. data/lib/cucumber/configuration.rb +54 -37
  214. data/lib/cucumber/constantize.rb +2 -1
  215. data/lib/cucumber/core_ext/string.rb +2 -1
  216. data/lib/cucumber/deprecate.rb +4 -3
  217. data/lib/cucumber/encoding.rb +1 -0
  218. data/lib/cucumber/errors.rb +3 -1
  219. data/lib/cucumber/events/gherkin_source_read.rb +17 -0
  220. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +5 -2
  221. data/lib/cucumber/events/step_definition_registered.rb +24 -0
  222. data/lib/cucumber/events/test_case_finished.rb +18 -0
  223. data/lib/cucumber/events/test_case_started.rb +15 -0
  224. data/lib/cucumber/events/test_run_finished.rb +12 -0
  225. data/lib/cucumber/events/test_run_started.rb +16 -0
  226. data/lib/cucumber/events/test_step_finished.rb +20 -0
  227. data/lib/cucumber/events/test_step_started.rb +17 -0
  228. data/lib/cucumber/events.rb +23 -3
  229. data/lib/cucumber/file_specs.rb +1 -0
  230. data/lib/cucumber/filters/activate_steps.rb +8 -3
  231. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  232. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  233. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  234. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  235. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +27 -0
  236. data/lib/cucumber/filters/gated_receiver.rb +1 -0
  237. data/lib/cucumber/filters/prepare_world.rb +1 -0
  238. data/lib/cucumber/filters/quit.rb +1 -0
  239. data/lib/cucumber/filters/randomizer.rb +1 -0
  240. data/lib/cucumber/filters/retry.rb +4 -4
  241. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -0
  242. data/lib/cucumber/filters/tag_limits/verifier.rb +2 -1
  243. data/lib/cucumber/filters/tag_limits.rb +4 -3
  244. data/lib/cucumber/filters.rb +3 -0
  245. data/lib/cucumber/formatter/ansicolor.rb +9 -11
  246. data/lib/cucumber/formatter/backtrace_filter.rb +21 -8
  247. data/lib/cucumber/formatter/console.rb +72 -66
  248. data/lib/cucumber/formatter/console_counts.rb +44 -0
  249. data/lib/cucumber/formatter/console_issues.rb +58 -0
  250. data/lib/cucumber/formatter/duration.rb +2 -1
  251. data/lib/cucumber/formatter/duration_extractor.rb +1 -0
  252. data/lib/cucumber/formatter/fail_fast.rb +4 -2
  253. data/lib/cucumber/formatter/fanout.rb +1 -0
  254. data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
  255. data/lib/cucumber/formatter/html.rb +175 -249
  256. data/lib/cucumber/formatter/html_builder.rb +120 -0
  257. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -0
  258. data/lib/cucumber/formatter/inline-js.js +30 -0
  259. data/lib/cucumber/formatter/interceptor.rb +3 -2
  260. data/lib/cucumber/formatter/io.rb +2 -1
  261. data/lib/cucumber/formatter/json.rb +33 -30
  262. data/lib/cucumber/formatter/json_pretty.rb +1 -0
  263. data/lib/cucumber/formatter/junit.rb +26 -24
  264. data/lib/cucumber/formatter/legacy_api/adapter.rb +81 -69
  265. data/lib/cucumber/formatter/legacy_api/ast.rb +27 -22
  266. data/lib/cucumber/formatter/legacy_api/results.rb +7 -8
  267. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +1 -0
  268. data/lib/cucumber/formatter/pretty.rb +24 -18
  269. data/lib/cucumber/formatter/progress.rb +55 -13
  270. data/lib/cucumber/formatter/rerun.rb +15 -18
  271. data/lib/cucumber/formatter/stepdefs.rb +1 -0
  272. data/lib/cucumber/formatter/steps.rb +2 -1
  273. data/lib/cucumber/formatter/summary.rb +43 -20
  274. data/lib/cucumber/formatter/unicode.rb +2 -1
  275. data/lib/cucumber/formatter/usage.rb +33 -28
  276. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  277. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -1
  278. data/lib/cucumber/gherkin/formatter/escaping.rb +2 -1
  279. data/lib/cucumber/gherkin/i18n.rb +1 -0
  280. data/lib/cucumber/gherkin/steps_parser.rb +1 -0
  281. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +41 -30
  282. data/lib/cucumber/glue/hook.rb +43 -0
  283. data/lib/cucumber/glue/invoke_in_world.rb +70 -0
  284. data/lib/cucumber/glue/proto_world.rb +220 -0
  285. data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +60 -90
  286. data/lib/cucumber/{rb_support → glue}/snippet.rb +64 -26
  287. data/lib/cucumber/glue/step_definition.rb +143 -0
  288. data/lib/cucumber/glue/world_factory.rb +23 -0
  289. data/lib/cucumber/hooks.rb +9 -8
  290. data/lib/cucumber/load_path.rb +1 -0
  291. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
  292. data/lib/cucumber/multiline_argument/data_table.rb +47 -181
  293. data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
  294. data/lib/cucumber/multiline_argument.rb +6 -15
  295. data/lib/cucumber/platform.rb +4 -5
  296. data/lib/cucumber/project_initializer.rb +3 -2
  297. data/lib/cucumber/rake/task.rb +19 -14
  298. data/lib/cucumber/rspec/disable_option_parser.rb +2 -1
  299. data/lib/cucumber/rspec/doubles.rb +2 -1
  300. data/lib/cucumber/running_test_case.rb +3 -27
  301. data/lib/cucumber/runtime/after_hooks.rb +2 -1
  302. data/lib/cucumber/runtime/before_hooks.rb +1 -0
  303. data/lib/cucumber/runtime/for_programming_languages.rb +2 -36
  304. data/lib/cucumber/runtime/step_hooks.rb +1 -0
  305. data/lib/cucumber/runtime/support_code.rb +21 -16
  306. data/lib/cucumber/runtime/user_interface.rb +10 -16
  307. data/lib/cucumber/runtime.rb +49 -32
  308. data/lib/cucumber/step_argument.rb +1 -2
  309. data/lib/cucumber/step_definition_light.rb +2 -0
  310. data/lib/cucumber/step_definitions.rb +1 -0
  311. data/lib/cucumber/step_match.rb +30 -15
  312. data/lib/cucumber/step_match_search.rb +3 -3
  313. data/lib/cucumber/term/ansicolor.rb +2 -1
  314. data/lib/cucumber/unit.rb +1 -0
  315. data/lib/cucumber/version +1 -1
  316. data/lib/cucumber.rb +1 -13
  317. data/lib/simplecov_setup.rb +2 -1
  318. data/scripts/invite-collaborator +40 -0
  319. data/scripts/update-changelog +86 -0
  320. data/spec/cucumber/cli/configuration_spec.rb +109 -98
  321. data/spec/cucumber/cli/main_spec.rb +8 -7
  322. data/spec/cucumber/cli/options_spec.rb +114 -79
  323. data/spec/cucumber/cli/profile_loader_spec.rb +25 -5
  324. data/spec/cucumber/cli/rerun_spec.rb +21 -20
  325. data/spec/cucumber/configuration_spec.rb +48 -47
  326. data/spec/cucumber/constantize_spec.rb +3 -2
  327. data/spec/cucumber/events_spec.rb +9 -0
  328. data/spec/cucumber/file_specs_spec.rb +26 -25
  329. data/spec/cucumber/filters/activate_steps_spec.rb +25 -22
  330. data/spec/cucumber/filters/gated_receiver_spec.rb +7 -6
  331. data/spec/cucumber/filters/retry_spec.rb +42 -23
  332. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +12 -11
  333. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +15 -14
  334. data/spec/cucumber/filters/tag_limits_spec.rb +9 -8
  335. data/spec/cucumber/formatter/ansicolor_spec.rb +10 -9
  336. data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
  337. data/spec/cucumber/formatter/console_counts_spec.rb +14 -0
  338. data/spec/cucumber/formatter/duration_spec.rb +4 -3
  339. data/spec/cucumber/formatter/fail_fast_spec.rb +27 -27
  340. data/spec/cucumber/formatter/html_spec.rb +65 -60
  341. data/spec/cucumber/formatter/interceptor_spec.rb +1 -0
  342. data/spec/cucumber/formatter/json_spec.rb +71 -97
  343. data/spec/cucumber/formatter/junit_spec.rb +46 -47
  344. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +134 -141
  345. data/spec/cucumber/formatter/pretty_spec.rb +105 -117
  346. data/spec/cucumber/formatter/progress_spec.rb +22 -21
  347. data/spec/cucumber/formatter/rerun_spec.rb +70 -64
  348. data/spec/cucumber/formatter/spec_helper.rb +14 -12
  349. data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +22 -6
  350. data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
  351. data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +62 -25
  352. data/spec/cucumber/glue/step_definition_spec.rb +207 -0
  353. data/spec/cucumber/hooks_spec.rb +5 -4
  354. data/spec/cucumber/multiline_argument/data_table_spec.rb +179 -129
  355. data/spec/cucumber/project_initializer_spec.rb +12 -11
  356. data/spec/cucumber/rake/forked_spec.rb +22 -17
  357. data/spec/cucumber/rake/task_spec.rb +21 -20
  358. data/spec/cucumber/running_test_case_spec.rb +36 -35
  359. data/spec/cucumber/runtime/for_programming_languages_spec.rb +2 -30
  360. data/spec/cucumber/runtime/support_code_spec.rb +1 -0
  361. data/spec/cucumber/runtime_spec.rb +3 -2
  362. data/spec/cucumber/step_argument_spec.rb +6 -5
  363. data/spec/cucumber/step_match_search_spec.rb +32 -41
  364. data/spec/cucumber/step_match_spec.rb +34 -33
  365. data/spec/cucumber/world/pending_spec.rb +12 -11
  366. data/spec/spec_helper.rb +1 -0
  367. data/spec/support/standard_step_actions.rb +2 -1
  368. metadata +132 -61
  369. data/features/docs/formatters/debug_formatter.feature +0 -47
  370. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  371. data/features/docs/writing_support_code/transforms.feature +0 -98
  372. data/features/lib/step_definitions/wire_steps.rb +0 -58
  373. data/gem_tasks/cucumber.rake +0 -25
  374. data/lib/cucumber/ast.rb +0 -13
  375. data/lib/cucumber/core_ext/instance_exec.rb +0 -70
  376. data/lib/cucumber/events/after_test_case.rb +0 -25
  377. data/lib/cucumber/events/after_test_step.rb +0 -30
  378. data/lib/cucumber/events/before_test_case.rb +0 -18
  379. data/lib/cucumber/events/before_test_step.rb +0 -23
  380. data/lib/cucumber/events/bus.rb +0 -86
  381. data/lib/cucumber/events/finished_testing.rb +0 -9
  382. data/lib/cucumber/formatter/debug.rb +0 -35
  383. data/lib/cucumber/formatter/event_bus_report.rb +0 -38
  384. data/lib/cucumber/rb_support/rb_hook.rb +0 -19
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -131
  386. data/lib/cucumber/rb_support/rb_transform.rb +0 -59
  387. data/lib/cucumber/rb_support/rb_world.rb +0 -149
  388. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -4
  389. data/spec/cucumber/events/bus_spec.rb +0 -94
  390. data/spec/cucumber/formatter/debug_spec.rb +0 -64
  391. data/spec/cucumber/formatter/event_bus_report_spec.rb +0 -88
  392. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -243
  393. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -199
  394. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
  395. data/spec/cucumber_spec.rb +0 -39
@@ -1,4 +1,9 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/core/report/summary'
3
+ require 'cucumber/formatter/backtrace_filter'
1
4
  require 'cucumber/formatter/console'
5
+ require 'cucumber/formatter/console_counts'
6
+ require 'cucumber/formatter/console_issues'
2
7
  require 'cucumber/formatter/io'
3
8
  require 'cucumber/formatter/duration_extractor'
4
9
  require 'cucumber/formatter/hook_query_visitor'
@@ -10,32 +15,60 @@ module Cucumber
10
15
  include Console
11
16
  include Io
12
17
  attr_reader :runtime
18
+ attr_reader :config, :summary
13
19
 
14
- def initialize(runtime, path_or_io, options)
15
- @runtime, @io, @options = runtime, ensure_io(path_or_io), options
20
+ def initialize(config)
21
+ @config, @io = config, ensure_io(config.out_stream)
16
22
  @previous_step_keyword = nil
17
23
  @snippets_input = []
18
24
  @total_duration = 0
25
+ @summary = Cucumber::Core::Report::Summary.new(config.event_bus)
26
+ @matches = {}
27
+ @pending_step_matches = []
28
+ @failed_results = []
29
+ @failed_test_cases = []
30
+ @passed_test_cases = []
31
+ @counts = ConsoleCounts.new(config)
32
+ @issues = ConsoleIssues.new(config)
33
+ config.on_event :step_activated, &method(:on_step_activated)
34
+ config.on_event :test_case_started, &method(:on_test_case_started)
35
+ config.on_event :test_step_finished, &method(:on_test_step_finished)
36
+ config.on_event :test_case_finished, &method(:on_test_case_finished)
37
+ config.on_event :test_run_finished, &method(:on_test_run_finished)
19
38
  end
20
39
 
21
- def before_test_case(_test_case)
40
+ def on_step_activated(event)
41
+ @matches[event.test_step.source] = event.step_match
42
+ end
43
+
44
+ def on_test_case_started(_event)
22
45
  unless @profile_information_printed
23
- print_profile_information
46
+ do_print_profile_information(config.profiles) unless config.skip_profile_information? || config.profiles.nil? || config.profiles.empty?
24
47
  @profile_information_printed = true
25
48
  end
26
49
  @previous_step_keyword = nil
27
50
  end
28
51
 
29
- def after_test_step(test_step, result)
52
+ def on_test_step_finished(event)
53
+ test_step = event.test_step
54
+ result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
30
55
  progress(result.to_sym) if !HookQueryVisitor.new(test_step).hook? || result.failed?
31
- collect_snippet_data(test_step, result) unless HookQueryVisitor.new(test_step).hook?
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?
32
61
  end
33
62
 
34
- def after_test_case(_test_case, result)
63
+ def on_test_case_finished(event)
64
+ test_case = event.test_case
65
+ result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
66
+ @failed_test_cases << test_case if result.failed?
67
+ @passed_test_cases << test_case if result.passed?
35
68
  @total_duration += DurationExtractor.new(result).result_duration
36
69
  end
37
70
 
38
- def done
71
+ def on_test_run_finished(_event)
39
72
  @io.puts
40
73
  @io.puts
41
74
  print_summary
@@ -44,11 +77,18 @@ module Cucumber
44
77
  private
45
78
 
46
79
  def print_summary
47
- print_steps(:pending)
48
- print_steps(:failed)
49
- print_statistics(@total_duration, @options)
50
- print_snippets(@options)
51
- print_passing_wip(@options)
80
+ print_elements(@pending_step_matches, :pending, 'steps')
81
+ print_elements(@failed_results, :failed, 'steps')
82
+ print_statistics(@total_duration, @config, @counts, @issues)
83
+ snippet_text_proc = lambda { |step_keyword, step_name, multiline_arg|
84
+ snippet_text(step_keyword, step_name, multiline_arg)
85
+ }
86
+ do_print_snippets(snippet_text_proc) if config.snippets? && summary.test_steps.total(:undefined) > 0
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)
90
+ end
91
+ do_print_passing_wip(messages)
52
92
  end
53
93
 
54
94
  CHARS = {
@@ -68,6 +108,8 @@ module Cucumber
68
108
  def table_header_cell?(status)
69
109
  status == :skipped_param
70
110
  end
111
+
112
+ TestCaseData = Struct.new(:name, :location)
71
113
  end
72
114
  end
73
115
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/formatter/io'
2
3
 
3
4
  module Cucumber
@@ -5,28 +6,24 @@ module Cucumber
5
6
  class Rerun
6
7
  include Formatter::Io
7
8
 
8
- def initialize(runtime, path_or_io, options)
9
- @io = ensure_io(path_or_io)
9
+ def initialize(config)
10
+ @io = ensure_io(config.out_stream)
11
+ @config = config
10
12
  @failures = {}
11
- @options = options
12
- end
13
-
14
- def after_test_case(test_case, result)
15
- return if result.ok?(@options[:strict])
16
- @failures[test_case.location.file] ||= []
17
- @failures[test_case.location.file] << test_case.location.line
18
- end
19
-
20
- def done
21
- return if @failures.empty?
22
- @io.print file_failures.join(' ')
23
- end
24
-
25
- [:before_test_case, :before_test_step, :after_test_step].each do |method|
26
- define_method(method) { |*| }
13
+ config.on_event :test_case_finished do |event|
14
+ test_case, result = *event.attributes
15
+ next if result.ok?(@config.strict)
16
+ @failures[test_case.location.file] ||= []
17
+ @failures[test_case.location.file] << test_case.location.line
18
+ end
19
+ config.on_event :test_run_finished do
20
+ next if @failures.empty?
21
+ @io.print file_failures.join('\n')
22
+ end
27
23
  end
28
24
 
29
25
  private
26
+
30
27
  def file_failures
31
28
  @failures.map { |file, lines| [file, lines].join(':') }
32
29
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/formatter/usage'
2
3
 
3
4
  module Cucumber
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Formatter
3
4
  # The formatter used for <tt>--format steps</tt>
@@ -9,7 +10,7 @@ module Cucumber
9
10
  @step_definition_files = collect_steps(runtime)
10
11
  end
11
12
 
12
- def after_features(features)
13
+ def after_features(_features)
13
14
  print_summary
14
15
  end
15
16
 
@@ -1,35 +1,58 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/formatter/io'
3
+ require 'cucumber/formatter/console'
4
+ require 'cucumber/formatter/console_counts'
5
+ require 'cucumber/formatter/console_issues'
6
+ require 'cucumber/core/test/result'
7
+
1
8
  module Cucumber
2
9
  module Formatter
3
- module Summary
4
10
 
5
- def scenario_summary(runtime, &block)
6
- scenarios_proc = lambda{|status| runtime.scenarios(status)}
7
- dump_count(runtime.scenarios.length, "scenario") + dump_status_counts(scenarios_proc, &block)
8
- end
11
+ # Summary formatter, outputting only feature / scenario titles
12
+ class Summary
13
+ include Io
14
+ include Console
15
+
16
+ def initialize(config)
17
+ @config, @io = config, ensure_io(config.out_stream)
18
+ @counts = ConsoleCounts.new(@config)
19
+ @issues = ConsoleIssues.new(@config)
20
+ @start_time = Time.now
9
21
 
10
- def step_summary(runtime, &block)
11
- steps_proc = lambda{|status| runtime.steps(status)}
12
- dump_count(runtime.steps.length, "step") + dump_status_counts(steps_proc, &block)
22
+ @config.on_event :test_case_started do |event|
23
+ print_feature event.test_case
24
+ print_test_case event.test_case
25
+ end
26
+
27
+ @config.on_event :test_case_finished do |event|
28
+ print_result event.result
29
+ end
30
+
31
+ @config.on_event :test_run_finished do |event|
32
+ duration = Time.now - @start_time
33
+ @io.puts
34
+ print_statistics(duration, @config, @counts, @issues)
35
+ end
13
36
  end
14
37
 
15
38
  private
16
39
 
17
- def dump_status_counts(find_elements_proc)
18
- counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
19
- elements = find_elements_proc.call(status)
20
- elements.any? ? yield("#{elements.length} #{status.to_s}", status) : nil
21
- end.compact
22
- if counts.any?
23
- " (#{counts.join(', ')})"
24
- else
25
- ""
26
- end
40
+ def print_feature(test_case)
41
+ feature = test_case.feature
42
+ return if @current_feature == feature
43
+ @io.puts unless @current_feature.nil?
44
+ @io.puts feature
45
+ @current_feature = feature
27
46
  end
28
47
 
29
- def dump_count(count, what, state=nil)
30
- [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
48
+ def print_test_case(test_case)
49
+ @io.print " #{test_case.name} "
31
50
  end
32
51
 
52
+ def print_result(result)
53
+ @io.puts format_string(result, result.to_sym)
54
+ end
33
55
  end
34
56
  end
35
57
  end
58
+
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Require this file if you need Unicode support.
2
3
  # Tips for improvement - esp. ruby 1.9: http://www.ruby-forum.com/topic/184730
3
4
  require 'cucumber/platform'
@@ -14,7 +15,7 @@ if Cucumber::WINDOWS
14
15
  Cucumber::CODEPAGE = "cp#{$1.to_i}"
15
16
  end
16
17
  else
17
- Cucumber::CODEPAGE = "cp1252"
18
+ Cucumber::CODEPAGE = 'cp1252'
18
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.")
19
20
  end
20
21
 
@@ -1,33 +1,45 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/formatter/progress'
2
3
  require 'cucumber/step_definition_light'
3
4
 
4
5
  module Cucumber
5
6
  module Formatter
6
7
  class Usage < Progress
7
- include Console
8
8
 
9
9
  class StepDefKey < StepDefinitionLight
10
10
  attr_accessor :mean_duration, :status
11
11
  end
12
12
 
13
- def initialize(runtime, path_or_io, options)
14
- @runtime = runtime
15
- @io = ensure_io(path_or_io)
16
- @options = options
13
+ def initialize(config)
14
+ super
17
15
  @stepdef_to_match = Hash.new { |h, stepdef_key| h[stepdef_key] = [] }
18
16
  @total_duration = 0
19
17
  @matches = {}
20
- runtime.configuration.on_event :step_match do |event|
21
- @matches[event.test_step.source] = event.step_match
18
+ config.on_event :step_activated do |event|
19
+ test_step, step_match = *event.attributes
20
+ @matches[test_step.source] = step_match
22
21
  end
22
+ config.on_event :step_definition_registered, &method(:on_step_definition_registered)
23
+ end
24
+
25
+ def on_step_definition_registered(event)
26
+ stepdef_key = StepDefKey.new(event.step_definition.expression.to_s, event.step_definition.location)
27
+ @stepdef_to_match[stepdef_key] = []
23
28
  end
24
29
 
25
- def after_test_step(test_step, result)
26
- return if HookQueryVisitor.new(test_step).hook?
30
+ def on_step_match(event)
31
+ @matches[event.test_step.source] = event.step_match
32
+ super
33
+ end
27
34
 
35
+ def on_test_step_finished(event)
36
+ return if HookQueryVisitor.new(event.test_step).hook?
37
+
38
+ test_step = event.test_step
39
+ result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
28
40
  step_match = @matches[test_step.source]
29
41
  step_definition = step_match.step_definition
30
- stepdef_key = StepDefKey.new(step_definition.regexp_source, step_definition.location)
42
+ stepdef_key = StepDefKey.new(step_definition.expression.to_s, step_definition.location)
31
43
  unless @stepdef_to_match[stepdef_key].map { |key| key[:location] }.include? test_step.location
32
44
  duration = DurationExtractor.new(result).result_duration
33
45
 
@@ -45,14 +57,13 @@ module Cucumber
45
57
  private
46
58
 
47
59
  def print_summary
48
- add_unused_stepdefs
49
60
  aggregate_info
50
61
 
51
- if @options[:dry_run]
52
- keys = @stepdef_to_match.keys.sort {|a,b| a.regexp_source <=> b.regexp_source}
53
- else
54
- keys = @stepdef_to_match.keys.sort {|a,b| a.mean_duration <=> b.mean_duration}.reverse
55
- 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
56
67
 
57
68
  keys.each do |stepdef_key|
58
69
  print_step_definition(stepdef_key)
@@ -60,7 +71,7 @@ module Cucumber
60
71
  if @stepdef_to_match[stepdef_key].any?
61
72
  print_steps(stepdef_key)
62
73
  else
63
- @io.puts(" " + format_string("NOT MATCHED BY ANY STEPS", :failed))
74
+ @io.puts(' ' + format_string('NOT MATCHED BY ANY STEPS', :failed))
64
75
  end
65
76
  end
66
77
  @io.puts
@@ -68,9 +79,9 @@ module Cucumber
68
79
  end
69
80
 
70
81
  def print_step_definition(stepdef_key)
71
- @io.print format_string(sprintf("%.7f", stepdef_key.mean_duration), :skipped) + " " unless @options[:dry_run]
82
+ @io.print format_string(format('%.7f', stepdef_key.mean_duration), :skipped) + ' ' unless config.dry_run?
72
83
  @io.print format_string(stepdef_key.regexp_source, stepdef_key.status)
73
- if @options[:source]
84
+ if config.source?
74
85
  indent = max_length - stepdef_key.regexp_source.unpack('U*').length
75
86
  line_comment = " # #{stepdef_key.location}".indent(indent)
76
87
  @io.print(format_string(line_comment, :comment))
@@ -80,10 +91,10 @@ module Cucumber
80
91
 
81
92
  def print_steps(stepdef_key)
82
93
  @stepdef_to_match[stepdef_key].each do |step|
83
- @io.print " "
84
- @io.print format_string(sprintf("%.7f", step[:duration]), :skipped) + " " unless @options[:dry_run]
94
+ @io.print ' '
95
+ @io.print format_string(format('%.7f', step[:duration]), :skipped) + ' ' unless config.dry_run?
85
96
  @io.print format_step(step[:keyword], step[:step_match], step[:status], nil)
86
- if @options[:source]
97
+ if config.source?
87
98
  indent = max_length - (step[:keyword].unpack('U*').length + step[:step_match].format_args.unpack('U*').length)
88
99
  line_comment = " # #{step[:location]}".indent(indent)
89
100
  @io.print(format_string(line_comment, :comment))
@@ -125,12 +136,6 @@ module Cucumber
125
136
  end
126
137
  end
127
138
 
128
- def add_unused_stepdefs
129
- @runtime.unmatched_step_definitions.each do |step_definition|
130
- stepdef_key = StepDefKey.new(step_definition.regexp_source, step_definition.location)
131
- @stepdef_to_match[stepdef_key] = []
132
- end
133
- end
134
139
  end
135
140
  end
136
141
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'gherkin/token_scanner'
2
3
  require 'gherkin/parser'
3
4
  require 'gherkin/dialect'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Gherkin
3
4
  module Formatter
@@ -83,7 +84,7 @@ module Gherkin
83
84
  ALIASES["#{key}_arg"].split(',').map{|color| COLORS[color]}.join('')
84
85
  end
85
86
  end
86
-
87
+
87
88
  def reset
88
89
  "\e[0m"
89
90
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Gherkin
3
4
  module Formatter
@@ -9,7 +10,7 @@ module Gherkin
9
10
  #
10
11
  # This is used in the pretty formatter.
11
12
  def escape_cell(s)
12
- s.gsub(/\\(?!\|)/, "\\\\\\\\").gsub(/\n/, "\\n").gsub(/\|/, "\\|")
13
+ s.gsub(/\\(?!\|)/, '\\\\\\\\').gsub(/\n/, '\\n').gsub(/\|/, '\\|')
13
14
  end
14
15
  end
15
16
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Gherkin
3
4
  module I18n
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'gherkin/token_scanner'
2
3
  require 'gherkin/token_matcher'
3
4
  require 'gherkin/parser'
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/cucumber_expressions/parameter_type'
3
+ require 'cucumber/deprecate'
4
+
1
5
  module Cucumber
2
- module RbSupport
3
- # This module defines the methods you can use to define pure Ruby
4
- # Step Definitions and Hooks. This module is mixed into the toplevel
5
- # object.
6
- 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
7
10
  class << self
8
11
  attr_writer :rb_language
9
12
 
@@ -11,16 +14,16 @@ module Cucumber
11
14
  alias_method adverb, :register_rb_step_definition
12
15
  end
13
16
 
14
- def build_rb_world_factory(world_modules, proc)
15
- @rb_language.build_rb_world_factory(world_modules, proc)
17
+ def build_rb_world_factory(world_modules, namespaced_world_modules, proc)
18
+ @rb_language.build_rb_world_factory(world_modules, namespaced_world_modules, proc)
16
19
  end
17
20
 
18
21
  def register_rb_hook(phase, tag_names, proc)
19
22
  @rb_language.register_rb_hook(phase, tag_names, proc)
20
23
  end
21
24
 
22
- def register_rb_transform(regexp, proc)
23
- @rb_language.register_rb_transform(regexp, proc)
25
+ def define_parameter_type(parameter_type)
26
+ @rb_language.define_parameter_type(parameter_type)
24
27
  end
25
28
 
26
29
  def register_rb_step_definition(regexp, proc_or_sym, options = {})
@@ -33,6 +36,10 @@ module Cucumber
33
36
  # Object that the scenario's steps will run within. Any +world_modules+
34
37
  # will be mixed into this Object (via Object#extend).
35
38
  #
39
+ # By default the +world modules+ are added to a global namespace. It is
40
+ # possible to create a namespaced World by using an hash, where the
41
+ # symbols are the namespaces.
42
+ #
36
43
  # This method is typically called from one or more Ruby scripts under
37
44
  # <tt>features/support</tt>. You can call this method as many times as you
38
45
  # like (to register more modules), but if you try to register more than
@@ -46,20 +53,22 @@ module Cucumber
46
53
  #
47
54
  # World(MyModule)
48
55
  #
49
- def World(*world_modules, &proc)
50
- RbDsl.build_rb_world_factory(world_modules, proc)
56
+ # World(my_module: MyModule)
57
+ #
58
+ def World(*world_modules, **namespaced_world_modules, &proc)
59
+ Dsl.build_rb_world_factory(world_modules, namespaced_world_modules, proc)
51
60
  end
52
61
 
53
62
  # Registers a proc that will run before each Scenario. You can register as many
54
63
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
55
64
  def Before(*tag_expressions, &proc)
56
- RbDsl.register_rb_hook('before', tag_expressions, proc)
65
+ Dsl.register_rb_hook('before', tag_expressions, proc)
57
66
  end
58
67
 
59
68
  # Registers a proc that will run after each Scenario. You can register as many
60
69
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
61
70
  def After(*tag_expressions, &proc)
62
- RbDsl.register_rb_hook('after', tag_expressions, proc)
71
+ Dsl.register_rb_hook('after', tag_expressions, proc)
63
72
  end
64
73
 
65
74
  # Registers a proc that will be wrapped around each scenario. The proc
@@ -68,34 +77,35 @@ module Cucumber
68
77
  # blocks in 1.8), on which it should call the .call method. You can register
69
78
  # as many as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
70
79
  def Around(*tag_expressions, &proc)
71
- RbDsl.register_rb_hook('around', tag_expressions, proc)
80
+ Dsl.register_rb_hook('around', tag_expressions, proc)
72
81
  end
73
82
 
74
83
  # Registers a proc that will run after each Step. You can register as
75
84
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
76
85
  def AfterStep(*tag_expressions, &proc)
77
- RbDsl.register_rb_hook('after_step', tag_expressions, proc)
86
+ Dsl.register_rb_hook('after_step', tag_expressions, proc)
78
87
  end
79
88
 
80
- # Registers a proc that will be called with a step definition argument if it
81
- # matches the pattern passed as the first argument to Transform. Alternatively, if
82
- # the pattern contains captures then they will be yielded as arguments to the
83
- # provided proc. The return value of the proc is consequently yielded to the
84
- # step definition.
85
- def Transform(regexp, &proc)
86
- Cucumber.deprecate(
87
- "\n Please follow the upgrade instructions at https://cucumber.io/blog/2017/09/21/upgrading-to-cucumber-3",
88
- "Transform",
89
- "3.0.0"
89
+ def ParameterType(options)
90
+ type = options[:type] || Object
91
+ use_for_snippets = true if options[:use_for_snippets].nil?
92
+ prefer_for_regexp_match = false if options[:prefer_for_regexp_match].nil?
93
+
94
+ parameter_type = CucumberExpressions::ParameterType.new(
95
+ options[:name],
96
+ options[:regexp],
97
+ type,
98
+ options[:transformer],
99
+ use_for_snippets,
100
+ prefer_for_regexp_match
90
101
  )
91
- RbDsl.register_rb_transform(regexp, proc)
102
+ Dsl.define_parameter_type(parameter_type)
92
103
  end
93
104
 
94
105
  # Registers a proc that will run after Cucumber is configured. You can register as
95
106
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
96
- # TODO: Deprecate this
97
107
  def AfterConfiguration(&proc)
98
- RbDsl.register_rb_hook('after_configuration', [], proc)
108
+ Dsl.register_rb_hook('after_configuration', [], proc)
99
109
  end
100
110
 
101
111
  # Registers a new Ruby StepDefinition. This method is aliased
@@ -115,10 +125,11 @@ module Cucumber
115
125
  # the context of the <tt>World</tt> object.
116
126
  def register_rb_step_definition(regexp, symbol = nil, options = {}, &proc)
117
127
  proc_or_sym = symbol || proc
118
- RbDsl.register_rb_step_definition(regexp, proc_or_sym, options)
128
+ Dsl.register_rb_step_definition(regexp, proc_or_sym, options)
119
129
  end
120
130
  end
121
131
  end
122
132
  end
123
133
 
124
- extend(Cucumber::RbSupport::RbDsl)
134
+ # TODO: can we avoid adding methods to the global namespace (Kernel)
135
+ extend(Cucumber::Glue::Dsl)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/glue/invoke_in_world'
3
+
4
+ module Cucumber
5
+ module Glue
6
+ # TODO: Kill pointless wrapper for Before, After and AfterStep hooks with fire
7
+ class Hook
8
+ attr_reader :tag_expressions, :location
9
+
10
+ def initialize(registry, tag_expressions, proc)
11
+ @registry = registry
12
+ @tag_expressions = tag_expressions
13
+ @proc = proc
14
+ @location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
15
+ warn_for_old_style_tag_expressions(tag_expressions)
16
+ end
17
+
18
+ def invoke(pseudo_method, arguments, &block)
19
+ check_arity = false
20
+ InvokeInWorld.cucumber_instance_exec_in(
21
+ @registry.current_world,
22
+ check_arity,
23
+ pseudo_method,
24
+ *[arguments, block].flatten.compact,
25
+ &@proc
26
+ )
27
+ end
28
+
29
+ private
30
+
31
+ def warn_for_old_style_tag_expressions(tag_expressions)
32
+ tag_expressions.each do |tag_expression|
33
+ if tag_expression.include?('~') && tag_expression != '~@no-clobber' # ~@no-clobber is used in aruba
34
+ warn("Deprecated: Found tagged hook with '#{tag_expression}'. Support for '~@tag' will be removed from the next release of Cucumber. Please use 'not @tag' instead.")
35
+ end
36
+ if tag_expression.include?(',')
37
+ warn("Deprecated: Found tagged hook with '#{tag_expression}'. Support for '@tag1,@tag2' will be removed from the next release of Cucumber. Please use '@tag or @tag2' instead.")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end