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
@@ -2,11 +2,8 @@
2
2
  # Tips for improvement - esp. ruby 1.9: http://www.ruby-forum.com/topic/184730
3
3
  require 'cucumber/platform'
4
4
  require 'cucumber/formatter/ansicolor'
5
- $KCODE='u' if Cucumber::RUBY_1_8_7
6
5
 
7
6
  if Cucumber::WINDOWS
8
- require 'iconv' if Cucumber::RUBY_1_8_7
9
-
10
7
  if ENV['CUCUMBER_OUTPUT_ENCODING']
11
8
  Cucumber::CODEPAGE = ENV['CUCUMBER_OUTPUT_ENCODING']
12
9
  elsif `cmd /c chcp` =~ /(\d+)/
@@ -22,27 +19,17 @@ if Cucumber::WINDOWS
22
19
  end
23
20
 
24
21
  module Cucumber
25
- module WindowsOutput #:nodoc:
22
+ # @private
23
+ module WindowsOutput
26
24
  def self.extended(o)
27
25
  o.instance_eval do
26
+
28
27
  def cucumber_preprocess_output(*a)
29
- if Cucumber::RUBY_1_8_7
30
- begin
31
- Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a.map{|a|a.to_s})
32
- rescue Iconv::InvalidEncoding => e
33
- STDERR.cucumber_puts("WARNING: #{e.message}")
34
- a
35
- rescue Iconv::IllegalSequence => e
36
- STDERR.cucumber_puts("WARNING: #{e.message}")
37
- a
38
- end
39
- else
40
- begin
41
- a.map{|arg| arg.to_s.encode(Encoding.default_external)}
42
- rescue Encoding::UndefinedConversionError => e
43
- STDERR.cucumber_puts("WARNING: #{e.message}")
44
- a
45
- end
28
+ begin
29
+ a.map{|arg| arg.to_s.encode(Encoding.default_external)}
30
+ rescue Encoding::UndefinedConversionError => e
31
+ STDERR.cucumber_puts("WARNING: #{e.message}")
32
+ a
46
33
  end
47
34
  end
48
35
 
@@ -114,13 +114,19 @@ module Cucumber
114
114
  key.status = :skipped
115
115
  key.mean_duration = 0
116
116
  else
117
- key.status = Ast::StepInvocation.worst_status(steps.map{|step| step[:status]})
117
+ key.status = worst_status(steps.map{ |step| step[:status] })
118
118
  total_duration = steps.inject(0) {|sum, step| step[:duration] + sum}
119
119
  key.mean_duration = total_duration / steps.length
120
120
  end
121
121
  end
122
122
  end
123
123
 
124
+ def worst_status(statuses)
125
+ [:passed, :undefined, :pending, :skipped, :failed].find do |status|
126
+ statuses.include?(status)
127
+ end
128
+ end
129
+
124
130
  def add_unused_stepdefs
125
131
  @runtime.unmatched_step_definitions.each do |step_definition|
126
132
  stepdef_key = StepDefKey.new(step_definition.regexp_source, step_definition.file_colon_line)
@@ -0,0 +1,97 @@
1
+ require 'cucumber/core/test/around_hook'
2
+
3
+ module Cucumber
4
+
5
+ # Hooks quack enough like `Cucumber::Core::Ast` source nodes that we can use them as
6
+ # source for test steps
7
+ module Hooks
8
+
9
+ class << self
10
+ def before_hook(source, &block)
11
+ build_hook_step(source, block, BeforeHook, Core::Test::UnskippableAction)
12
+ end
13
+
14
+ def after_hook(source, &block)
15
+ build_hook_step(source, block, AfterHook, Core::Test::UnskippableAction)
16
+ end
17
+
18
+ def after_step_hook(source, &block)
19
+ raise ArgumentError unless source.last.kind_of?(Core::Ast::Step)
20
+ build_hook_step(source, block, AfterStepHook, Core::Test::Action)
21
+ end
22
+
23
+ def around_hook(source, &block)
24
+ Core::Test::AroundHook.new(&block)
25
+ end
26
+
27
+ private
28
+
29
+ def build_hook_step(source, block, hook_type, action_type)
30
+ action = action_type.new(&block)
31
+ hook = hook_type.new(action.location)
32
+ Core::Test::Step.new(source + [hook], action)
33
+ end
34
+ end
35
+
36
+ class AfterHook
37
+ attr_reader :location
38
+
39
+ def initialize(location)
40
+ @location = location
41
+ end
42
+
43
+ def name
44
+ "After hook"
45
+ end
46
+
47
+ def match_locations?(queried_locations)
48
+ queried_locations.any? { |other_location| other_location.match?(location) }
49
+ end
50
+
51
+ def describe_to(visitor, *args)
52
+ visitor.after_hook(self, *args)
53
+ end
54
+ end
55
+
56
+ class BeforeHook
57
+ attr_reader :location
58
+
59
+ def initialize(location)
60
+ @location = location
61
+ end
62
+
63
+ def name
64
+ "Before hook"
65
+ end
66
+
67
+ def match_locations?(queried_locations)
68
+ queried_locations.any? { |other_location| other_location.match?(location) }
69
+ end
70
+
71
+ def describe_to(visitor, *args)
72
+ visitor.before_hook(self, *args)
73
+ end
74
+ end
75
+
76
+ class AfterStepHook
77
+ attr_reader :location
78
+
79
+ def initialize(location)
80
+ @location = location
81
+ end
82
+
83
+ def name
84
+ "AfterStep hook"
85
+ end
86
+
87
+ def match_locations?(queried_locations)
88
+ queried_locations.any? { |other_location| other_location.match?(location) }
89
+ end
90
+
91
+ def describe_to(visitor, *args)
92
+ visitor.after_step_hook(self, *args)
93
+ end
94
+ end
95
+
96
+ end
97
+ end
@@ -4,21 +4,6 @@ require 'cucumber/step_definition_light'
4
4
  module Cucumber
5
5
  module LanguageSupport
6
6
  module LanguageMethods
7
- def around(scenario)
8
- execute_around(scenario) do
9
- yield
10
- end
11
- end
12
-
13
- def before(scenario)
14
- begin_scenario(scenario)
15
- execute_before(scenario)
16
- end
17
-
18
- def after(scenario)
19
- execute_after(scenario)
20
- end_scenario
21
- end
22
7
 
23
8
  def after_configuration(configuration)
24
9
  hooks[:after_configuration].each do |hook|
@@ -26,12 +11,6 @@ module Cucumber
26
11
  end
27
12
  end
28
13
 
29
- def execute_after_step(scenario)
30
- hooks_for(:after_step, scenario).each do |hook|
31
- invoke(hook, 'AfterStep', scenario, false)
32
- end
33
- end
34
-
35
14
  def execute_transforms(args)
36
15
  args.map do |arg|
37
16
  matching_transform = transforms.detect {|transform| transform.match(arg) }
@@ -87,39 +66,6 @@ module Cucumber
87
66
  @transforms ||= []
88
67
  end
89
68
 
90
- def execute_around(scenario, &block)
91
- hooks_for(:around, scenario).reverse.inject(block) do |blk, hook|
92
- proc do
93
- invoke(hook, 'Around', scenario, true) do
94
- blk.call(scenario)
95
- end
96
- end
97
- end.call
98
- end
99
-
100
- def execute_before(scenario)
101
- hooks_for(:before, scenario).each do |hook|
102
- invoke(hook, 'Before', scenario, true)
103
- end
104
- end
105
-
106
- def execute_after(scenario)
107
- hooks_for(:after, scenario).reverse_each do |hook|
108
- invoke(hook, 'After', scenario, true)
109
- end
110
- end
111
-
112
- def invoke(hook, location, scenario, exception_fails_scenario, &block)
113
- begin
114
- hook.invoke(location, scenario, &block)
115
- rescue Exception => exception
116
- if exception_fails_scenario
117
- scenario.fail!(exception)
118
- else
119
- raise
120
- end
121
- end
122
- end
123
69
  end
124
70
  end
125
71
  end
@@ -1,9 +1,9 @@
1
- require 'gherkin/rubify'
2
- require 'gherkin/lexer/i18n_lexer'
1
+ require 'forwardable'
3
2
  require 'gherkin/formatter/escaping'
3
+ require 'cucumber/core/ast/describes_itself'
4
4
 
5
5
  module Cucumber
6
- module Ast
6
+ module MultilineArgument
7
7
  # Step Definitions that match a plain text Step with a multiline argument table
8
8
  # will receive it as an instance of Table. A Table object holds the data of a
9
9
  # table parsed from a feature file and lets you access and manipulate the data
@@ -23,13 +23,10 @@ module Cucumber
23
23
  #
24
24
  # This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
25
25
  #
26
- class Table
26
+ class DataTable
27
27
  class Different < StandardError
28
- attr_reader :table
29
-
30
28
  def initialize(table)
31
- super('Tables were not identical')
32
- @table = table
29
+ super("Tables were not identical:\n#{table}")
33
30
  end
34
31
  end
35
32
 
@@ -49,38 +46,62 @@ module Cucumber
49
46
  end
50
47
 
51
48
  include Enumerable
52
- include Gherkin::Rubify
49
+ include Core::Ast::DescribesItself
50
+ extend Forwardable
53
51
 
54
52
  NULL_CONVERSIONS = Hash.new({ :strict => false, :proc => lambda{ |cell_value| cell_value } }).freeze
55
53
 
56
54
  attr_accessor :file
55
+ def_delegator :@ast_table, :location
57
56
 
58
57
  def self.default_arg_name #:nodoc:
59
58
  "table"
60
59
  end
61
60
 
62
- def self.parse(text, uri, offset)
63
- builder = Builder.new
64
- lexer = Gherkin::Lexer::I18nLexer.new(builder)
65
- lexer.scan(text)
66
- new(builder.rows)
61
+ class << self
62
+ def from(data, location = Core::Ast::Location.of_caller)
63
+ case data
64
+ when Array
65
+ from_array(data, location)
66
+ when String
67
+ parse(data, location)
68
+ else
69
+ raise ArgumentError, "expected data to be a String or an Array."
70
+ end
71
+ end
72
+
73
+ private
74
+ def parse(text, location = Core::Ast::Location.of_caller)
75
+ builder = Builder.new
76
+ lexer = Gherkin::Lexer::I18nLexer.new(builder)
77
+ lexer.scan(text)
78
+ from_array(builder.rows, location)
79
+ end
80
+
81
+ def from_array(data, location = Core::Ast::Location.of_caller)
82
+ new Core::Ast::DataTable.new(data, location)
83
+ end
67
84
  end
68
85
 
69
- # Creates a new instance. +raw+ should be an Array of Array of String
70
- # or an Array of Hash (similar to what #hashes returns).
71
- # You don't typically create your own Table objects - Cucumber will do
72
- # it internally and pass them to your Step Definitions.
73
- #
74
- def initialize(raw, conversion_procs = NULL_CONVERSIONS.dup, header_mappings = {}, header_conversion_proc = nil)
75
- @cells_class = Cells
76
- @cell_class = Cell
77
- raw = ensure_array_of_array(rubify(raw))
86
+
87
+ # @param data [Core::Ast::DataTable] the data for the table
88
+ # @param conversion_procs [Hash] see map_columns!
89
+ # @param header_mappings [Hash] see map_headers!
90
+ # @param header_conversion_proc [Proc] see map_headers!
91
+ def initialize(data, conversion_procs = NULL_CONVERSIONS.dup, header_mappings = {}, header_conversion_proc = nil)
92
+ raise ArgumentError, "data must be a Core::Ast::DataTable" unless data.kind_of? Core::Ast::DataTable
93
+ ast_table = data
78
94
  # Verify that it's square
79
- raw.transpose
80
- create_cell_matrix(raw)
95
+ ast_table.transpose
96
+ @cell_matrix = create_cell_matrix(ast_table)
81
97
  @conversion_procs = conversion_procs
82
98
  @header_mappings = header_mappings
83
99
  @header_conversion_proc = header_conversion_proc
100
+ @ast_table = ast_table
101
+ end
102
+
103
+ def append_to(array)
104
+ array << self
84
105
  end
85
106
 
86
107
  def to_step_definition_arg
@@ -91,7 +112,7 @@ module Cucumber
91
112
  # registered with #map_column! and #map_headers!.
92
113
  #
93
114
  def dup
94
- self.class.new(raw.dup, @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
115
+ self.class.new(Core::Ast::DataTable.new(raw, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
95
116
  end
96
117
 
97
118
  # Returns a new, transposed table. Example:
@@ -106,7 +127,7 @@ module Cucumber
106
127
  # | 4 | 2 |
107
128
  #
108
129
  def transpose
109
- self.class.new(raw.transpose, @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
130
+ self.class.new(Core::Ast::DataTable.new(raw.transpose, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
110
131
  end
111
132
 
112
133
  # Converts this table into an Array of Hash where the keys of each
@@ -177,14 +198,6 @@ module Cucumber
177
198
  cells_rows.each(&proc)
178
199
  end
179
200
 
180
- def accept(visitor) #:nodoc:
181
- return if Cucumber.wants_to_quit
182
- cells_rows.each do |row|
183
- visitor.visit_table_row(row)
184
- end
185
- nil
186
- end
187
-
188
201
  # Matches +pattern+ against the header row of the table.
189
202
  # This is used especially for argument transforms.
190
203
  #
@@ -200,11 +213,6 @@ module Cucumber
200
213
  pattern.match(header_to_match)
201
214
  end
202
215
 
203
- # For testing only
204
- def to_sexp #:nodoc:
205
- [:table, *cells_rows.map{|row| row.to_sexp}]
206
- end
207
-
208
216
  # Redefines the table headers. This makes it possible to use
209
217
  # prettier and more flexible header names in the features. The
210
218
  # keys of +mappings+ are Strings or regular expressions
@@ -246,7 +254,7 @@ module Cucumber
246
254
 
247
255
  # Returns a new Table where the headers are redefined. See #map_headers!
248
256
  def map_headers(mappings={}, &block)
249
- self.class.new raw.dup, @conversion_procs.dup, mappings, block
257
+ self.class.new(Core::Ast::DataTable.new(raw, location), @conversion_procs.dup, mappings, block)
250
258
  end
251
259
 
252
260
  # Change how #hashes converts column values. The +column_name+ argument identifies the column
@@ -271,7 +279,7 @@ module Cucumber
271
279
  def map_column(column_name, strict=true, &conversion_proc)
272
280
  conversion_procs = @conversion_procs.dup
273
281
  conversion_procs[column_name.to_s] = { :strict => strict, :proc => conversion_proc }
274
- self.class.new(raw.dup, conversion_procs, @header_mappings.dup, @header_conversion_proc)
282
+ self.class.new(Core::Ast::DataTable.new(raw, location), conversion_procs, @header_mappings.dup, @header_conversion_proc)
275
283
  end
276
284
 
277
285
  # Compares +other_table+ to self. If +other_table+ contains columns
@@ -409,28 +417,13 @@ module Cucumber
409
417
  raise %{The table must have exactly #{width} columns} unless raw[0].size == width
410
418
  end
411
419
 
412
- def arguments_replaced(arguments) #:nodoc:
413
- raw_with_replaced_args = raw.map do |row|
414
- row.map do |cell|
415
- cell_with_replaced_args = cell
416
- arguments.each do |name, value|
417
- if cell_with_replaced_args && cell_with_replaced_args.include?(name)
418
- cell_with_replaced_args = value ? cell_with_replaced_args.gsub(name, value) : nil
419
- end
420
- end
421
- cell_with_replaced_args
422
- end
423
- end
424
- Table.new(raw_with_replaced_args)
425
- end
426
-
427
420
  def has_text?(text) #:nodoc:
428
421
  raw.flatten.compact.detect{|cell_value| cell_value.index(text)}
429
422
  end
430
423
 
431
424
  def cells_rows #:nodoc:
432
425
  @rows ||= cell_matrix.map do |cell_row|
433
- @cells_class.new(self, cell_row)
426
+ Cells.new(self, cell_row)
434
427
  end
435
428
  end
436
429
 
@@ -451,7 +444,9 @@ module Cucumber
451
444
  end
452
445
 
453
446
  def to_s(options = {}) #:nodoc:
447
+ # TODO: factor out this code so we don't depend on such a big lump of old cruft
454
448
  require 'cucumber/formatter/pretty'
449
+ require 'cucumber/formatter/legacy_api/adapter'
455
450
  options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
456
451
  io = StringIO.new
457
452
 
@@ -459,14 +454,27 @@ module Cucumber
459
454
  Cucumber::Term::ANSIColor.coloring = options[:color]
460
455
  formatter = Formatter::Pretty.new(nil, io, options)
461
456
  formatter.instance_variable_set('@indent', options[:indent])
462
- TreeWalker.new(nil, [formatter]).visit_multiline_arg(self)
463
-
457
+ Formatter::LegacyApi::Ast::MultilineArg.for(self).accept(Formatter::Fanout.new([formatter]))
464
458
  Cucumber::Term::ANSIColor.coloring = c
465
459
  io.rewind
466
460
  s = "\n" + io.read + (" " * (options[:indent] - 2))
467
461
  s
468
462
  end
469
463
 
464
+ def description_for_visitors
465
+ :legacy_table
466
+ end
467
+
468
+ def columns #:nodoc:
469
+ @columns ||= cell_matrix.transpose.map do |cell_row|
470
+ Cells.new(self, cell_row)
471
+ end
472
+ end
473
+
474
+ def to_json(*args)
475
+ raw.to_json(*args)
476
+ end
477
+
470
478
  private
471
479
 
472
480
  TO_S_PREFIXES = Hash.new(' ')
@@ -493,11 +501,11 @@ module Cucumber
493
501
  end
494
502
  end
495
503
 
496
- def create_cell_matrix(raw) #:nodoc:
497
- @cell_matrix = raw.map do |raw_row|
504
+ def create_cell_matrix(ast_table) #:nodoc:
505
+ ast_table.raw.map do |raw_row|
498
506
  line = raw_row.line rescue -1
499
507
  raw_row.map do |raw_cell|
500
- new_cell(raw_cell, line)
508
+ Cell.new(raw_cell, self, line)
501
509
  end
502
510
  end
503
511
  end
@@ -548,16 +556,6 @@ module Cucumber
548
556
  @hashes = @rows_hash = @col_names = @rows = @columns = nil
549
557
  end
550
558
 
551
- def columns #:nodoc:
552
- @columns ||= cell_matrix.transpose.map do |cell_row|
553
- @cells_class.new(self, cell_row)
554
- end
555
- end
556
-
557
- def new_cell(raw_cell, line) #:nodoc:
558
- @cell_class.new(raw_cell, self, line)
559
- end
560
-
561
559
  # Pads our own cell_matrix and returns a cell matrix of same
562
560
  # column width that can be used for diffing
563
561
  def pad!(other_cell_matrix) #:nodoc:
@@ -599,8 +597,8 @@ module Cucumber
599
597
  end
600
598
 
601
599
  def ensure_table(table_or_array) #:nodoc:
602
- return table_or_array if Table === table_or_array
603
- Table.new(table_or_array)
600
+ return table_or_array if DataTable === table_or_array
601
+ DataTable.from(table_or_array)
604
602
  end
605
603
 
606
604
  def ensure_array_of_array(array)
@@ -670,6 +668,10 @@ module Cucumber
670
668
  "row_#{line}"
671
669
  end
672
670
 
671
+ def each(&proc)
672
+ @cells.each(&proc)
673
+ end
674
+
673
675
  private
674
676
 
675
677
  def index
@@ -679,10 +681,6 @@ module Cucumber
679
681
  def width
680
682
  map{|cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0}.max
681
683
  end
682
-
683
- def each(&proc)
684
- @cells.each(&proc)
685
- end
686
684
  end
687
685
 
688
686
  class Cell #:nodoc:
@@ -693,11 +691,6 @@ module Cucumber
693
691
  @value, @table, @line = value, table, line
694
692
  end
695
693
 
696
- def accept(visitor)
697
- return if Cucumber.wants_to_quit
698
- visitor.visit_table_cell_value(value, status)
699
- end
700
-
701
694
  def inspect!
702
695
  @value = "(i) #{value.inspect}"
703
696
  end
@@ -0,0 +1,10 @@
1
+ module Cucumber
2
+ module MultilineArgument
3
+ class DocString < SimpleDelegator
4
+ def append_to(array)
5
+ array << self
6
+ end
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,74 @@
1
+ require 'delegate'
2
+ require 'cucumber/multiline_argument/data_table'
3
+ require 'cucumber/multiline_argument/doc_string'
4
+ require 'gherkin/rubify'
5
+
6
+ module Cucumber
7
+ module MultilineArgument
8
+ extend Gherkin::Rubify
9
+
10
+ class << self
11
+ def from_core(node)
12
+ builder.wrap(node)
13
+ end
14
+
15
+ def from(argument, location=nil)
16
+ location ||= Core::Ast::Location.of_caller
17
+ argument = rubify(argument)
18
+ case argument
19
+ when String
20
+ doc_string(argument, 'text/plain', location)
21
+ when Array
22
+ location = location.on_line(argument.first.line..argument.last.line)
23
+ data_table(argument.map{ |row| row.cells }, location)
24
+ when DataTable, DocString, None
25
+ argument
26
+ when nil
27
+ None.new
28
+ else
29
+ raise ArgumentError, "Don't know how to convert #{argument.class} #{argument.inspect} into a MultilineArgument"
30
+ end
31
+ end
32
+
33
+ def doc_string(argument, content_type, location)
34
+ builder.doc_string(Core::Ast::DocString.new(argument, content_type, location))
35
+ end
36
+
37
+ def data_table(data, location)
38
+ builder.data_table(Core::Ast::DataTable.new(data, location))
39
+ end
40
+
41
+ private
42
+
43
+ def builder
44
+ @builder ||= Builder.new
45
+ end
46
+
47
+ class Builder
48
+ def wrap(node)
49
+ @result = None.new
50
+ node.describe_to(self)
51
+ @result
52
+ end
53
+
54
+ def doc_string(node, *args)
55
+ @result = DocString.new(node)
56
+ end
57
+
58
+ def data_table(node, *args)
59
+ @result = DataTable.new(node)
60
+ end
61
+ end
62
+ end
63
+
64
+ class None
65
+ def append_to(array)
66
+ end
67
+
68
+ def describe_to(visitor)
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ require 'cucumber/ast'
@@ -3,28 +3,29 @@
3
3
  require 'rbconfig'
4
4
 
5
5
  module Cucumber
6
- unless defined?(Cucumber::VERSION)
7
- VERSION = '1.3.10'
8
- BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
9
- LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
10
- JRUBY = defined?(JRUBY_VERSION)
11
- IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
12
- WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
13
- OS_X = RbConfig::CONFIG['host_os'] =~ /darwin/
14
- WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
15
- RAILS = defined?(Rails)
16
- RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
17
- RUBY_2_0 = RUBY_VERSION =~ /^2\.0/
18
- RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
19
- RUBY_1_8_7 = RUBY_VERSION =~ /^1\.8\.7/
6
+ unless defined?(Cucumber::VERSION)
7
+ VERSION = '2.0.0'
8
+ BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
9
+ LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
10
+ JRUBY = defined?(JRUBY_VERSION)
11
+ WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
12
+ OS_X = RbConfig::CONFIG['host_os'] =~ /darwin/
13
+ WINDOWS_MRI = WINDOWS && !JRUBY
14
+ RAILS = defined?(Rails)
15
+ RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
16
+ RUBY_2_2 = RUBY_VERSION =~ /^2\.2/
17
+ RUBY_2_1 = RUBY_VERSION =~ /^2\.1/
18
+ RUBY_2_0 = RUBY_VERSION =~ /^2\.0/
19
+ RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
20
20
 
21
- class << self
22
- attr_accessor :use_full_backtrace
21
+ class << self
22
+ attr_accessor :use_full_backtrace
23
23
 
24
- def file_mode(m, encoding="UTF-8") #:nodoc:
25
- RUBY_1_8_7 ? m : "#{m}:#{encoding}"
24
+ # @private
25
+ def file_mode(m, encoding="UTF-8")
26
+ "#{m}:#{encoding}"
27
+ end
26
28
  end
29
+ self.use_full_backtrace = false
27
30
  end
28
- self.use_full_backtrace = false
29
- end
30
31
  end