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,98 +0,0 @@
1
- Feature: Transforms
2
-
3
- Transforms allow you to convert primitive string arguments captured in step definitions
4
- into more meaningful data types.
5
-
6
- Background:
7
- Let's just create a simple feature for testing out Transforms.
8
- We also have a Person class that we need to be able to build.
9
-
10
- Given a file named "features/foo.feature" with:
11
- """
12
- Feature:
13
- Scenario:
14
- Given a Person aged 15 with blonde hair
15
- """
16
- And a file named "features/support/person.rb" with:
17
- """
18
- class Person
19
- attr_accessor :age
20
-
21
- def to_s
22
- "I am #{age} years old"
23
- end
24
- end
25
- """
26
-
27
- Scenario: Basic Transform
28
- This is the most basic way to use a transform. Notice that the regular
29
- expression is pretty much duplicated between the step defintion and the
30
- transform itself.
31
-
32
- And a file named "features/step_definitions/steps.rb" with:
33
- """
34
- Transform(/a Person aged (\d+)/) do |age|
35
- person = Person.new
36
- person.age = age.to_i
37
- person
38
- end
39
-
40
- Given /^(a Person aged \d+) with blonde hair$/ do |person|
41
- expect(person.age).to eq 15
42
- end
43
- """
44
- When I run `cucumber features/foo.feature`
45
- Then it should pass
46
-
47
- Scenario: Re-use Transform's Regular Expression
48
- If you keep a reference to the transform, you can use it in your
49
- regular expressions to avoid repeating the regular expression.
50
-
51
- And a file named "features/step_definitions/steps.rb" with:
52
- """
53
- A_PERSON = Transform(/a Person aged (\d+)/) do |age|
54
- person = Person.new
55
- person.age = age.to_i
56
- person
57
- end
58
-
59
- Given /^(#{A_PERSON}) with blonde hair$/ do |person|
60
- expect(person.age).to eq 15
61
- end
62
- """
63
- When I run `cucumber features/foo.feature`
64
- Then it should pass
65
-
66
- Scenario: Use Transform from code
67
- You can also call the `Transform` method from within a step definition to
68
- dynamically run a tranform.
69
-
70
- Note that this is rather useless at present, unless the transform itself has a side-effect, since the `Transform`
71
- function still returns the regular expression pattern.
72
-
73
- Given a file named "features/people.feature" with:
74
- """
75
- Feature:
76
- Scenario:
77
- Given people with these ages:
78
- | name | age |
79
- | sue | 25 |
80
- | sally | 77 |
81
- """
82
- And a file named "features/step_definitions/steps.rb" with:
83
- """
84
- Transform(/a Person aged (\d+)/) do |age|
85
- $person = Person.new
86
- $person.age = age.to_i
87
- $person
88
- end
89
-
90
- Given(/^people with these ages:$/) do |table|
91
- table.rows.each do |name, age|
92
- Transform("a Person aged #{age}")
93
- expect($person.age).to eq age.to_i
94
- end
95
- end
96
- """
97
- When I run `cucumber features/people.feature`
98
- Then it should pass
@@ -1,58 +0,0 @@
1
- Given /^there is a wire server (running |)on port (\d+) which understands the following protocol:$/ do |running, port, table|
2
- protocol = table.hashes.map do |table_hash|
3
- table_hash['response'] = table_hash['response'].gsub(/\n/, '\n')
4
- table_hash
5
- end
6
-
7
- @server = FakeWireServer.new(port.to_i, protocol)
8
- start_wire_server if running.strip == "running"
9
- end
10
-
11
- Given /^the wire server takes (.*) seconds to respond to the invoke message$/ do |timeout|
12
- @server.delay_response(:invoke, timeout.to_f)
13
- start_wire_server
14
- end
15
-
16
- Given /^I have environment variable (\w+) set to "([^"]*)"$/ do |variable, value|
17
- set_env(variable, value)
18
- end
19
-
20
- Then(/^the wire server should have received the following messages:$/) do |expected_messages|
21
- expect(messages_received).to eq expected_messages.raw.flatten
22
- end
23
-
24
- module WireHelper
25
- attr_reader :messages_received
26
-
27
- def start_wire_server
28
- @messages_received = []
29
- reader, writer = IO.pipe
30
- @wire_pid = fork {
31
- reader.close
32
- @server.run(writer)
33
- }
34
- writer.close
35
- Thread.new do
36
- while message = reader.gets
37
- @messages_received << message.strip
38
- end
39
- end
40
- at_exit { stop_wire_server }
41
- end
42
-
43
- def stop_wire_server
44
- return unless @wire_pid
45
- Process.kill('KILL', @wire_pid)
46
- Process.wait(@wire_pid)
47
- rescue Errno::ESRCH
48
- # No such process - wire server has already been stopped by the After hook
49
- end
50
- end
51
-
52
- Before('@wire') do
53
- extend(WireHelper)
54
- end
55
-
56
- After('@wire') do
57
- stop_wire_server
58
- end
@@ -1,25 +0,0 @@
1
- require 'cucumber/rake/task'
2
- require 'cucumber/platform'
3
-
4
- class Cucumber::Rake::Task
5
- def set_profile_for_current_ruby
6
- self.profile = if Cucumber::JRUBY
7
- Cucumber::WINDOWS ? 'jruby_win' : 'jruby'
8
- elsif Cucumber::WINDOWS_MRI
9
- 'windows_mri'
10
- elsif Cucumber::RUBY_1_9
11
- 'ruby_1_9'
12
- elsif Cucumber::RUBY_2_0
13
- 'ruby_2_0'
14
- elsif Cucumber::RUBY_2_1
15
- 'ruby_2_1'
16
- end
17
- end
18
- end
19
-
20
- Cucumber::Rake::Task.new(:features) do |t|
21
- t.fork = true
22
- t.set_profile_for_current_ruby
23
- end
24
-
25
- task :cucumber => :features
data/lib/cucumber/ast.rb DELETED
@@ -1,13 +0,0 @@
1
- require 'cucumber/multiline_argument'
2
-
3
- module Cucumber
4
- module Ast
5
- def self.const_missing(const_name)
6
- if const_name == :Table
7
- warn "`Cucumber::Ast::Table` has been deprecated. Use `Cucumber::MultilineArgument::DataTable` instead."
8
- return Cucumber::MultilineArgument::DataTable
9
- end
10
- raise "`Cucumber::Ast` no longer exists. These classes have moved into the `Cucumber::Core::Ast` namespace, but may not have the same API."
11
- end
12
- end
13
- end
@@ -1,70 +0,0 @@
1
- require 'cucumber/platform'
2
-
3
- module Cucumber
4
- # Raised if the number of a StepDefinition's Regexp match groups
5
- # is different from the number of Proc arguments.
6
- class ArityMismatchError < StandardError
7
- end
8
- end
9
-
10
- class Object #:nodoc:
11
- # TODO: Move most of this stuff out to an InstanceExecutor class.
12
- def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
13
- cucumber_run_with_backtrace_filtering(pseudo_method) do
14
- if check_arity && !cucumber_compatible_arity?(args, block)
15
- instance_exec do
16
- ari = block.arity
17
- ari = ari < 0 ? (ari.abs-1).to_s+"+" : ari
18
- s1 = ari == 1 ? "" : "s"
19
- s2 = args.length == 1 ? "" : "s"
20
- raise Cucumber::ArityMismatchError.new(
21
- "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
22
- )
23
- end
24
- else
25
- instance_exec(*args, &block)
26
- end
27
- end
28
- end
29
-
30
- private
31
-
32
- def cucumber_compatible_arity?(args, block)
33
- return true if block.arity == args.length
34
- if block.arity < 0
35
- return true if args.length >= (block.arity.abs - 1)
36
- end
37
- false
38
- end
39
-
40
- def cucumber_run_with_backtrace_filtering(pseudo_method)
41
- begin
42
- yield
43
- rescue Exception => e
44
- instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
45
- replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
46
- raise e
47
- end
48
- end
49
-
50
- INSTANCE_EXEC_OFFSET = -3
51
-
52
- def replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
53
- return if Cucumber.use_full_backtrace
54
-
55
- instance_exec_pos = backtrace.index(instance_exec_invocation_line)
56
- if instance_exec_pos
57
- replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
58
- backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
59
-
60
- depth = backtrace.count { |line| line == instance_exec_invocation_line }
61
- end_pos = depth > 1 ? instance_exec_pos : -1
62
-
63
- backtrace[replacement_line+1..end_pos] = nil
64
- backtrace.compact!
65
- else
66
- # This happens with rails, because they screw up the backtrace
67
- # before we get here (injecting erb stacktrace and such)
68
- end
69
- end
70
- end
@@ -1,25 +0,0 @@
1
- module Cucumber
2
- module Events
3
-
4
- # Event fired after a test case has finished executing
5
- class AfterTestCase
6
-
7
- # The test case that was just executed.
8
- #
9
- # @return [Cucumber::Core::Test::Case]
10
- attr_reader :test_case
11
-
12
- # The result of executing the test case.
13
- #
14
- # @return [Cucumber::Core::Test::Result]
15
- attr_reader :result
16
-
17
- # @private
18
- def initialize(test_case, result)
19
- @test_case, @result = test_case, result
20
- end
21
-
22
- end
23
-
24
- end
25
- end
@@ -1,30 +0,0 @@
1
- module Cucumber
2
- module Events
3
-
4
- # Event fired after each test step has been executed
5
- class AfterTestStep
6
-
7
- # The test case currently being executed.
8
- #
9
- # @return [Cucumber::Core::Test::Case]
10
- attr_reader :test_case
11
-
12
- # The test step that was just executed.
13
- #
14
- # @return [Cucumber::Core::Test::Step]
15
- attr_reader :test_step
16
-
17
- # The result of executing the test step.
18
- #
19
- # @return [Cucumber::Core::Test::Result]
20
- attr_reader :result
21
-
22
- # @private
23
- def initialize(test_case, test_step, result)
24
- @test_case, @test_step, @result = test_case, test_step, result
25
- end
26
-
27
- end
28
-
29
- end
30
- end
@@ -1,18 +0,0 @@
1
- module Cucumber
2
- module Events
3
-
4
- # Event fired before a test case is executed
5
- class BeforeTestCase
6
-
7
- # The test case about to be executed.
8
- #
9
- # @return [Cucumber::Core::Test::Case]
10
- attr_reader :test_case
11
-
12
- # @private
13
- def initialize(test_case)
14
- @test_case = test_case
15
- end
16
- end
17
- end
18
- end
@@ -1,23 +0,0 @@
1
- module Cucumber
2
- module Events
3
-
4
- # Event fired before a test step is executed
5
- class BeforeTestStep
6
-
7
- # The test case currently being executed.
8
- #
9
- # @return [Cucumber::Core::Test::Case]
10
- attr_reader :test_case
11
-
12
- # The test step about to be executed.
13
- #
14
- # @return [Cucumber::Core::Test::Step]
15
- attr_reader :test_step
16
-
17
- # @private
18
- def initialize(test_case, test_step)
19
- @test_case, @test_step = test_case, test_step
20
- end
21
- end
22
- end
23
- end
@@ -1,86 +0,0 @@
1
- module Cucumber
2
- module Events
3
-
4
- # Event bus
5
- #
6
- # Implements and in-process pub-sub events broadcaster allowing multiple observers
7
- # to subscribe to different events that fire as your tests are executed.
8
- #
9
- # @private
10
- class Bus
11
-
12
- def initialize(default_namespace)
13
- @default_namespace = default_namespace.to_s
14
- @handlers = {}
15
- end
16
-
17
- # Register for an event
18
- def register(event_id, handler_object = nil, &handler_proc)
19
- handler = handler_proc || handler_object
20
- raise ArgumentError.new("Please pass either an object or a handler block") unless handler
21
- event_class = parse_event_id(event_id)
22
- handlers_for(event_class) << handler
23
- end
24
-
25
- # Broadcast an event
26
- def notify(event)
27
- handlers_for(event.class).each { |handler| handler.call(event) }
28
- end
29
-
30
- private
31
-
32
- def handlers_for(event_class)
33
- @handlers[event_class.to_s] ||= []
34
- end
35
-
36
- def parse_event_id(event_id)
37
- case event_id
38
- when Class
39
- return event_id
40
- when String
41
- constantize(event_id)
42
- else
43
- constantize("#{@default_namespace}::#{camel_case(event_id)}")
44
- end
45
- end
46
-
47
- def camel_case(underscored_name)
48
- underscored_name.to_s.split("_").map { |word| word.upcase[0] + word[1..-1] }.join
49
- end
50
-
51
- # Thanks ActiveSupport
52
- # (Only needed to support Ruby 1.9.3 and JRuby)
53
- def constantize(camel_cased_word)
54
- names = camel_cased_word.split('::')
55
-
56
- # Trigger a built-in NameError exception including the ill-formed constant in the message.
57
- Object.const_get(camel_cased_word) if names.empty?
58
-
59
- # Remove the first blank element in case of '::ClassName' notation.
60
- names.shift if names.size > 1 && names.first.empty?
61
-
62
- names.inject(Object) do |constant, name|
63
- if constant == Object
64
- constant.const_get(name)
65
- else
66
- candidate = constant.const_get(name)
67
- next candidate if constant.const_defined?(name, false)
68
- next candidate unless Object.const_defined?(name)
69
-
70
- # Go down the ancestors to check if it is owned directly. The check
71
- # stops when we reach Object or the end of ancestors tree.
72
- constant = constant.ancestors.inject do |const, ancestor|
73
- break const if ancestor == Object
74
- break ancestor if ancestor.const_defined?(name, false)
75
- const
76
- end
77
-
78
- # owner is in Object, so raise
79
- constant.const_get(name, false)
80
- end
81
- end
82
- end
83
-
84
- end
85
- end
86
- end
@@ -1,9 +0,0 @@
1
- module Cucumber
2
- module Events
3
-
4
- # Event fired after aall test cases have finished executing
5
- class FinishedTesting
6
- end
7
-
8
- end
9
- end
@@ -1,35 +0,0 @@
1
- require 'cucumber/formatter/progress'
2
- require 'cucumber/step_definition_light'
3
-
4
- module Cucumber
5
- module Formatter
6
- class Debug
7
- def initialize(runtime, io, options)
8
- @io = io
9
- end
10
-
11
- def log(message)
12
- return unless ENV['DEBUG']
13
- @io.puts "* #{message}"
14
- end
15
-
16
- def respond_to?(*args)
17
- true
18
- end
19
-
20
- def method_missing(name, *args)
21
- print(name)
22
- end
23
-
24
- def puts(*args)
25
- print("puts")
26
- end
27
-
28
- private
29
-
30
- def print(text)
31
- @io.puts text
32
- end
33
- end
34
- end
35
- end
@@ -1,38 +0,0 @@
1
- module Cucumber
2
- module Formatter
3
-
4
- # Adapter between Cucumber::Core::Test::Runner's Report API and
5
- # Cucumber's event bus
6
- class EventBusReport
7
- attr_reader :config
8
- private :config
9
-
10
- def initialize(config)
11
- @config = config
12
- end
13
-
14
- def before_test_case(test_case)
15
- @config.notify Events::BeforeTestCase.new(test_case)
16
- @test_case = test_case
17
- end
18
-
19
- def before_test_step(test_step)
20
- @config.notify Events::BeforeTestStep.new(@test_case, test_step)
21
- end
22
-
23
- def after_test_step(test_step, result)
24
- @config.notify Events::AfterTestStep.new(@test_case, test_step, result)
25
- end
26
-
27
- def after_test_case(test_case, result)
28
- @config.notify Events::AfterTestCase.new(test_case, result)
29
- end
30
-
31
- def done
32
- @config.notify Events::FinishedTesting.new
33
- end
34
- end
35
-
36
- end
37
- end
38
-
@@ -1,19 +0,0 @@
1
- module Cucumber
2
- module RbSupport
3
- # Wrapper for Before, After and AfterStep hooks
4
- class RbHook
5
- attr_reader :tag_expressions, :location
6
-
7
- def initialize(rb_language, tag_expressions, proc)
8
- @rb_language = rb_language
9
- @tag_expressions = tag_expressions
10
- @proc = proc
11
- @location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
12
- end
13
-
14
- def invoke(pseudo_method, arguments, &block)
15
- @rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].flatten.compact, &@proc)
16
- end
17
- end
18
- end
19
- end
@@ -1,131 +0,0 @@
1
- require 'cucumber/step_match'
2
- require 'cucumber/step_argument'
3
- require 'cucumber/core_ext/string'
4
-
5
- module Cucumber
6
- module RbSupport
7
- # A Ruby Step Definition holds a Regexp and a Proc, and is created
8
- # by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
9
- # in the <tt>step_definitions</tt> ruby files. See also RbDsl.
10
- #
11
- # Example:
12
- #
13
- # Given /I have (\d+) cucumbers in my belly/ do
14
- # # some code here
15
- # end
16
- #
17
- class RbStepDefinition
18
-
19
- class MissingProc < StandardError
20
- def message
21
- "Step definitions must always have a proc or symbol"
22
- end
23
- end
24
-
25
- class << self
26
- def new(rb_language, pattern, proc_or_sym, options)
27
- raise MissingProc if proc_or_sym.nil?
28
- super rb_language, parse_pattern(pattern), create_proc(proc_or_sym, options)
29
- end
30
-
31
- private
32
-
33
- def parse_pattern(pattern)
34
- return pattern if pattern.is_a?(Regexp)
35
- raise ArgumentError unless pattern.is_a?(String)
36
- p = Regexp.escape(pattern)
37
- p = p.gsub(/\\\$\w+/, '(.*)') # Replace $var with (.*)
38
- Regexp.new("^#{p}$")
39
- end
40
-
41
- def create_proc(proc_or_sym, options)
42
- return proc_or_sym if proc_or_sym.is_a?(Proc)
43
- raise ArgumentError unless proc_or_sym.is_a?(Symbol)
44
- message = proc_or_sym
45
- target_proc = parse_target_proc_from(options)
46
- patch_location_onto lambda { |*args|
47
- target = instance_exec(&target_proc)
48
- target.send(message, *args)
49
- }
50
- end
51
-
52
- def patch_location_onto(block)
53
- location = Core::Ast::Location.of_caller(5)
54
- block.define_singleton_method(:source_location) { [location.file, location.line] }
55
- block
56
- end
57
-
58
- def parse_target_proc_from(options)
59
- return lambda { self } unless options.key?(:on)
60
- target = options[:on]
61
- case target
62
- when Proc
63
- target
64
- when Symbol
65
- lambda { self.send(target) }
66
- else
67
- lambda { raise ArgumentError, "Target must be a symbol or a proc" }
68
- end
69
- end
70
- end
71
-
72
- def initialize(rb_language, regexp, proc)
73
- @rb_language, @regexp, @proc = rb_language, regexp, proc
74
- @rb_language.available_step_definition(regexp_source, location)
75
- end
76
-
77
- def regexp_source
78
- @regexp.inspect
79
- end
80
-
81
- def to_hash
82
- flags = ''
83
- flags += 'm' if (@regexp.options & Regexp::MULTILINE) != 0
84
- flags += 'i' if (@regexp.options & Regexp::IGNORECASE) != 0
85
- flags += 'x' if (@regexp.options & Regexp::EXTENDED) != 0
86
- {'source' => @regexp.source, 'flags' => flags}
87
- end
88
-
89
- def ==(step_definition)
90
- regexp_source == step_definition.regexp_source
91
- end
92
-
93
- def arguments_from(step_name)
94
- args = StepArgument.arguments_from(@regexp, step_name)
95
- @rb_language.invoked_step_definition(regexp_source, location) if args
96
- args
97
- end
98
-
99
- def invoke(args)
100
- begin
101
- args = @rb_language.execute_transforms(args)
102
- @rb_language.current_world.cucumber_instance_exec(true, regexp_source, *args, &@proc)
103
- rescue Cucumber::ArityMismatchError => e
104
- e.backtrace.unshift(self.backtrace_line)
105
- raise e
106
- end
107
- end
108
-
109
- def backtrace_line
110
- "#{location.to_s}:in `#{regexp_source}'"
111
- end
112
-
113
- def file_colon_line
114
- case @proc
115
- when Proc
116
- location.to_s
117
- when Symbol
118
- ":#{@proc}"
119
- end
120
- end
121
-
122
- def location
123
- @location ||= Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
124
- end
125
-
126
- def file
127
- @file ||= location.file
128
- end
129
- end
130
- end
131
- end