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
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/platform'
3
+ module Cucumber
4
+ module Glue
5
+ # Utility methods for executing step definitions with nice backtraces etc.
6
+ # TODO: add unit tests
7
+ # TODO: refactor for readability
8
+ class InvokeInWorld
9
+ def self.replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
10
+ return if Cucumber.use_full_backtrace
11
+
12
+ instance_exec_pos = backtrace.index(instance_exec_invocation_line)
13
+ if instance_exec_pos
14
+ replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
15
+ backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
16
+
17
+ depth = backtrace.count { |line| line == instance_exec_invocation_line }
18
+ end_pos = depth > 1 ? instance_exec_pos : -1
19
+
20
+ backtrace[replacement_line+1..end_pos] = nil
21
+ backtrace.compact!
22
+ end
23
+ end
24
+
25
+ def self.cucumber_instance_exec_in(world, check_arity, pseudo_method, *args, &block)
26
+ cucumber_run_with_backtrace_filtering(pseudo_method) do
27
+ if check_arity && !cucumber_compatible_arity?(args, block)
28
+ world.instance_exec do
29
+ ari = block.arity
30
+ ari = ari < 0 ? (ari.abs-1).to_s+'+' : ari
31
+ s1 = ari == 1 ? '' : 's'
32
+ s2 = args.length == 1 ? '' : 's'
33
+ raise ArityMismatchError.new(
34
+ "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
35
+ )
36
+ end
37
+ else
38
+ world.instance_exec(*args, &block)
39
+ end
40
+ end
41
+ end
42
+
43
+ def self.cucumber_compatible_arity?(args, block)
44
+ return true if block.arity == args.length
45
+ if block.arity < 0
46
+ return true if args.length >= (block.arity.abs - 1)
47
+ end
48
+ false
49
+ end
50
+
51
+ def self.cucumber_run_with_backtrace_filtering(pseudo_method)
52
+ begin
53
+ yield
54
+ rescue Exception => e
55
+ instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
56
+ replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
57
+ raise e
58
+ end
59
+ end
60
+
61
+ INSTANCE_EXEC_OFFSET = -3
62
+ end
63
+
64
+ # Raised if the number of a StepDefinition's Regexp match groups
65
+ # is different from the number of Proc arguments.
66
+ class ArityMismatchError < StandardError
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,220 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/gherkin/formatter/ansi_escapes'
3
+ require 'cucumber/core/ast/data_table'
4
+
5
+ module Cucumber
6
+ module Glue
7
+ # Defines the basic API methods availlable in all Cucumber step definitions.
8
+ #
9
+ # You can, and probably should, extend this API with your own methods that
10
+ # make sense in your domain. For more on that, see {Cucumber::Glue::Dsl#World}
11
+ module ProtoWorld
12
+
13
+ # Run a single Gherkin step
14
+ # @example Call another step
15
+ # step "I am logged in"
16
+ # @example Call a step with quotes in the name
17
+ # step %{the user "Dave" is logged in}
18
+ # @example Passing a table
19
+ # step "the following users exist:", table(%{
20
+ # | name | email |
21
+ # | Matt | matt@matt.com |
22
+ # | Aslak | aslak@aslak.com |
23
+ # })
24
+ # @example Passing a multiline string
25
+ # step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
26
+ # @param [String] name The name of the step
27
+ # @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
28
+ def step(name, raw_multiline_arg=nil)
29
+ super
30
+ end
31
+
32
+ # Run a snippet of Gherkin
33
+ # @example
34
+ # steps %{
35
+ # Given the user "Susan" exists
36
+ # And I am logged in as "Susan"
37
+ # }
38
+ # @param [String] steps_text The Gherkin snippet to run
39
+ def steps(steps_text)
40
+ super
41
+ end
42
+
43
+ # Parse Gherkin into a {Cucumber::Ast::Table} object.
44
+ #
45
+ # Useful in conjunction with the #step method.
46
+ # @example Create a table
47
+ # users = table(%{
48
+ # | name | email |
49
+ # | Matt | matt@matt.com |
50
+ # | Aslak | aslak@aslak.com |
51
+ # })
52
+ # @param [String] text_or_table The Gherkin string that represents the table
53
+ # Returns a Cucumber::MultilineArgument::DataTable for +text_or_table+, which can either
54
+ # be a String:
55
+ #
56
+ # table(%{
57
+ # | account | description | amount |
58
+ # | INT-100 | Taxi | 114 |
59
+ # | CUC-101 | Peeler | 22 |
60
+ # })
61
+ #
62
+ # or a 2D Array:
63
+ #
64
+ # table([
65
+ # %w{ account description amount },
66
+ # %w{ INT-100 Taxi 114 },
67
+ # %w{ CUC-101 Peeler 22 }
68
+ # ])
69
+ #
70
+ def table(text_or_table, file=nil, line=0)
71
+ location = !file ? Core::Ast::Location.of_caller : Core::Ast::Location.new(file, line)
72
+ MultilineArgument::DataTable.from(text_or_table, location)
73
+ end
74
+
75
+ # Print a message to the output.
76
+ #
77
+ # @note Cucumber might surprise you with the behaviour of this method. Instead
78
+ # of sending the output directly to STDOUT, Cucumber will intercept and cache
79
+ # the message until the current step has finished, and then display it.
80
+ #
81
+ # If you'd prefer to see the message immediately, call {Kernel.puts} instead.
82
+ def puts(*messages)
83
+ super
84
+ end
85
+
86
+ # Pause the tests and ask the operator for input
87
+ def ask(question, timeout_seconds=60)
88
+ super
89
+ end
90
+
91
+ # Embed an image in the output
92
+ def embed(file, mime_type, label='Screenshot')
93
+ super
94
+ end
95
+
96
+ # Mark the matched step as pending.
97
+ def pending(message = 'TODO')
98
+ if block_given?
99
+ begin
100
+ yield
101
+ rescue Exception
102
+ raise Pending, message
103
+ end
104
+ raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
105
+ else
106
+ raise Pending, message
107
+ end
108
+ end
109
+
110
+ # Skips this step and the remaining steps in the scenario
111
+ def skip_this_scenario(message = 'Scenario skipped')
112
+ raise Core::Test::Result::Skipped, message
113
+ end
114
+
115
+ # Prints the list of modules that are included in the World
116
+ def inspect
117
+ super
118
+ end
119
+
120
+ # see {#inspect}
121
+ def to_s
122
+ inspect
123
+ end
124
+
125
+ # Dynamially generate the API module, closuring the dependencies
126
+ def self.for(runtime, language)
127
+ Module.new do
128
+ def self.extended(object)
129
+ # wrap the dynamically generated module so that we can document the methods
130
+ # for yardoc, which doesn't like define_method.
131
+ object.extend(ProtoWorld)
132
+ end
133
+
134
+ # TODO: pass these in when building the module, instead of mutating them later
135
+ # Extend the World with user-defined modules
136
+ def add_modules!(world_modules, namespaced_world_modules)
137
+ add_world_modules!(world_modules)
138
+ add_namespaced_modules!(namespaced_world_modules)
139
+ end
140
+
141
+ define_method(:step) do |name, raw_multiline_arg=nil|
142
+ location = Core::Ast::Location.of_caller
143
+ runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
144
+ end
145
+
146
+ define_method(:steps) do |steps_text|
147
+ location = Core::Ast::Location.of_caller
148
+ runtime.invoke_dynamic_steps(steps_text, language, location)
149
+ end
150
+
151
+ define_method(:puts) do |*messages|
152
+ # Even though they won't be output until later, converting the messages to
153
+ # strings right away will protect them from modifications to their original
154
+ # objects in the mean time
155
+ messages.collect! { |message| "#{message}" }
156
+
157
+ runtime.puts(*messages)
158
+ end
159
+
160
+ define_method(:ask) do |question, timeout_seconds=60|
161
+ runtime.ask(question, timeout_seconds)
162
+ end
163
+
164
+ define_method(:embed) do |file, mime_type, label='Screenshot'|
165
+ runtime.embed(file, mime_type, label)
166
+ end
167
+
168
+ # Prints the list of modules that are included in the World
169
+ def inspect
170
+ modules = [self.class]
171
+ (class << self; self; end).instance_eval do
172
+ modules += included_modules
173
+ end
174
+ modules << stringify_namespaced_modules
175
+ format('#<%s:0x%x>', modules.join('+'), self.object_id)
176
+ end
177
+
178
+ private
179
+
180
+ # @private
181
+ def add_world_modules!(modules)
182
+ modules.each do |world_module|
183
+ extend(world_module)
184
+ end
185
+ end
186
+
187
+ # @private
188
+ def add_namespaced_modules!(modules)
189
+ @__namespaced_modules = modules
190
+ modules.each do |namespace, world_modules|
191
+ world_modules.each do |world_module|
192
+ variable_name = "@__#{namespace}_world"
193
+
194
+ inner_world = if self.class.respond_to?(namespace)
195
+ instance_variable_get(variable_name)
196
+ else
197
+ Object.new
198
+ end
199
+ instance_variable_set(variable_name,
200
+ inner_world.extend(world_module))
201
+ self.class.send(:define_method, namespace) do
202
+ instance_variable_get(variable_name)
203
+ end
204
+ end
205
+ end
206
+ end
207
+
208
+ # @private
209
+ def stringify_namespaced_modules
210
+ @__namespaced_modules.map { |k, v| "#{v.join(',')} (as #{k})" }.join('+')
211
+ end
212
+
213
+ end
214
+ end
215
+
216
+ # @private
217
+ AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
218
+ end
219
+ end
220
+ end
@@ -1,39 +1,45 @@
1
- require 'cucumber/core_ext/instance_exec'
2
- require 'cucumber/rb_support/rb_dsl'
3
- require 'cucumber/rb_support/rb_world'
4
- require 'cucumber/rb_support/rb_step_definition'
5
- require 'cucumber/rb_support/rb_hook'
6
- require 'cucumber/rb_support/rb_transform'
7
- require 'cucumber/rb_support/snippet'
1
+ # frozen_string_literal: true
2
+ require 'cucumber/cucumber_expressions/parameter_type_registry'
3
+ require 'cucumber/cucumber_expressions/cucumber_expression'
4
+ require 'cucumber/cucumber_expressions/regular_expression'
5
+ require 'cucumber/cucumber_expressions/cucumber_expression_generator'
6
+ require 'cucumber/glue/dsl'
7
+ require 'cucumber/glue/snippet'
8
+ require 'cucumber/glue/hook'
9
+ require 'cucumber/glue/proto_world'
10
+ require 'cucumber/glue/step_definition'
11
+ require 'cucumber/glue/world_factory'
8
12
  require 'cucumber/gherkin/i18n'
9
13
  require 'multi_test'
10
14
  require 'cucumber/step_match'
11
15
  require 'cucumber/step_definition_light'
16
+ require 'cucumber/events/step_definition_registered'
12
17
 
13
18
  module Cucumber
14
- module RbSupport
19
+ module Glue
15
20
  # Raised if a World block returns Nil.
16
21
  class NilWorld < StandardError
17
22
  def initialize
18
- super("World procs should never return nil")
23
+ super('World procs should never return nil')
19
24
  end
20
25
  end
21
26
 
22
27
  # Raised if there are 2 or more World blocks.
23
28
  class MultipleWorld < StandardError
24
29
  def initialize(first_proc, second_proc)
25
- message = "You can only pass a proc to #World once, but it's happening\n"
30
+ message = String.new
31
+ message << "You can only pass a proc to #World once, but it's happening\n"
26
32
  message << "in 2 places:\n\n"
27
- message << RbSupport.backtrace_line(first_proc, 'World') << "\n"
28
- message << RbSupport.backtrace_line(second_proc, 'World') << "\n\n"
29
- message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
33
+ message << Glue.backtrace_line(first_proc, 'World') << "\n"
34
+ message << Glue.backtrace_line(second_proc, 'World') << "\n\n"
35
+ message << "Use Ruby modules instead to extend your worlds. See the Cucumber::Glue::Dsl#World RDoc\n"
30
36
  message << "or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.\n\n"
31
37
  super(message)
32
38
  end
33
39
  end
34
40
 
35
- # The Ruby implementation of the programming language API.
36
- class RbLanguage
41
+ # TODO: This class has too many responsibilities, split off
42
+ class RegistryAndMore
37
43
  attr_reader :current_world,
38
44
  :step_definitions
39
45
 
@@ -42,15 +48,17 @@ module Cucumber
42
48
  dialect.given_keywords + dialect.when_keywords + dialect.then_keywords + dialect.and_keywords + dialect.but_keywords
43
49
  end
44
50
  Cucumber::Gherkin::I18n.code_keywords_for(all_keywords.flatten.uniq.sort).each do |adverb|
45
- RbDsl.alias_adverb(adverb.strip)
51
+ Glue::Dsl.alias_adverb(adverb.strip)
46
52
  end
47
53
 
48
54
  def initialize(runtime, configuration)
49
- @runtime = runtime
55
+ @runtime, @configuration = runtime, configuration
50
56
  @step_definitions = []
51
- RbDsl.rb_language = self
57
+ Glue::Dsl.rb_language = self
52
58
  @world_proc = @world_modules = nil
53
- configuration.register_snippet_generator(Snippet::Generator.new)
59
+ @parameter_type_registry = CucumberExpressions::ParameterTypeRegistry.new
60
+ cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(@parameter_type_registry)
61
+ @configuration.register_snippet_generator(Snippet::Generator.new(cucumber_expression_generator))
54
62
  end
55
63
 
56
64
  def step_matches(name_to_match)
@@ -62,42 +70,48 @@ module Cucumber
62
70
  }
63
71
  end
64
72
 
65
- def begin_rb_scenario(scenario)
66
- create_world
67
- extend_world
68
- connect_world(scenario)
69
- end
70
-
71
73
  def register_rb_hook(phase, tag_expressions, proc)
72
- add_hook(phase, RbHook.new(self, tag_expressions, proc))
74
+ add_hook(phase, Hook.new(self, tag_expressions, proc))
73
75
  end
74
76
 
75
- def register_rb_transform(regexp, proc)
76
- add_transform(RbTransform.new(self, regexp, proc))
77
+ def define_parameter_type(parameter_type)
78
+ @parameter_type_registry.define_parameter_type(parameter_type)
77
79
  end
78
80
 
79
- def register_rb_step_definition(regexp, proc_or_sym, options)
80
- step_definition = RbStepDefinition.new(self, regexp, proc_or_sym, options)
81
+ def register_rb_step_definition(string_or_regexp, proc_or_sym, options)
82
+ step_definition = StepDefinition.new(self, string_or_regexp, proc_or_sym, options)
81
83
  @step_definitions << step_definition
84
+ @configuration.notify :step_definition_registered, step_definition
82
85
  step_definition
83
86
  end
84
87
 
85
- def build_rb_world_factory(world_modules, proc)
86
- if(proc)
88
+ def build_rb_world_factory(world_modules, namespaced_world_modules, proc)
89
+ if proc
87
90
  raise MultipleWorld.new(@world_proc, proc) if @world_proc
88
91
  @world_proc = proc
89
92
  end
90
93
  @world_modules ||= []
91
94
  @world_modules += world_modules
95
+
96
+ @namespaced_world_modules ||= Hash.new { |h, k| h[k] = [] }
97
+ namespaced_world_modules.each do |namespace, world_module|
98
+ unless @namespaced_world_modules[namespace].include?(world_module)
99
+ @namespaced_world_modules[namespace] << world_module
100
+ end
101
+ end
92
102
  end
93
103
 
94
104
  def load_code_file(code_file)
95
- return unless File.extname(code_file) == ".rb"
96
- load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
105
+ return unless File.extname(code_file) == '.rb'
106
+ load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.define_parameter_type to be called from Glue::Dsl
97
107
  end
98
108
 
99
- def begin_scenario(scenario)
100
- begin_rb_scenario(scenario)
109
+ def begin_scenario(test_case)
110
+ @current_world = WorldFactory.new(@world_proc).create_world
111
+ @current_world.extend(ProtoWorld.for(@runtime, test_case.language))
112
+ MultiTest.extend_with_best_assertion_library(@current_world)
113
+ @current_world.add_modules!(@world_modules || [],
114
+ @namespaced_world_modules || {})
101
115
  end
102
116
 
103
117
  def end_scenario
@@ -110,13 +124,6 @@ module Cucumber
110
124
  end
111
125
  end
112
126
 
113
- def execute_transforms(args)
114
- args.map do |arg|
115
- matching_transform = transforms.detect {|transform| transform.match(arg) }
116
- matching_transform ? matching_transform.invoke(arg) : arg
117
- end
118
- end
119
-
120
127
  def add_hook(phase, hook)
121
128
  hooks[phase.to_sym] << hook
122
129
  hook
@@ -126,11 +133,6 @@ module Cucumber
126
133
  @hooks = nil
127
134
  end
128
135
 
129
- def add_transform(transform)
130
- transforms.unshift transform
131
- transform
132
- end
133
-
134
136
  def hooks_for(phase, scenario) #:nodoc:
135
137
  hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
136
138
  end
@@ -147,6 +149,12 @@ module Cucumber
147
149
  invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
148
150
  end
149
151
 
152
+ def create_expression(string_or_regexp)
153
+ return CucumberExpressions::CucumberExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(String)
154
+ return CucumberExpressions::RegularExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(Regexp)
155
+ raise ArgumentError.new('Expression must be a String or Regexp')
156
+ end
157
+
150
158
  private
151
159
 
152
160
  def available_step_definition_hash
@@ -161,56 +169,18 @@ module Cucumber
161
169
  @hooks ||= Hash.new{|h,k| h[k] = []}
162
170
  end
163
171
 
164
- def transforms
165
- @transforms ||= []
166
- end
167
-
168
- def create_world
169
- if(@world_proc)
170
- @current_world = @world_proc.call
171
- check_nil(@current_world, @world_proc)
172
- else
173
- @current_world = Object.new
174
- end
175
- end
176
-
177
- def extend_world
178
- @current_world.extend(RbWorld)
179
- MultiTest.extend_with_best_assertion_library(@current_world)
180
- (@world_modules || []).each do |mod|
181
- @current_world.extend(mod)
182
- end
183
- end
184
-
185
- def connect_world(scenario)
186
- @current_world.__cucumber_runtime = @runtime
187
- @current_world.__natural_language = scenario.language
188
- end
189
-
190
- def check_nil(o, proc)
191
- if o.nil?
192
- begin
193
- raise NilWorld.new
194
- rescue NilWorld => e
195
- e.backtrace.clear
196
- e.backtrace.push(RbSupport.backtrace_line(proc, "World"))
197
- raise e
198
- end
199
- else
200
- o
201
- end
202
- end
203
-
204
172
  def self.cli_snippet_type_options
173
+ registry = CucumberExpressions::ParameterTypeRegistry.new
174
+ cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(registry)
205
175
  Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
206
- Snippet::SNIPPET_TYPES[type].cli_option_string(type)
176
+ Snippet::SNIPPET_TYPES[type].cli_option_string(type, cucumber_expression_generator)
207
177
  end
208
178
  end
209
179
  end
210
180
 
211
181
  def self.backtrace_line(proc, name)
212
182
  location = Cucumber::Core::Ast::Location.from_source_location(*proc.source_location)
213
- "#{location.to_s}:in `#{name}'"
183
+ "#{location}:in `#{name}'"
214
184
  end
215
185
  end
216
186
  end