cucumber 1.3.10 → 2.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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +4 -3
  5. data/CONTRIBUTING.md +9 -0
  6. data/Gemfile +9 -2
  7. data/History.md +212 -22
  8. data/LICENSE +2 -2
  9. data/README.md +4 -4
  10. data/Rakefile +10 -1
  11. data/bin/cucumber +1 -5
  12. data/cucumber.gemspec +10 -13
  13. data/cucumber.yml +14 -24
  14. data/examples/{ramaze → i18n/el}/Rakefile +1 -1
  15. data/examples/i18n/el/features/addition.feature +17 -0
  16. data/examples/i18n/el/features/division.feature +10 -0
  17. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
  18. data/examples/i18n/el/lib/calculator.rb +14 -0
  19. data/examples/i18n/fr/Rakefile +3 -1
  20. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +2 -2
  21. data/examples/i18n/ht/Rakefile +6 -0
  22. data/examples/i18n/ht/features/adisyon.feature +17 -0
  23. data/examples/i18n/ht/features/divizyon.feature +10 -0
  24. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
  25. data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
  26. data/examples/i18n/zh-CN/features/{step_definitons → step_definitions}/calculator_steps.rb +4 -4
  27. data/examples/tcl/features/step_definitions/fib_steps.rb +1 -1
  28. data/{legacy_features → features/docs}/api/list_step_defs_as_json.feature +14 -14
  29. data/{legacy_features → features/docs}/api/run_cli_main_with_existing_runtime.feature +5 -10
  30. data/features/{backtraces.feature → docs/cli/backtraces.feature} +2 -2
  31. data/features/docs/cli/dry_run.feature +73 -0
  32. data/features/docs/cli/exclude_files.feature +18 -0
  33. data/features/docs/cli/execute_with_tag_filter.feature +117 -0
  34. data/features/docs/cli/randomize.feature +46 -0
  35. data/features/docs/cli/require.feature +27 -0
  36. data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
  37. data/features/docs/cli/run_specific_scenarios.feature +75 -0
  38. data/features/docs/cli/showing_differences.feature +43 -0
  39. data/features/docs/cli/specifying_multiple_formatters.feature +44 -0
  40. data/features/docs/cli/strict_mode.feature +64 -0
  41. data/features/{nested_steps.feature → docs/defining_steps/nested_steps.feature} +52 -6
  42. data/features/{nested_steps_i18n.feature → docs/defining_steps/nested_steps_i18n.feature} +0 -2
  43. data/features/{step_definitions.feature → docs/defining_steps/one_line_step_definitions.feature} +3 -3
  44. data/features/docs/defining_steps/printing_messages.feature +148 -0
  45. data/features/docs/defining_steps/skip_scenario.feature +62 -0
  46. data/features/docs/defining_steps/snippets.feature +56 -0
  47. data/{legacy_features → features/docs/defining_steps}/table_diffing.feature +21 -16
  48. data/features/{transforms.feature → docs/defining_steps/transforms.feature} +2 -2
  49. data/{legacy_features/exception_in_after_block.feature → features/docs/exception_in_after_hook.feature} +25 -26
  50. data/{legacy_features/exception_in_after_step_block.feature → features/docs/exception_in_after_step_hook.feature} +22 -24
  51. data/features/docs/exception_in_around_hook.feature +80 -0
  52. data/{legacy_features/exception_in_before_block.feature → features/docs/exception_in_before_hook.feature} +18 -20
  53. data/features/docs/extending_cucumber/custom_filter.feature +29 -0
  54. data/features/docs/extending_cucumber/custom_formatter.feature +94 -0
  55. data/features/docs/formatters/debug_formatter.feature +47 -0
  56. data/features/{formatter_step_file_colon_line.feature → docs/formatters/formatter_step_file_colon_line.feature} +2 -4
  57. data/features/{html_formatter.feature → docs/formatters/html_formatter.feature} +10 -14
  58. data/features/docs/formatters/json_formatter.feature +760 -0
  59. data/features/docs/formatters/junit_formatter.feature +316 -0
  60. data/features/docs/formatters/pretty_formatter.feature +73 -0
  61. data/features/{progress_formatter.feature → docs/formatters/progress_formatter.feature} +1 -1
  62. data/features/docs/formatters/rerun_formatter.feature +136 -0
  63. data/features/docs/formatters/usage_formatter.feature +102 -0
  64. data/features/docs/getting_started.feature +27 -0
  65. data/features/{background.feature → docs/gherkin/background.feature} +149 -91
  66. data/features/{doc_strings.feature → docs/gherkin/doc_strings.feature} +1 -0
  67. data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
  68. data/features/docs/gherkin/language_from_header.feature +32 -0
  69. data/features/docs/gherkin/outlines.feature +158 -0
  70. data/features/docs/gherkin/unicode_table.feature +32 -0
  71. data/features/docs/gherkin/using_descriptions.feature +88 -0
  72. data/features/docs/gherkin/using_star_notation.feature +37 -0
  73. data/{legacy_features → features/docs}/post_configuration_hook.feature +17 -18
  74. data/{legacy_features → features/docs}/profiles.feature +30 -36
  75. data/{legacy_features → features/docs}/rake_task.feature +30 -41
  76. data/features/{raketask.feature → docs/raketask.feature} +6 -13
  77. data/{legacy_features/wire_protocol_erb.feature → features/docs/wire_protocol/erb_configuration.feature} +7 -8
  78. data/features/docs/wire_protocol/handle_unexpected_response.feature +30 -0
  79. data/features/docs/wire_protocol/invoke_message.feature +216 -0
  80. data/features/docs/wire_protocol/readme.md +26 -0
  81. data/features/docs/wire_protocol/snippets_message.feature +51 -0
  82. data/features/docs/wire_protocol/step_matches_message.feature +81 -0
  83. data/{legacy_features/wire_protocol_table_diffing.feature → features/docs/wire_protocol/table_diffing.feature} +19 -12
  84. data/{legacy_features/wire_protocol_tags.feature → features/docs/wire_protocol/tags.feature} +7 -7
  85. data/{legacy_features/wire_protocol_timeouts.feature → features/docs/wire_protocol/timeouts.feature} +7 -6
  86. data/{legacy_features → features/docs}/work_in_progress.feature +52 -54
  87. data/features/docs/writing_support_code/after_hooks.feature +80 -0
  88. data/{legacy_features → features/docs/writing_support_code}/around_hooks.feature +56 -28
  89. data/features/docs/writing_support_code/before_hook.feature +65 -0
  90. data/features/docs/writing_support_code/hook_order.feature +61 -0
  91. data/features/{load_path.feature → docs/writing_support_code/load_path.feature} +3 -0
  92. data/features/docs/writing_support_code/state.feature +32 -0
  93. data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
  94. data/features/lib/step_definitions/aruba_steps.rb +22 -0
  95. data/features/lib/step_definitions/cucumber_steps.rb +50 -0
  96. data/features/{step_definitions → lib/step_definitions}/iso-8859-1_steps.rb +3 -15
  97. data/features/lib/step_definitions/json_steps.rb +7 -0
  98. data/features/lib/step_definitions/junit_steps.rb +13 -0
  99. data/features/lib/step_definitions/language_steps.rb +4 -5
  100. data/features/lib/step_definitions/profile_steps.rb +15 -0
  101. data/features/lib/step_definitions/ruby_steps.rb +3 -0
  102. data/features/lib/step_definitions/wire_steps.rb +58 -0
  103. data/features/lib/support/env.rb +21 -0
  104. data/{legacy_features → features/lib}/support/fake_wire_server.rb +10 -7
  105. data/features/{support → lib/support}/feature_factory.rb +1 -1
  106. data/features/lib/support/normalise_output.rb +33 -0
  107. data/gem_tasks/cov.rake +5 -0
  108. data/gem_tasks/cucumber.rake +3 -8
  109. data/gem_tasks/rspec.rake +0 -2
  110. data/lib/cucumber/ast.rb +8 -25
  111. data/lib/cucumber/cli/configuration.rb +33 -37
  112. data/lib/cucumber/cli/main.rb +14 -27
  113. data/lib/cucumber/cli/options.rb +22 -60
  114. data/lib/cucumber/cli/profile_loader.rb +1 -1
  115. data/lib/cucumber/configuration.rb +4 -0
  116. data/lib/cucumber/constantize.rb +7 -6
  117. data/lib/cucumber/core_ext/instance_exec.rb +7 -38
  118. data/lib/cucumber/core_ext/proc.rb +1 -1
  119. data/lib/cucumber/encoding.rb +5 -0
  120. data/lib/cucumber/errors.rb +21 -10
  121. data/lib/cucumber/file_specs.rb +37 -0
  122. data/lib/cucumber/filters/activate_steps.rb +33 -0
  123. data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
  124. data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
  125. data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
  126. data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
  127. data/lib/cucumber/filters/gated_receiver.rb +25 -0
  128. data/lib/cucumber/filters/prepare_world.rb +45 -0
  129. data/lib/cucumber/filters/quit.rb +28 -0
  130. data/lib/cucumber/filters/randomizer.rb +40 -0
  131. data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
  132. data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
  133. data/lib/cucumber/filters/tag_limits.rb +45 -0
  134. data/lib/cucumber/filters.rb +9 -0
  135. data/lib/cucumber/formatter/ansicolor.rb +0 -8
  136. data/lib/cucumber/formatter/console.rb +66 -36
  137. data/lib/cucumber/formatter/debug.rb +10 -8
  138. data/lib/cucumber/formatter/fanout.rb +27 -0
  139. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +122 -12
  140. data/lib/cucumber/formatter/html.rb +67 -18
  141. data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
  142. data/lib/cucumber/formatter/interceptor.rb +17 -3
  143. data/lib/cucumber/formatter/json.rb +1 -1
  144. data/lib/cucumber/formatter/junit.rb +105 -5
  145. data/lib/cucumber/formatter/legacy_api/adapter.rb +1060 -0
  146. data/lib/cucumber/formatter/legacy_api/ast.rb +376 -0
  147. data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
  148. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +30 -0
  149. data/lib/cucumber/formatter/pretty.rb +16 -8
  150. data/lib/cucumber/formatter/progress.rb +10 -0
  151. data/lib/cucumber/formatter/rerun.rb +14 -71
  152. data/lib/cucumber/formatter/unicode.rb +8 -21
  153. data/lib/cucumber/formatter/usage.rb +7 -1
  154. data/lib/cucumber/hooks.rb +97 -0
  155. data/lib/cucumber/language_support/language_methods.rb +0 -54
  156. data/lib/cucumber/{ast/table.rb → multiline_argument/data_table.rb} +77 -84
  157. data/lib/cucumber/multiline_argument/doc_string.rb +10 -0
  158. data/lib/cucumber/multiline_argument.rb +74 -0
  159. data/lib/cucumber/platform.rb +21 -20
  160. data/lib/cucumber/project_initializer.rb +43 -0
  161. data/lib/cucumber/rake/task.rb +3 -54
  162. data/lib/cucumber/rb_support/rb_hook.rb +2 -2
  163. data/lib/cucumber/rb_support/rb_language.rb +4 -34
  164. data/lib/cucumber/rb_support/rb_step_definition.rb +11 -2
  165. data/lib/cucumber/rb_support/rb_transform.rb +3 -1
  166. data/lib/cucumber/rb_support/rb_world.rb +13 -20
  167. data/lib/cucumber/rb_support/snippet.rb +61 -20
  168. data/lib/cucumber/rspec/doubles.rb +9 -6
  169. data/lib/cucumber/running_test_case.rb +115 -0
  170. data/lib/cucumber/runtime/after_hooks.rb +24 -0
  171. data/lib/cucumber/runtime/before_hooks.rb +23 -0
  172. data/lib/cucumber/runtime/for_programming_languages.rb +14 -10
  173. data/lib/cucumber/runtime/step_hooks.rb +22 -0
  174. data/lib/cucumber/runtime/support_code.rb +78 -21
  175. data/lib/cucumber/runtime/user_interface.rb +4 -0
  176. data/lib/cucumber/runtime.rb +153 -98
  177. data/lib/cucumber/step_match.rb +27 -3
  178. data/lib/cucumber/term/ansicolor.rb +1 -9
  179. data/lib/cucumber/wire_support/wire_language.rb +23 -9
  180. data/lib/cucumber/wire_support/wire_packet.rb +1 -1
  181. data/lib/cucumber/wire_support/wire_protocol/requests.rb +13 -5
  182. data/lib/cucumber/wire_support/wire_step_definition.rb +1 -8
  183. data/lib/cucumber.rb +8 -6
  184. data/spec/cucumber/cli/configuration_spec.rb +165 -134
  185. data/spec/cucumber/cli/main_spec.rb +36 -99
  186. data/spec/cucumber/cli/options_spec.rb +238 -272
  187. data/spec/cucumber/cli/profile_loader_spec.rb +18 -7
  188. data/spec/cucumber/configuration_spec.rb +3 -3
  189. data/spec/cucumber/constantize_spec.rb +2 -1
  190. data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
  191. data/spec/cucumber/core_ext/proc_spec.rb +32 -43
  192. data/spec/cucumber/file_specs_spec.rb +60 -0
  193. data/spec/cucumber/filters/activate_steps_spec.rb +57 -0
  194. data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
  195. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
  196. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
  197. data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
  198. data/spec/cucumber/formatter/ansicolor_spec.rb +11 -10
  199. data/spec/cucumber/formatter/debug_spec.rb +64 -0
  200. data/spec/cucumber/formatter/duration_spec.rb +6 -6
  201. data/spec/cucumber/formatter/html_spec.rb +233 -39
  202. data/spec/cucumber/formatter/interceptor_spec.rb +38 -31
  203. data/spec/cucumber/formatter/junit_spec.rb +213 -151
  204. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2090 -0
  205. data/spec/cucumber/formatter/pretty_spec.rb +481 -49
  206. data/spec/cucumber/formatter/progress_spec.rb +63 -16
  207. data/spec/cucumber/formatter/rerun_spec.rb +107 -0
  208. data/spec/cucumber/formatter/spec_helper.rb +32 -17
  209. data/spec/cucumber/hooks_spec.rb +30 -0
  210. data/spec/cucumber/{ast/table_spec.rb → multiline_argument/data_table_spec.rb} +128 -208
  211. data/spec/cucumber/project_initializer_spec.rb +87 -0
  212. data/spec/cucumber/rake/forked_spec.rb +13 -22
  213. data/spec/cucumber/rb_support/rb_language_spec.rb +78 -69
  214. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +90 -44
  215. data/spec/cucumber/rb_support/rb_transform_spec.rb +24 -3
  216. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +6 -4
  217. data/spec/cucumber/rb_support/snippet_spec.rb +47 -38
  218. data/spec/cucumber/running_test_case_spec.rb +83 -0
  219. data/spec/cucumber/runtime/for_programming_languages_spec.rb +18 -13
  220. data/spec/cucumber/runtime/support_code_spec.rb +29 -29
  221. data/spec/cucumber/runtime_spec.rb +35 -34
  222. data/spec/cucumber/step_match_spec.rb +30 -20
  223. data/spec/cucumber/wire_support/configuration_spec.rb +8 -5
  224. data/spec/cucumber/wire_support/connection_spec.rb +12 -8
  225. data/spec/cucumber/wire_support/wire_exception_spec.rb +14 -8
  226. data/spec/cucumber/wire_support/wire_language_spec.rb +8 -9
  227. data/spec/cucumber/wire_support/wire_packet_spec.rb +17 -13
  228. data/spec/cucumber/world/pending_spec.rb +36 -36
  229. data/spec/simplecov_setup.rb +18 -0
  230. data/spec/spec_helper.rb +6 -13
  231. metadata +348 -350
  232. data/.gitattributes +0 -1
  233. data/.ruby-version +0 -1
  234. data/examples/python/README.textile +0 -8
  235. data/examples/python/Rakefile +0 -4
  236. data/examples/python/features/fibonacci.feature +0 -19
  237. data/examples/python/features/step_definitions/fib_steps.py +0 -11
  238. data/examples/python/lib/fib.py +0 -7
  239. data/examples/ramaze/README.textile +0 -7
  240. data/examples/ramaze/app.rb +0 -21
  241. data/examples/ramaze/features/add.feature +0 -11
  242. data/examples/ramaze/features/step_definitions/add_steps.rb +0 -15
  243. data/examples/ramaze/features/support/env.rb +0 -32
  244. data/examples/ramaze/layout/default.html.erb +0 -8
  245. data/examples/ramaze/view/index.html.erb +0 -5
  246. data/examples/ruby2python/README.textile +0 -8
  247. data/examples/ruby2python/Rakefile +0 -4
  248. data/examples/ruby2python/features/fibonacci.feature +0 -19
  249. data/examples/ruby2python/features/step_definitions/fib_steps.rb +0 -7
  250. data/examples/ruby2python/features/support/env.rb +0 -21
  251. data/examples/ruby2python/lib/fib.py +0 -7
  252. data/examples/v8/Rakefile +0 -6
  253. data/examples/v8/features/fibonacci.feature +0 -43
  254. data/examples/v8/features/step_definitions/fib_steps.js +0 -49
  255. data/examples/v8/features/support/env.js +0 -14
  256. data/examples/v8/lib/fibonacci.js +0 -19
  257. data/features/.cucumber/stepdefs.json +0 -627
  258. data/features/assertions.feature +0 -73
  259. data/features/autoformat_profile_output.feature +0 -23
  260. data/features/before_hook.feature +0 -43
  261. data/features/bootstrap.feature +0 -27
  262. data/features/custom_formatter.feature +0 -41
  263. data/features/drb_server_integration.feature +0 -63
  264. data/features/execute_with_tag_filter.feature +0 -63
  265. data/features/formatter_callbacks.feature +0 -189
  266. data/features/json_formatter.feature +0 -338
  267. data/features/parsing.feature +0 -18
  268. data/features/pretty_formatter.feature +0 -31
  269. data/features/rerun_formatter.feature +0 -35
  270. data/features/run_specific_scenarios.feature +0 -47
  271. data/features/stats_formatters.feature +0 -73
  272. data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +0 -197
  273. data/features/step_definitions/cucumber_steps.rb +0 -55
  274. data/features/step_definitions/drb_steps.rb +0 -3
  275. data/features/support/env.rb +0 -57
  276. data/features/tagged_hooks.feature +0 -59
  277. data/fixtures/json/features/background.feature +0 -7
  278. data/fixtures/json/features/embed.feature +0 -4
  279. data/fixtures/json/features/one_passing_one_failing.feature +0 -11
  280. data/fixtures/json/features/step_definitions/steps.rb +0 -32
  281. data/fixtures/json/features/tables.feature +0 -13
  282. data/fixtures/junit/features/one_passing_one_failing.feature +0 -8
  283. data/fixtures/junit/features/pending.feature +0 -7
  284. data/fixtures/junit/features/scenario_outline.feature +0 -9
  285. data/fixtures/junit/features/some_subdirectory/one_passing_one_failing.feature +0 -8
  286. data/fixtures/junit/features/step_definitions/steps.rb +0 -11
  287. data/fixtures/self_test/README.textile +0 -6
  288. data/fixtures/self_test/Rakefile +0 -6
  289. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +0 -7
  290. data/fixtures/self_test/features/failing_expectation.feature +0 -4
  291. data/fixtures/self_test/features/lots_of_undefined.feature +0 -8
  292. data/fixtures/self_test/features/multiline_name.feature +0 -27
  293. data/fixtures/self_test/features/outline_sample.feature +0 -15
  294. data/fixtures/self_test/features/sample.feature +0 -21
  295. data/fixtures/self_test/features/search_sample.feature +0 -32
  296. data/fixtures/self_test/features/step_definitions/sample_steps.rb +0 -84
  297. data/fixtures/self_test/features/support/bubble_256x256.png +0 -0
  298. data/fixtures/self_test/features/support/env.rb +0 -26
  299. data/fixtures/self_test/features/tags_sample.feature +0 -17
  300. data/fixtures/self_test/features/tons_of_cukes.feature +0 -52
  301. data/fixtures/self_test/features/undefined_multiline_args.feature +0 -12
  302. data/fixtures/self_test/list-of-features.txt +0 -1
  303. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +0 -8
  304. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +0 -8
  305. data/fixtures/tickets/Rakefile +0 -20
  306. data/fixtures/tickets/features/172.feature +0 -28
  307. data/fixtures/tickets/features/177/1.feature +0 -28
  308. data/fixtures/tickets/features/177/2.feature +0 -20
  309. data/fixtures/tickets/features/177/3.feature +0 -18
  310. data/fixtures/tickets/features/180.feature +0 -7
  311. data/fixtures/tickets/features/229/tagged_hooks.feature +0 -8
  312. data/fixtures/tickets/features/229/tagged_hooks.rb +0 -14
  313. data/fixtures/tickets/features/236.feature +0 -13
  314. data/fixtures/tickets/features/241.feature +0 -12
  315. data/fixtures/tickets/features/246.feature +0 -4
  316. data/fixtures/tickets/features/248.feature +0 -11
  317. data/fixtures/tickets/features/270/back.feature +0 -14
  318. data/fixtures/tickets/features/270/back.steps.rb +0 -14
  319. data/fixtures/tickets/features/272/hooks.feature +0 -26
  320. data/fixtures/tickets/features/272/hooks_steps.rb +0 -53
  321. data/fixtures/tickets/features/279/py_string_indent.feature +0 -25
  322. data/fixtures/tickets/features/279/py_string_indent.steps.rb +0 -12
  323. data/fixtures/tickets/features/279/wrong.feature_ +0 -11
  324. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +0 -6
  325. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +0 -12
  326. data/fixtures/tickets/features/306/only_background.feature +0 -4
  327. data/fixtures/tickets/features/around_timeout.feature +0 -6
  328. data/fixtures/tickets/features/gherkin_67.feature +0 -12
  329. data/fixtures/tickets/features/gherkin_68.feature +0 -4
  330. data/fixtures/tickets/features/half_manual.feature +0 -11
  331. data/fixtures/tickets/features/lib/eatting_machine.rb +0 -18
  332. data/fixtures/tickets/features/lib/pantry.rb +0 -20
  333. data/fixtures/tickets/features/scenario_outline.feature +0 -95
  334. data/fixtures/tickets/features/step_definitons/246_steps.rb +0 -3
  335. data/fixtures/tickets/features/step_definitons/248_steps.rb +0 -15
  336. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +0 -9
  337. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +0 -11
  338. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +0 -42
  339. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +0 -88
  340. data/fixtures/tickets/features/table_diffing.feature +0 -13
  341. data/fixtures/tickets/features/tickets.feature +0 -28
  342. data/fixtures/tickets/features.html +0 -138
  343. data/gem_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  344. data/gem_tasks/yard/default/layout/html/footer.erb +0 -5
  345. data/gem_tasks/yard/default/layout/html/index.erb +0 -1
  346. data/gem_tasks/yard/default/layout/html/layout.erb +0 -25
  347. data/gem_tasks/yard/default/layout/html/logo.erb +0 -1
  348. data/gem_tasks/yard/default/layout/html/setup.rb +0 -4
  349. data/gem_tasks/yard.rake +0 -40
  350. data/legacy_features/README.md +0 -14
  351. data/legacy_features/announce.feature +0 -152
  352. data/legacy_features/bug_371.feature +0 -32
  353. data/legacy_features/bug_464.feature +0 -16
  354. data/legacy_features/bug_475.feature +0 -42
  355. data/legacy_features/bug_585_tab_indentation.feature +0 -22
  356. data/legacy_features/bug_600.feature +0 -73
  357. data/legacy_features/cucumber_cli.feature +0 -584
  358. data/legacy_features/cucumber_cli_outlines.feature +0 -117
  359. data/legacy_features/default_snippets.feature +0 -43
  360. data/legacy_features/diffing.feature +0 -25
  361. data/legacy_features/drb_server_integration.feature +0 -174
  362. data/legacy_features/exclude_files.feature +0 -20
  363. data/legacy_features/expand.feature +0 -60
  364. data/legacy_features/junit_formatter.feature +0 -214
  365. data/legacy_features/language_from_header.feature +0 -30
  366. data/legacy_features/listener_debugger_formatter.feature +0 -42
  367. data/legacy_features/multiline_names.feature +0 -44
  368. data/legacy_features/report_called_undefined_steps.feature +0 -35
  369. data/legacy_features/rerun_formatter.feature +0 -52
  370. data/legacy_features/simplest.feature +0 -11
  371. data/legacy_features/snippet.feature +0 -23
  372. data/legacy_features/snippets_when_using_star_keyword.feature +0 -38
  373. data/legacy_features/step_definitions/cucumber_steps.rb +0 -179
  374. data/legacy_features/step_definitions/extra_steps.rb +0 -2
  375. data/legacy_features/step_definitions/simplest_steps.rb +0 -3
  376. data/legacy_features/step_definitions/wire_steps.rb +0 -34
  377. data/legacy_features/support/env.rb +0 -161
  378. data/legacy_features/support/env.rb.simplest +0 -7
  379. data/legacy_features/table_mapping.feature +0 -34
  380. data/legacy_features/transform.feature +0 -245
  381. data/legacy_features/unicode_table.feature +0 -35
  382. data/legacy_features/wire_protocol.feature +0 -332
  383. data/lib/README.rdoc +0 -12
  384. data/lib/cucumber/ast/background.rb +0 -116
  385. data/lib/cucumber/ast/comment.rb +0 -31
  386. data/lib/cucumber/ast/doc_string.rb +0 -61
  387. data/lib/cucumber/ast/empty_background.rb +0 -33
  388. data/lib/cucumber/ast/examples.rb +0 -49
  389. data/lib/cucumber/ast/feature.rb +0 -99
  390. data/lib/cucumber/ast/features.rb +0 -38
  391. data/lib/cucumber/ast/has_steps.rb +0 -74
  392. data/lib/cucumber/ast/location.rb +0 -41
  393. data/lib/cucumber/ast/multiline_argument.rb +0 -30
  394. data/lib/cucumber/ast/names.rb +0 -13
  395. data/lib/cucumber/ast/outline_table.rb +0 -194
  396. data/lib/cucumber/ast/scenario.rb +0 -103
  397. data/lib/cucumber/ast/scenario_outline.rb +0 -146
  398. data/lib/cucumber/ast/step.rb +0 -122
  399. data/lib/cucumber/ast/step_collection.rb +0 -92
  400. data/lib/cucumber/ast/step_invocation.rb +0 -196
  401. data/lib/cucumber/ast/tags.rb +0 -28
  402. data/lib/cucumber/ast/tree_walker.rb +0 -191
  403. data/lib/cucumber/ast/visitor.rb +0 -11
  404. data/lib/cucumber/broadcaster.rb +0 -13
  405. data/lib/cucumber/cli/drb_client.rb +0 -43
  406. data/lib/cucumber/feature_file.rb +0 -94
  407. data/lib/cucumber/formatter/ordered_xml_markup.rb +0 -24
  408. data/lib/cucumber/js_support/js_dsl.js +0 -57
  409. data/lib/cucumber/js_support/js_language.rb +0 -185
  410. data/lib/cucumber/js_support/js_snippets.rb +0 -27
  411. data/lib/cucumber/parser/gherkin_builder.rb +0 -284
  412. data/lib/cucumber/parser.rb +0 -2
  413. data/lib/cucumber/py_support/py_dsl.py +0 -10
  414. data/lib/cucumber/py_support/py_language.py +0 -10
  415. data/lib/cucumber/py_support/py_language.rb +0 -80
  416. data/lib/cucumber/runtime/features_loader.rb +0 -62
  417. data/lib/cucumber/runtime/results.rb +0 -64
  418. data/lib/cucumber/step_mother.rb +0 -10
  419. data/spec/cucumber/ast/background_spec.rb +0 -122
  420. data/spec/cucumber/ast/doc_string_spec.rb +0 -40
  421. data/spec/cucumber/ast/feature_factory.rb +0 -72
  422. data/spec/cucumber/ast/feature_spec.rb +0 -63
  423. data/spec/cucumber/ast/features_spec.rb +0 -51
  424. data/spec/cucumber/ast/outline_table_spec.rb +0 -21
  425. data/spec/cucumber/ast/scenario_outline_spec.rb +0 -74
  426. data/spec/cucumber/ast/step_spec.rb +0 -68
  427. data/spec/cucumber/ast/tree_walker_spec.rb +0 -19
  428. data/spec/cucumber/broadcaster_spec.rb +0 -15
  429. data/spec/cucumber/cli/drb_client_spec.rb +0 -76
  430. data/spec/cucumber/rake/rcov_spec.rb +0 -71
  431. data/spec/cucumber/runtime/results_spec.rb +0 -81
  432. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +0 -20
  433. /data/examples/i18n/ar/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  434. /data/examples/i18n/bg/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  435. /data/examples/i18n/ca/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  436. /data/examples/i18n/cs/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  437. /data/examples/i18n/da/features/{step_definitons → step_definitions}/lommeregner_steps.rb +0 -0
  438. /data/examples/i18n/de/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  439. /data/examples/i18n/en/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  440. /data/examples/i18n/eo/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  441. /data/examples/i18n/es/features/{step_definitons → step_definitions}/calculador_steps.rb +0 -0
  442. /data/examples/i18n/fi/features/{step_definitons → step_definitions}/laskin_steps.rb +0 -0
  443. /data/examples/i18n/he/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  444. /data/examples/i18n/hi/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  445. /data/examples/i18n/hu/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  446. /data/examples/i18n/id/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  447. /data/examples/i18n/it/features/{step_definitons → step_definitions}/calcolatrice_steps.rb +0 -0
  448. /data/examples/i18n/ja/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  449. /data/examples/i18n/ko/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  450. /data/examples/i18n/lt/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  451. /data/examples/i18n/lv/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  452. /data/examples/i18n/no/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  453. /data/examples/i18n/pl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  454. /data/examples/i18n/ro/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  455. /data/examples/i18n/ru/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  456. /data/examples/i18n/sk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  457. /data/examples/i18n/sr-Cyrl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  458. /data/examples/i18n/sr-Latn/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  459. /data/examples/i18n/sv/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  460. /data/examples/i18n/tr/features/{step_definitons → step_definitions}/hesap_makinesi_adimlari.rb +0 -0
  461. /data/examples/i18n/uk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  462. /data/examples/i18n/uz/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  463. /data/examples/i18n/zh-TW/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  464. /data/features/{nested_steps_with_second_arg.feature → docs/defining_steps/nested_steps_with_second_arg.feature} +0 -0
  465. /data/features/{iso-8859-1.feature → docs/iso-8859-1.feature} +0 -0
@@ -7,10 +7,7 @@ end
7
7
  require 'optparse'
8
8
  require 'cucumber'
9
9
  require 'logger'
10
- require 'cucumber/parser'
11
- require 'cucumber/feature_file'
12
10
  require 'cucumber/cli/configuration'
13
- require 'cucumber/cli/drb_client'
14
11
 
15
12
  module Cucumber
16
13
  module Cli
@@ -21,21 +18,15 @@ module Cucumber
21
18
  end
22
19
  end
23
20
 
24
- def initialize(args, stdin=STDIN, out=STDOUT, err=STDERR, kernel=Kernel)
25
- raise "args can't be nil" unless args
26
- raise "out can't be nil" unless out
27
- raise "err can't be nil" unless err
28
- raise "kernel can't be nil" unless kernel
21
+ def initialize(args, _=nil, out=STDOUT, err=STDERR, kernel=Kernel)
29
22
  @args = args
30
23
  @out = out
31
24
  @err = err
32
25
  @kernel = kernel
33
- @configuration = nil
34
26
  end
35
27
 
36
28
  def execute!(existing_runtime = nil)
37
29
  trap_interrupt
38
- return @drb_output if run_drb_client
39
30
 
40
31
  runtime = if existing_runtime
41
32
  existing_runtime.configure(configuration)
@@ -45,11 +36,18 @@ module Cucumber
45
36
  end
46
37
 
47
38
  runtime.run!
48
- runtime.write_stepdefs_json
49
- failure = runtime.results.failure? || Cucumber.wants_to_quit
39
+ failure = runtime.failure? || Cucumber.wants_to_quit
50
40
  @kernel.exit(failure ? 1 : 0)
41
+ rescue FileNotFoundException => e
42
+ @err.puts(e.message)
43
+ @err.puts("Couldn't open #{e.path}")
44
+ @kernel.exit(1)
45
+ rescue FeatureFolderNotFoundException => e
46
+ @err.puts(e.message + ". You can use `cucumber --init` to get started.")
47
+ @kernel.exit(1)
51
48
  rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
52
49
  @err.puts(e.message)
50
+ @kernel.exit(1)
53
51
  rescue SystemExit => e
54
52
  @kernel.exit(e.status)
55
53
  rescue Errno::EACCES, Errno::ENOENT => e
@@ -62,25 +60,14 @@ module Cucumber
62
60
  end
63
61
 
64
62
  def configuration
65
- return @configuration if @configuration
66
-
67
- @configuration = Configuration.new(@out, @err)
68
- @configuration.parse!(@args)
69
- Cucumber.logger = @configuration.log
70
- @configuration
63
+ @configuration ||= Configuration.new(@out, @err).tap do |configuration|
64
+ configuration.parse!(@args)
65
+ Cucumber.logger = configuration.log
66
+ end
71
67
  end
72
68
 
73
69
  private
74
70
 
75
- def run_drb_client
76
- return false unless configuration.drb?
77
- warn("Spork is no longer supported as of Cucumber 1.3.0. Please downgrade to version 1.2.5")
78
- @drb_output = DRbClient.run(@args, @err, @out, configuration.drb_port)
79
- true
80
- rescue DRbClientError => e
81
- @err.puts "WARNING: #{e.message} Running features locally:"
82
- end
83
-
84
71
  def trap_interrupt
85
72
  trap('INT') do
86
73
  exit!(1) if Cucumber.wants_to_quit
@@ -1,6 +1,7 @@
1
1
  require 'cucumber/cli/profile_loader'
2
2
  require 'cucumber/formatter/ansicolor'
3
3
  require 'cucumber/rb_support/rb_language'
4
+ require 'cucumber/project_initializer'
4
5
 
5
6
  module Cucumber
6
7
  module Cli
@@ -27,7 +28,7 @@ module Cucumber
27
28
  max = BUILTIN_FORMATS.keys.map{|s| s.length}.max
28
29
  FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
29
30
  " #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
30
- end) + ["Use --format rerun --out features.txt to write out failing",
31
+ end) + ["Use --format rerun --out rerun.txt to write out failing",
31
32
  "features. You can rerun them with cucumber @rerun.txt.",
32
33
  "FORMAT can also be the fully qualified class name of",
33
34
  "your own custom formatter. If the class isn't loaded,",
@@ -38,8 +39,6 @@ module Cucumber
38
39
  "path underneath your features/support directory or anywhere",
39
40
  "on Ruby's LOAD_PATH, for example in a Ruby gem."
40
41
  ]
41
- DRB_FLAG = '--drb'
42
- DRB_OPTIONAL_FLAG = '--[no-]drb'
43
42
  PROFILE_SHORT_FLAG = '-p'
44
43
  NO_PROFILE_SHORT_FLAG = '-P'
45
44
  PROFILE_LONG_FLAG = '--profile'
@@ -47,8 +46,9 @@ module Cucumber
47
46
  OPTIONS_WITH_ARGS = ['-r', '--require', '--i18n', '-f', '--format', '-o', '--out',
48
47
  '-t', '--tags', '-n', '--name', '-e', '--exclude',
49
48
  PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG,
50
- '-a', '--autoformat', '-l', '--lines', '--port',
49
+ '-l', '--lines', '--port',
51
50
  '-I', '--snippet-type']
51
+ ORDER_TYPES = %w{defined random}
52
52
 
53
53
  def self.parse(args, out_stream, error_stream, options = {})
54
54
  new(out_stream, error_stream, options).parse!(args)
@@ -76,43 +76,6 @@ module Cucumber
76
76
  @options[key] = value
77
77
  end
78
78
 
79
- def expanded_args_without_drb
80
- return @expanded_args_without_drb if @expanded_args_without_drb
81
- @expanded_args_without_drb = (
82
- previous_flag_was_profile = false
83
- previous_flag_requires_arg = false
84
-
85
- @expanded_args.reject do |arg|
86
- # ignore profiles
87
- if previous_flag_was_profile
88
- previous_flag_was_profile = false
89
- next true
90
- end
91
- if [PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG].include?(arg)
92
- previous_flag_was_profile = true
93
- next true
94
- end
95
-
96
- # accept all options which requires arguments
97
- # and don't try to look @overridden_paths in it's arguments!
98
- if previous_flag_requires_arg
99
- previous_flag_requires_arg = false
100
- next false
101
- end
102
- if OPTIONS_WITH_ARGS.include?(arg)
103
- previous_flag_requires_arg = true
104
- next false
105
- end
106
-
107
- # ignore --drb flag and overridden features paths
108
- arg == DRB_FLAG || @overridden_paths.include?(arg)
109
- end
110
- )
111
-
112
- @expanded_args_without_drb.push("--no-profile") unless @expanded_args_without_drb.include?(NO_PROFILE_LONG_FLAG) || @expanded_args_without_drb.include?(NO_PROFILE_SHORT_FLAG)
113
- @expanded_args_without_drb
114
- end
115
-
116
79
  def parse!(args)
117
80
  @args = args
118
81
  @expanded_args = @args.dup
@@ -164,6 +127,12 @@ module Cucumber
164
127
  *FORMAT_HELP) do |v|
165
128
  @options[:formats] << [v, @out_stream]
166
129
  end
130
+ opts.on('--init',
131
+ 'Initializes folder structure and generates conventional files for',
132
+ 'a Cucumber project.') do |v|
133
+ ProjectInitializer.new.run
134
+ Kernel.exit(0)
135
+ end
167
136
  opts.on("-o", "--out [FILE|DIR]",
168
137
  "Write output to a file/directory instead of STDOUT. This option",
169
138
  "applies to the previously specified --format, or the",
@@ -220,16 +189,6 @@ module Cucumber
220
189
  "This also omits the loading of your support/env.rb file if it exists.") do
221
190
  @options[:dry_run] = true
222
191
  end
223
- opts.on("-a", "--autoformat DIR",
224
- "Reformats (pretty prints) feature files and write them to DIRECTORY.",
225
- "Be careful if you choose to overwrite the originals.",
226
- "Implies --dry-run --format pretty.") do |directory|
227
- @options[:autoformat] = directory
228
- Cucumber::Term::ANSIColor.coloring = false
229
- @options[:dry_run] = true
230
- @quiet = true
231
- end
232
-
233
192
  opts.on("-m", "--no-multiline",
234
193
  "Don't print multiline strings and tables under steps.") do
235
194
  @options[:no_multiline] = true
@@ -271,14 +230,17 @@ module Cucumber
271
230
  opts.on("-x", "--expand", "Expand Scenario Outline Tables in output.") do
272
231
  @options[:expand] = true
273
232
  end
274
- opts.on(DRB_OPTIONAL_FLAG, "Run features against a DRb server. (i.e. with the spork gem)") do |drb|
275
- @options[:drb] = drb
276
- end
277
- opts.on("--port PORT", "Specify DRb port. Ignored without --drb") do |port|
278
- @options[:drb_port] = port
279
- end
280
- opts.on("--dotcucumber DIR", "Write metadata to DIR") do |dir|
281
- @options[:dotcucumber] = dir
233
+ opts.on("--order TYPE[:SEED]", "Run examples in the specified order. Available types:",
234
+ *<<-TEXT.split("\n")) do |order|
235
+ [defined] Run scenarios in the order they were defined (default).
236
+ [random] Shuffle scenarios before running.
237
+ Specify SEED to reproduce the shuffling from a previous run.
238
+ e.g. --order random:5738
239
+ TEXT
240
+ @options[:order], @options[:seed] = *order.split(":")
241
+ unless ORDER_TYPES.include?(@options[:order])
242
+ fail "'#{@options[:order]}' is not a recognised order type. Please use one of #{ORDER_TYPES.join(", ")}."
243
+ end
282
244
  end
283
245
  opts.on_tail("--version", "Show version.") do
284
246
  @out_stream.puts Cucumber::VERSION
@@ -311,7 +273,7 @@ module Cucumber
311
273
  end
312
274
 
313
275
  def filters
314
- @options.values_at(:name_regexps, :tag_expressions).select{|v| !v.empty?}.first || []
276
+ @options[:filters] ||= []
315
277
  end
316
278
 
317
279
  protected
@@ -60,7 +60,7 @@ Defined profiles in cucumber.yml:
60
60
  require 'erb'
61
61
  require 'yaml'
62
62
  begin
63
- @cucumber_erb = ERB.new(IO.read(cucumber_file)).result(binding)
63
+ @cucumber_erb = ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
64
64
  rescue Exception => e
65
65
  raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
66
66
  end
@@ -14,6 +14,10 @@ module Cucumber
14
14
  @options = default_options.merge(user_options)
15
15
  end
16
16
 
17
+ def randomize?
18
+ @options[:randomize]
19
+ end
20
+
17
21
  def dry_run?
18
22
  @options[:dry_run]
19
23
  end
@@ -33,12 +33,13 @@ module Cucumber
33
33
  end
34
34
 
35
35
  private
36
- def constantize_name(constant, name)
37
- if Cucumber::RUBY_1_8_7
38
- constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
39
- else
40
- constant.const_defined?(name, false) ? constant.const_get(name, false) : constant.const_missing(name)
41
- end
36
+
37
+ def constantize_name(constant, name)
38
+ if constant.const_defined?(name, false)
39
+ constant.const_get(name, false)
40
+ else
41
+ constant.const_missing(name)
42
42
  end
43
+ end
43
44
  end
44
45
  end
@@ -8,35 +8,12 @@ module Cucumber
8
8
  end
9
9
 
10
10
  class Object #:nodoc:
11
- unless defined? instance_exec # 1.9
12
- # http://eigenclass.org/hiki/bounded+space+instance_exec
13
- module InstanceExecHelper #:nodoc:
14
- end
15
- include InstanceExecHelper
16
- def instance_exec(*args, &block)
17
- begin
18
- old_critical, Thread.critical = Thread.critical, true
19
- n = 0
20
- n += 1 while respond_to?(mname="__instance_exec#{n}")
21
- InstanceExecHelper.module_eval{ define_method(mname, &block) }
22
- ensure
23
- Thread.critical = old_critical
24
- end
25
- begin
26
- ret = send(mname, *args)
27
- ensure
28
- InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
29
- end
30
- ret
31
- end
32
- end
33
-
34
11
  # TODO: Move most of this stuff out to an InstanceExecutor class.
35
12
  def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
36
13
  cucumber_run_with_backtrace_filtering(pseudo_method) do
37
14
  if check_arity && !cucumber_compatible_arity?(args, block)
38
15
  instance_exec do
39
- ari = cucumber_arity(block)
16
+ ari = block.arity
40
17
  ari = ari < 0 ? (ari.abs-1).to_s+"+" : ari
41
18
  s1 = ari == 1 ? "" : "s"
42
19
  s2 = args.length == 1 ? "" : "s"
@@ -52,15 +29,11 @@ class Object #:nodoc:
52
29
 
53
30
  private
54
31
 
55
- def cucumber_arity(block)
56
- a = block.arity
57
- Cucumber::RUBY_1_8_7 ? (a == -1 ? 0 : a) : a
58
- end
59
-
60
32
  def cucumber_compatible_arity?(args, block)
61
- ari = cucumber_arity(block)
62
- len = args.length
63
- return true if ari == len or ari < 0 && len >= ari.abs-1
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
64
37
  false
65
38
  end
66
39
 
@@ -74,7 +47,7 @@ class Object #:nodoc:
74
47
  end
75
48
  end
76
49
 
77
- INSTANCE_EXEC_OFFSET = (Cucumber::RUBY_2_0 || Cucumber::RUBY_1_9 || Cucumber::RUBY_1_8_7 || Cucumber::JRUBY) ? -3 : -4
50
+ INSTANCE_EXEC_OFFSET = -3
78
51
 
79
52
  def replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
80
53
  return if Cucumber.use_full_backtrace
@@ -82,11 +55,7 @@ class Object #:nodoc:
82
55
  instance_exec_pos = backtrace.index(instance_exec_invocation_line)
83
56
  if instance_exec_pos
84
57
  replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
85
- if Cucumber::RUBY_1_8_7
86
- backtrace[replacement_line] += ":in `#{pseudo_method}'" if pseudo_method
87
- else
88
- backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
89
- end
58
+ backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
90
59
 
91
60
  depth = backtrace.count { |line| line == instance_exec_invocation_line }
92
61
  end_pos = depth > 1 ? instance_exec_pos : -1
@@ -17,7 +17,7 @@ class Proc #:nodoc:
17
17
  path, line = *to_s.match(PROC_PATTERN)[1..2]
18
18
  path = File.expand_path(path)
19
19
  pwd = File.expand_path(PWD)
20
- pwd.force_encoding(path.encoding) unless Cucumber::RUBY_1_8_7
20
+ pwd.force_encoding(path.encoding)
21
21
  if path.index(pwd)
22
22
  path = path[pwd.length+1..-1]
23
23
  elsif path =~ /.*\/gems\/(.*\.rb)$/
@@ -0,0 +1,5 @@
1
+ # See https://github.com/cucumber/cucumber/issues/693
2
+ if defined? Encoding
3
+ Encoding.default_external = 'utf-8'
4
+ Encoding.default_internal = 'utf-8'
5
+ end
@@ -1,24 +1,35 @@
1
+ require 'cucumber/core/test/result'
2
+
1
3
  module Cucumber
2
4
  # Raised when there is no matching StepDefinition for a step.
3
- class Undefined < StandardError
4
- attr_reader :step_name
5
+ class Undefined < Core::Test::Result::Undefined
6
+ def self.from(result, step_name)
7
+ if result.is_a?(self)
8
+ return result.with_message(with_prefix(result.message))
9
+ end
5
10
 
6
- def initialize(step_name)
7
- super %{Undefined step: "#{step_name}"}
8
- @step_name = step_name
11
+ begin
12
+ raise self.new(with_prefix(step_name))
13
+ rescue => exception
14
+ return exception
15
+ end
9
16
  end
10
17
 
11
- def nested!
12
- @nested = true
18
+ def self.with_prefix(step_name)
19
+ %(Undefined step: "#{step_name}")
13
20
  end
21
+ end
14
22
 
15
- def nested?
16
- @nested
23
+ # Raised when there is no matching StepDefinition for a step called
24
+ # from within another step definition.
25
+ class UndefinedDynamicStep < StandardError
26
+ def initialize(step_name)
27
+ super %(Undefined dynamic step: "#{step_name}")
17
28
  end
18
29
  end
19
30
 
20
31
  # Raised when a StepDefinition's block invokes World#pending
21
- class Pending < StandardError
32
+ class Pending < Core::Test::Result::Pending
22
33
  end
23
34
 
24
35
  # Raised when a step matches 2 or more StepDefinitions
@@ -0,0 +1,37 @@
1
+ require 'cucumber'
2
+ require 'cucumber/core/ast/location'
3
+
4
+ module Cucumber
5
+ class FileSpecs
6
+ FILE_COLON_LINE_PATTERN = /^([\w\W]*?)(?::([\d:]+))?$/ #:nodoc:
7
+
8
+ def initialize(file_specs)
9
+ Cucumber.logger.debug("Features:\n")
10
+ @file_specs = file_specs.map { |s| FileSpec.new(s) }
11
+ Cucumber.logger.debug("\n")
12
+ end
13
+
14
+ def locations
15
+ @file_specs.map(&:locations).flatten
16
+ end
17
+
18
+ def files
19
+ @file_specs.map(&:file).uniq
20
+ end
21
+
22
+ class FileSpec
23
+ def initialize(s)
24
+ @file, @lines = *FILE_COLON_LINE_PATTERN.match(s).captures
25
+ Cucumber.logger.debug(" * #{@file}\n")
26
+ @lines = String(@lines).split(':').map { |line| Integer(line) }
27
+ end
28
+
29
+ attr_reader :file
30
+
31
+ def locations
32
+ return [ Core::Ast::Location.new(@file) ] if @lines.empty?
33
+ @lines.map { |line| Core::Ast::Location.new(@file, line) }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ require 'cucumber/core/filter'
2
+
3
+ module Cucumber
4
+ module Filters
5
+ class ActivateSteps < Core::Filter.new(:step_definitions)
6
+
7
+ def test_case(test_case)
8
+ CaseFilter.new(test_case, step_definitions).test_case.describe_to receiver
9
+ end
10
+
11
+ class CaseFilter
12
+ def initialize(test_case, step_definitions)
13
+ @original_test_case = test_case
14
+ @step_definitions = step_definitions
15
+ end
16
+
17
+ def test_case
18
+ @original_test_case.with_steps(new_test_steps)
19
+ end
20
+
21
+ private
22
+
23
+ def new_test_steps
24
+ @original_test_case.test_steps.map(&self.method(:attempt_to_activate))
25
+ end
26
+
27
+ def attempt_to_activate(test_step)
28
+ @step_definitions.find_match(test_step).activate(test_step)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ module Cucumber
2
+ module Filters
3
+ class ApplyAfterHooks < Core::Filter.new(:hooks)
4
+ def test_case(test_case)
5
+ hooks.apply_after_hooks(test_case).describe_to(receiver)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ require 'cucumber/core/filter'
2
+
3
+ module Cucumber
4
+ module Filters
5
+ class ApplyAfterStepHooks < Core::Filter.new(:hooks)
6
+ def test_case(test_case)
7
+ test_steps = hooks.find_after_step_hooks(test_case).apply(test_case.test_steps)
8
+ test_case.with_steps(test_steps).describe_to(receiver)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'cucumber/core/filter'
2
+
3
+ module Cucumber
4
+ module Filters
5
+ class ApplyAroundHooks < Core::Filter.new(:hooks)
6
+ def test_case(test_case)
7
+ around_hooks = hooks.find_around_hooks(test_case)
8
+ test_case.with_around_hooks(around_hooks).describe_to(receiver)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Cucumber
2
+ module Filters
3
+ class ApplyBeforeHooks < Core::Filter.new(:hooks)
4
+ def test_case(test_case)
5
+ hooks.apply_before_hooks(test_case).describe_to(receiver)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,25 @@
1
+ module Cucumber
2
+ module Filters
3
+
4
+ class GatedReceiver
5
+ def initialize(receiver)
6
+ @receiver = receiver
7
+ @test_cases = []
8
+ end
9
+
10
+ def test_case(test_case)
11
+ @test_cases << test_case
12
+ self
13
+ end
14
+
15
+ def done
16
+ @test_cases.map do |test_case|
17
+ test_case.describe_to(@receiver)
18
+ end
19
+ @receiver.done
20
+ self
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,45 @@
1
+ require 'cucumber/core/filter'
2
+ require 'cucumber/running_test_case'
3
+ require 'cucumber/hooks'
4
+
5
+ module Cucumber
6
+ module Filters
7
+
8
+ class PrepareWorld < Core::Filter.new(:runtime)
9
+
10
+ def test_case(test_case)
11
+ CaseFilter.new(runtime, test_case).test_case.describe_to receiver
12
+ end
13
+
14
+ class CaseFilter
15
+ def initialize(runtime, original_test_case)
16
+ @runtime, @original_test_case = runtime, original_test_case
17
+ end
18
+
19
+ def test_case
20
+ init_scenario = Cucumber::Hooks.around_hook(@original_test_case.source) do |continue|
21
+ @runtime.begin_scenario(scenario)
22
+ continue.call
23
+ @runtime.end_scenario(scenario)
24
+ end
25
+ around_hooks = [init_scenario] + @original_test_case.around_hooks
26
+
27
+ default_hook = Cucumber::Hooks.before_hook(@original_test_case.source) do
28
+ #no op - legacy format adapter expects a before hooks
29
+ end
30
+ steps = [default_hook] + @original_test_case.test_steps
31
+
32
+ @original_test_case.with_around_hooks(around_hooks).with_steps(steps)
33
+ end
34
+
35
+ private
36
+
37
+ def scenario
38
+ @scenario ||= RunningTestCase.new(test_case)
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ module Cucumber
2
+ module Filters
3
+
4
+ class Quit
5
+ def initialize(receiver=nil)
6
+ @receiver = receiver
7
+ end
8
+
9
+ def test_case(test_case)
10
+ unless Cucumber.wants_to_quit
11
+ test_case.describe_to @receiver
12
+ end
13
+ self
14
+ end
15
+
16
+ def done
17
+ @receiver.done
18
+ self
19
+ end
20
+
21
+ def with_receiver(receiver)
22
+ self.class.new(receiver)
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+
@@ -0,0 +1,40 @@
1
+ module Cucumber
2
+ module Filters
3
+
4
+ # Batches up all test cases, randomizes them, and then sends them on
5
+ class Randomizer
6
+ def initialize(seed, receiver=nil)
7
+ @receiver = receiver
8
+ @test_cases = []
9
+ @seed = seed
10
+ end
11
+
12
+ def test_case(test_case)
13
+ @test_cases << test_case
14
+ self
15
+ end
16
+
17
+ def done
18
+ shuffled_test_cases.each do |test_case|
19
+ test_case.describe_to(@receiver)
20
+ end
21
+ @receiver.done
22
+ self
23
+ end
24
+
25
+ def with_receiver(receiver)
26
+ self.class.new(@seed, receiver)
27
+ end
28
+
29
+ private
30
+
31
+ def shuffled_test_cases
32
+ @test_cases.shuffle(random: Random.new(seed))
33
+ end
34
+
35
+ attr_reader :seed
36
+ private :seed
37
+ end
38
+
39
+ end
40
+ end