cucumber 2.99.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. checksums.yaml +4 -4
  2. data/.cucumberproignore +6 -0
  3. data/.gitattributes +32 -0
  4. data/.github/ISSUE_TEMPLATE.md +1 -1
  5. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  6. data/.rubocop.yml +13 -0
  7. data/.rubocop_todo.yml +991 -0
  8. data/.travis.yml +56 -10
  9. data/{History.md → CHANGELOG.md} +166 -32
  10. data/CONTRIBUTING.md +21 -1
  11. data/Gemfile +18 -5
  12. data/README.md +13 -4
  13. data/Rakefile +12 -2
  14. data/appveyor.yml +27 -0
  15. data/bin/cucumber +2 -1
  16. data/cucumber.gemspec +15 -10
  17. data/cucumber.yml +10 -11
  18. data/examples/i18n/Rakefile +1 -1
  19. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +8 -3
  20. data/examples/i18n/ar/lib/calculator.rb +2 -2
  21. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
  22. data/examples/i18n/bg/features/support/env.rb +6 -1
  23. data/examples/i18n/bg/lib/calculator.rb +2 -1
  24. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +10 -5
  25. data/examples/i18n/ca/lib/calculadora.rb +2 -2
  26. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +10 -5
  27. data/examples/i18n/cs/lib/calculator.rb +3 -3
  28. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +10 -5
  29. data/examples/i18n/da/lib/lommeregner.rb +2 -2
  30. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +10 -5
  31. data/examples/i18n/de/lib/calculator.rb +2 -2
  32. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +10 -5
  33. data/examples/i18n/el/lib/calculator.rb +2 -2
  34. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +9 -4
  35. data/examples/i18n/en/lib/calculator.rb +2 -2
  36. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
  37. data/examples/i18n/en-lol/features/support/env.rb +6 -2
  38. data/examples/i18n/en-lol/lib/basket.rb +2 -2
  39. data/examples/i18n/en-lol/lib/belly.rb +2 -2
  40. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +9 -4
  41. data/examples/i18n/eo/lib/calculator.rb +2 -2
  42. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +10 -5
  43. data/examples/i18n/es/lib/calculador.rb +2 -2
  44. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +10 -5
  45. data/examples/i18n/et/lib/kalkulaator.rb +3 -3
  46. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +9 -4
  47. data/examples/i18n/fi/lib/laskin.rb +1 -1
  48. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
  49. data/examples/i18n/fr/features/support/env.rb +7 -2
  50. data/examples/i18n/fr/lib/calculatrice.rb +2 -2
  51. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +10 -5
  52. data/examples/i18n/he/lib/calculator.rb +1 -1
  53. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +9 -4
  54. data/examples/i18n/hi/lib/calculator.rb +1 -1
  55. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +9 -5
  56. data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
  57. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +10 -5
  58. data/examples/i18n/hu/lib/calculator.rb +1 -1
  59. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +10 -5
  60. data/examples/i18n/id/lib/calculator.rb +2 -2
  61. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +10 -5
  62. data/examples/i18n/it/lib/calcolatrice.rb +3 -3
  63. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
  64. data/examples/i18n/ja/features/support/env.rb +7 -2
  65. data/examples/i18n/ja/lib/calculator.rb +2 -2
  66. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +10 -5
  67. data/examples/i18n/ko/lib/calculator.rb +2 -2
  68. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +10 -5
  69. data/examples/i18n/lt/lib/calculator.rb +2 -2
  70. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +10 -5
  71. data/examples/i18n/lv/lib/calculator.rb +2 -2
  72. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
  73. data/examples/i18n/no/features/support/env.rb +7 -2
  74. data/examples/i18n/no/lib/kalkulator.rb +2 -2
  75. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +10 -5
  76. data/examples/i18n/pl/features/support/env.rb +6 -1
  77. data/examples/i18n/pl/lib/calculator.rb +2 -2
  78. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
  79. data/examples/i18n/pt/features/support/env.rb +7 -2
  80. data/examples/i18n/pt/lib/calculadora.rb +1 -1
  81. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +11 -6
  82. data/examples/i18n/ro/lib/calculator.rb +1 -1
  83. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
  84. data/examples/i18n/ru/features/support/env.rb +6 -1
  85. data/examples/i18n/ru/lib/calculator.rb +2 -1
  86. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +10 -5
  87. data/examples/i18n/sk/lib/calculator.rb +2 -2
  88. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
  89. data/examples/i18n/sr-Cyrl/features/support/env.rb +7 -2
  90. data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
  91. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +10 -5
  92. data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
  93. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +9 -4
  94. data/examples/i18n/sv/lib/kalkulator.rb +2 -2
  95. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +10 -5
  96. data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
  97. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
  98. data/examples/i18n/uk/features/support/env.rb +6 -1
  99. data/examples/i18n/uk/lib/calculator.rb +2 -1
  100. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
  101. data/examples/i18n/uz/features/support/env.rb +6 -1
  102. data/examples/i18n/uz/lib/calculator.rb +2 -1
  103. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +11 -6
  104. data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
  105. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +10 -5
  106. data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
  107. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
  108. data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
  109. data/examples/sinatra/features/support/env.rb +6 -1
  110. data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
  111. data/examples/tcl/features/support/env.rb +2 -1
  112. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
  113. data/examples/watir/features/step_definitions/search_steps.rb +6 -5
  114. data/examples/watir/features/support/env.rb +5 -1
  115. data/examples/watir/features/support/screenshots.rb +5 -5
  116. data/features/docs/api/list_step_defs_as_json.feature +21 -7
  117. data/features/docs/api/listen_for_events.feature +9 -8
  118. data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
  119. data/features/docs/cli/dry_run.feature +3 -0
  120. data/features/docs/cli/execute_with_tag_filter.feature +8 -6
  121. data/features/docs/cli/fail_fast.feature +2 -0
  122. data/features/docs/cli/help.feature +8 -0
  123. data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
  124. data/features/docs/cli/randomize.feature +2 -2
  125. data/features/docs/cli/retry_failing_tests.feature +75 -15
  126. data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
  127. data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
  128. data/features/docs/cli/strict_mode.feature +6 -0
  129. data/features/docs/defining_steps/ambiguous_steps.feature +89 -0
  130. data/features/docs/defining_steps/nested_steps.feature +5 -1
  131. data/features/docs/defining_steps/nested_steps_i18n.feature +3 -0
  132. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
  133. data/features/docs/defining_steps/printing_messages.feature +1 -2
  134. data/features/docs/defining_steps/skip_scenario.feature +1 -34
  135. data/features/docs/defining_steps/snippets.feature +18 -18
  136. data/features/docs/events/gherkin_source_read_event.feature +43 -0
  137. data/features/docs/events/step_activated_event.feature +36 -0
  138. data/features/docs/events/step_definition_registered_event.feature +29 -0
  139. data/features/docs/events/test_case_finished_event.feature +35 -0
  140. data/features/docs/events/test_case_started_event.feature +54 -0
  141. data/features/docs/events/test_run_finished_event.feature +40 -0
  142. data/features/docs/events/test_run_started_event.feature +41 -0
  143. data/features/docs/events/test_step_finished_event.feature +47 -0
  144. data/features/docs/events/test_step_started_event.feature +43 -0
  145. data/features/docs/exception_in_after_hook.feature +3 -2
  146. data/features/docs/exception_in_after_step_hook.feature +2 -0
  147. data/features/docs/exception_in_around_hook.feature +2 -0
  148. data/features/docs/exception_in_before_hook.feature +3 -1
  149. data/features/docs/extending_cucumber/custom_formatter.feature +12 -48
  150. data/features/docs/formatters/json_formatter.feature +4 -4
  151. data/features/docs/formatters/junit_formatter.feature +7 -6
  152. data/features/docs/formatters/pretty_formatter.feature +1 -0
  153. data/features/docs/formatters/progress_formatter.feature +1 -0
  154. data/features/docs/formatters/rerun_formatter.feature +2 -0
  155. data/features/docs/formatters/summary_formatter.feature +35 -0
  156. data/features/docs/formatters/usage_formatter.feature +3 -0
  157. data/features/docs/getting_started.feature +2 -1
  158. data/features/docs/gherkin/background.feature +5 -5
  159. data/features/docs/gherkin/doc_strings.feature +2 -0
  160. data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
  161. data/features/docs/gherkin/outlines.feature +6 -4
  162. data/features/docs/gherkin/unicode_table.feature +2 -1
  163. data/features/docs/gherkin/using_descriptions.feature +1 -0
  164. data/features/docs/gherkin/using_star_notation.feature +1 -1
  165. data/features/docs/post_configuration_hook.feature +1 -17
  166. data/features/docs/rake_task.feature +5 -0
  167. data/features/docs/raketask.feature +3 -1
  168. data/features/docs/work_in_progress.feature +5 -2
  169. data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
  170. data/features/docs/writing_support_code/around_hooks.feature +6 -0
  171. data/features/docs/writing_support_code/before_hook.feature +1 -0
  172. data/features/docs/writing_support_code/hook_order.feature +3 -1
  173. data/features/docs/writing_support_code/parameter_types.feature +53 -0
  174. data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
  175. data/features/docs/writing_support_code/world.feature +129 -0
  176. data/features/lib/step_definitions/aruba_steps.rb +5 -10
  177. data/features/lib/step_definitions/cli_steps.rb +4 -0
  178. data/features/lib/step_definitions/cucumber_steps.rb +9 -12
  179. data/features/lib/step_definitions/iso-8859-1_steps.rb +9 -5
  180. data/features/lib/step_definitions/json_steps.rb +2 -1
  181. data/features/lib/step_definitions/junit_steps.rb +2 -1
  182. data/features/lib/step_definitions/language_steps.rb +3 -2
  183. data/features/lib/step_definitions/profile_steps.rb +7 -6
  184. data/features/lib/step_definitions/retry_steps.rb +33 -13
  185. data/features/lib/step_definitions/ruby_steps.rb +2 -1
  186. data/features/lib/support/env.rb +3 -2
  187. data/features/lib/support/fake_wire_server.rb +17 -3
  188. data/features/lib/support/feature_factory.rb +2 -1
  189. data/features/lib/support/normalise_output.rb +14 -12
  190. data/features/lib/support/parameter_types.rb +5 -0
  191. data/gem_tasks/contributors.rake +10 -6
  192. data/gem_tasks/cov.rake +1 -0
  193. data/gem_tasks/downloads.rb +1 -0
  194. data/gem_tasks/environment.rake +2 -5
  195. data/gem_tasks/examples.rake +3 -2
  196. data/gem_tasks/fix_cr_lf.rake +19 -7
  197. data/gem_tasks/flog.rake +4 -3
  198. data/gem_tasks/rspec.rake +2 -1
  199. data/gem_tasks/sass.rake +2 -1
  200. data/lib/autotest/cucumber.rb +1 -0
  201. data/lib/autotest/cucumber_mixin.rb +17 -16
  202. data/lib/autotest/cucumber_rails.rb +1 -0
  203. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  204. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  205. data/lib/autotest/cucumber_rspec.rb +1 -0
  206. data/lib/autotest/cucumber_rspec2.rb +1 -0
  207. data/lib/autotest/discover.rb +3 -2
  208. data/lib/cucumber/cli/configuration.rb +12 -21
  209. data/lib/cucumber/cli/main.rb +8 -7
  210. data/lib/cucumber/cli/options.rb +341 -217
  211. data/lib/cucumber/cli/profile_loader.rb +26 -21
  212. data/lib/cucumber/cli/rerun_file.rb +1 -0
  213. data/lib/cucumber/configuration.rb +54 -37
  214. data/lib/cucumber/constantize.rb +2 -1
  215. data/lib/cucumber/core_ext/string.rb +2 -1
  216. data/lib/cucumber/deprecate.rb +4 -3
  217. data/lib/cucumber/encoding.rb +1 -0
  218. data/lib/cucumber/errors.rb +3 -1
  219. data/lib/cucumber/events/gherkin_source_read.rb +17 -0
  220. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +5 -2
  221. data/lib/cucumber/events/step_definition_registered.rb +24 -0
  222. data/lib/cucumber/events/test_case_finished.rb +18 -0
  223. data/lib/cucumber/events/test_case_started.rb +15 -0
  224. data/lib/cucumber/events/test_run_finished.rb +12 -0
  225. data/lib/cucumber/events/test_run_started.rb +16 -0
  226. data/lib/cucumber/events/test_step_finished.rb +20 -0
  227. data/lib/cucumber/events/test_step_started.rb +17 -0
  228. data/lib/cucumber/events.rb +23 -3
  229. data/lib/cucumber/file_specs.rb +1 -0
  230. data/lib/cucumber/filters/activate_steps.rb +8 -3
  231. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  232. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  233. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  234. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  235. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +27 -0
  236. data/lib/cucumber/filters/gated_receiver.rb +1 -0
  237. data/lib/cucumber/filters/prepare_world.rb +1 -0
  238. data/lib/cucumber/filters/quit.rb +1 -0
  239. data/lib/cucumber/filters/randomizer.rb +1 -0
  240. data/lib/cucumber/filters/retry.rb +4 -4
  241. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -0
  242. data/lib/cucumber/filters/tag_limits/verifier.rb +2 -1
  243. data/lib/cucumber/filters/tag_limits.rb +4 -3
  244. data/lib/cucumber/filters.rb +3 -0
  245. data/lib/cucumber/formatter/ansicolor.rb +9 -11
  246. data/lib/cucumber/formatter/backtrace_filter.rb +21 -8
  247. data/lib/cucumber/formatter/console.rb +72 -66
  248. data/lib/cucumber/formatter/console_counts.rb +44 -0
  249. data/lib/cucumber/formatter/console_issues.rb +58 -0
  250. data/lib/cucumber/formatter/duration.rb +2 -1
  251. data/lib/cucumber/formatter/duration_extractor.rb +1 -0
  252. data/lib/cucumber/formatter/fail_fast.rb +4 -2
  253. data/lib/cucumber/formatter/fanout.rb +1 -0
  254. data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
  255. data/lib/cucumber/formatter/html.rb +175 -249
  256. data/lib/cucumber/formatter/html_builder.rb +120 -0
  257. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -0
  258. data/lib/cucumber/formatter/inline-js.js +30 -0
  259. data/lib/cucumber/formatter/interceptor.rb +3 -2
  260. data/lib/cucumber/formatter/io.rb +2 -1
  261. data/lib/cucumber/formatter/json.rb +33 -30
  262. data/lib/cucumber/formatter/json_pretty.rb +1 -0
  263. data/lib/cucumber/formatter/junit.rb +26 -24
  264. data/lib/cucumber/formatter/legacy_api/adapter.rb +81 -69
  265. data/lib/cucumber/formatter/legacy_api/ast.rb +27 -22
  266. data/lib/cucumber/formatter/legacy_api/results.rb +7 -8
  267. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +1 -0
  268. data/lib/cucumber/formatter/pretty.rb +24 -18
  269. data/lib/cucumber/formatter/progress.rb +55 -13
  270. data/lib/cucumber/formatter/rerun.rb +15 -18
  271. data/lib/cucumber/formatter/stepdefs.rb +1 -0
  272. data/lib/cucumber/formatter/steps.rb +2 -1
  273. data/lib/cucumber/formatter/summary.rb +43 -20
  274. data/lib/cucumber/formatter/unicode.rb +2 -1
  275. data/lib/cucumber/formatter/usage.rb +33 -28
  276. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  277. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -1
  278. data/lib/cucumber/gherkin/formatter/escaping.rb +2 -1
  279. data/lib/cucumber/gherkin/i18n.rb +1 -0
  280. data/lib/cucumber/gherkin/steps_parser.rb +1 -0
  281. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +41 -30
  282. data/lib/cucumber/glue/hook.rb +43 -0
  283. data/lib/cucumber/glue/invoke_in_world.rb +70 -0
  284. data/lib/cucumber/glue/proto_world.rb +220 -0
  285. data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +60 -90
  286. data/lib/cucumber/{rb_support → glue}/snippet.rb +64 -26
  287. data/lib/cucumber/glue/step_definition.rb +143 -0
  288. data/lib/cucumber/glue/world_factory.rb +23 -0
  289. data/lib/cucumber/hooks.rb +9 -8
  290. data/lib/cucumber/load_path.rb +1 -0
  291. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
  292. data/lib/cucumber/multiline_argument/data_table.rb +47 -181
  293. data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
  294. data/lib/cucumber/multiline_argument.rb +6 -15
  295. data/lib/cucumber/platform.rb +4 -5
  296. data/lib/cucumber/project_initializer.rb +3 -2
  297. data/lib/cucumber/rake/task.rb +19 -14
  298. data/lib/cucumber/rspec/disable_option_parser.rb +2 -1
  299. data/lib/cucumber/rspec/doubles.rb +2 -1
  300. data/lib/cucumber/running_test_case.rb +3 -27
  301. data/lib/cucumber/runtime/after_hooks.rb +2 -1
  302. data/lib/cucumber/runtime/before_hooks.rb +1 -0
  303. data/lib/cucumber/runtime/for_programming_languages.rb +2 -36
  304. data/lib/cucumber/runtime/step_hooks.rb +1 -0
  305. data/lib/cucumber/runtime/support_code.rb +21 -16
  306. data/lib/cucumber/runtime/user_interface.rb +10 -16
  307. data/lib/cucumber/runtime.rb +49 -32
  308. data/lib/cucumber/step_argument.rb +1 -2
  309. data/lib/cucumber/step_definition_light.rb +2 -0
  310. data/lib/cucumber/step_definitions.rb +1 -0
  311. data/lib/cucumber/step_match.rb +30 -15
  312. data/lib/cucumber/step_match_search.rb +3 -3
  313. data/lib/cucumber/term/ansicolor.rb +2 -1
  314. data/lib/cucumber/unit.rb +1 -0
  315. data/lib/cucumber/version +1 -1
  316. data/lib/cucumber.rb +1 -13
  317. data/lib/simplecov_setup.rb +2 -1
  318. data/scripts/invite-collaborator +40 -0
  319. data/scripts/update-changelog +86 -0
  320. data/spec/cucumber/cli/configuration_spec.rb +109 -98
  321. data/spec/cucumber/cli/main_spec.rb +8 -7
  322. data/spec/cucumber/cli/options_spec.rb +114 -79
  323. data/spec/cucumber/cli/profile_loader_spec.rb +25 -5
  324. data/spec/cucumber/cli/rerun_spec.rb +21 -20
  325. data/spec/cucumber/configuration_spec.rb +48 -47
  326. data/spec/cucumber/constantize_spec.rb +3 -2
  327. data/spec/cucumber/events_spec.rb +9 -0
  328. data/spec/cucumber/file_specs_spec.rb +26 -25
  329. data/spec/cucumber/filters/activate_steps_spec.rb +25 -22
  330. data/spec/cucumber/filters/gated_receiver_spec.rb +7 -6
  331. data/spec/cucumber/filters/retry_spec.rb +42 -23
  332. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +12 -11
  333. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +15 -14
  334. data/spec/cucumber/filters/tag_limits_spec.rb +9 -8
  335. data/spec/cucumber/formatter/ansicolor_spec.rb +10 -9
  336. data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
  337. data/spec/cucumber/formatter/console_counts_spec.rb +14 -0
  338. data/spec/cucumber/formatter/duration_spec.rb +4 -3
  339. data/spec/cucumber/formatter/fail_fast_spec.rb +27 -27
  340. data/spec/cucumber/formatter/html_spec.rb +65 -60
  341. data/spec/cucumber/formatter/interceptor_spec.rb +1 -0
  342. data/spec/cucumber/formatter/json_spec.rb +71 -97
  343. data/spec/cucumber/formatter/junit_spec.rb +46 -47
  344. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +134 -141
  345. data/spec/cucumber/formatter/pretty_spec.rb +105 -117
  346. data/spec/cucumber/formatter/progress_spec.rb +22 -21
  347. data/spec/cucumber/formatter/rerun_spec.rb +70 -64
  348. data/spec/cucumber/formatter/spec_helper.rb +14 -12
  349. data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +22 -6
  350. data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
  351. data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +62 -25
  352. data/spec/cucumber/glue/step_definition_spec.rb +207 -0
  353. data/spec/cucumber/hooks_spec.rb +5 -4
  354. data/spec/cucumber/multiline_argument/data_table_spec.rb +179 -129
  355. data/spec/cucumber/project_initializer_spec.rb +12 -11
  356. data/spec/cucumber/rake/forked_spec.rb +22 -17
  357. data/spec/cucumber/rake/task_spec.rb +21 -20
  358. data/spec/cucumber/running_test_case_spec.rb +36 -35
  359. data/spec/cucumber/runtime/for_programming_languages_spec.rb +2 -30
  360. data/spec/cucumber/runtime/support_code_spec.rb +1 -0
  361. data/spec/cucumber/runtime_spec.rb +3 -2
  362. data/spec/cucumber/step_argument_spec.rb +6 -5
  363. data/spec/cucumber/step_match_search_spec.rb +32 -41
  364. data/spec/cucumber/step_match_spec.rb +34 -33
  365. data/spec/cucumber/world/pending_spec.rb +12 -11
  366. data/spec/spec_helper.rb +1 -0
  367. data/spec/support/standard_step_actions.rb +2 -1
  368. metadata +132 -61
  369. data/features/docs/formatters/debug_formatter.feature +0 -47
  370. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  371. data/features/docs/writing_support_code/transforms.feature +0 -98
  372. data/features/lib/step_definitions/wire_steps.rb +0 -58
  373. data/gem_tasks/cucumber.rake +0 -25
  374. data/lib/cucumber/ast.rb +0 -13
  375. data/lib/cucumber/core_ext/instance_exec.rb +0 -70
  376. data/lib/cucumber/events/after_test_case.rb +0 -25
  377. data/lib/cucumber/events/after_test_step.rb +0 -30
  378. data/lib/cucumber/events/before_test_case.rb +0 -18
  379. data/lib/cucumber/events/before_test_step.rb +0 -23
  380. data/lib/cucumber/events/bus.rb +0 -86
  381. data/lib/cucumber/events/finished_testing.rb +0 -9
  382. data/lib/cucumber/formatter/debug.rb +0 -35
  383. data/lib/cucumber/formatter/event_bus_report.rb +0 -38
  384. data/lib/cucumber/rb_support/rb_hook.rb +0 -19
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -131
  386. data/lib/cucumber/rb_support/rb_transform.rb +0 -59
  387. data/lib/cucumber/rb_support/rb_world.rb +0 -149
  388. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -4
  389. data/spec/cucumber/events/bus_spec.rb +0 -94
  390. data/spec/cucumber/formatter/debug_spec.rb +0 -64
  391. data/spec/cucumber/formatter/event_bus_report_spec.rb +0 -88
  392. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -243
  393. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -199
  394. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
  395. data/spec/cucumber_spec.rb +0 -39
@@ -46,6 +46,7 @@
46
46
  Given scenario step
47
47
  """
48
48
 
49
+ @todo-windows
49
50
  Scenario: Around hooks cover background steps
50
51
  When I run `cucumber -o /dev/null features/around_hook_covers_background.feature`
51
52
  Then the output should contain:
@@ -53,9 +54,10 @@
53
54
  Event order: around_begin background_step scenario_step around_end
54
55
  """
55
56
 
57
+ @todo-windows
56
58
  Scenario: All hooks execute in expected order
57
59
  When I run `cucumber -o /dev/null features/all_hook_order.feature`
58
60
  Then the output should contain:
59
61
  """
60
62
  Event order: around_begin before background_step scenario_step after around_end
61
- """
63
+ """
@@ -0,0 +1,53 @@
1
+ Feature: Parameter Types
2
+
3
+ Parameter Types allow you to convert primitive string arguments captured in step definitions
4
+ into more meaningful data types.
5
+
6
+ Background:
7
+ Let's just create a simple feature for testing out parameter types.
8
+ We also have a Person class that we need to be able to build.
9
+
10
+ Given a file named "features/foo.feature" with:
11
+ """
12
+ Feature:
13
+ Scenario:
14
+ Given Joe has gone home
15
+ When Sally contacts Joe
16
+ """
17
+ And a file named "features/step_definitions/steps.rb" with:
18
+ """
19
+ # It works with Regular Expressions
20
+ Given /([A-Z]\w+) has gone home/ do |person|
21
+ expect(person.name).to eq 'Joe'
22
+ end
23
+
24
+ # It works with Cucumber Expressions too
25
+ When "{person} contacts {person}" do |contacter, contactee|
26
+ expect(contacter.name).to eq 'Sally'
27
+ expect(contactee.name).to eq 'Joe'
28
+ end
29
+ """
30
+ And a file named "features/support/env.rb" with:
31
+ """
32
+ class Person
33
+ attr_reader :name
34
+
35
+ def initialize(name)
36
+ @name = name
37
+ end
38
+ end
39
+ """
40
+
41
+ Scenario: Parameter type defined with ParameterType method
42
+ This is the most basic way to use a parameter type.
43
+
44
+ Given a file named "features/support/parameter_types.rb" with:
45
+ """
46
+ ParameterType(
47
+ name: 'person',
48
+ regexp: /[A-Z]\w+/,
49
+ transformer: -> (name) { Person.new(name) }
50
+ )
51
+ """
52
+ When I run `cucumber features/foo.feature`
53
+ Then it should pass
@@ -4,7 +4,7 @@ Feature: Tagged hooks
4
4
  Given the standard step definitions
5
5
  And a file named "features/support/hooks.rb" with:
6
6
  """
7
- Before('~@no-boom') do
7
+ Before('not @no-boom') do
8
8
  raise 'boom'
9
9
  end
10
10
  """
@@ -0,0 +1,129 @@
1
+ Feature: World
2
+
3
+ In order to isolate each test scenario, the steps definitions belonging to the
4
+ same scenario will run in a isolated context, called 'world'. A world also
5
+ contains the helpers methods that will be used in the step definitions.
6
+
7
+ It is possible to add helpers methods to a world in three different ways:
8
+
9
+ 1. Passing a module. In this case its methods will be added directly to the
10
+ world and be usable in the step definitions.
11
+
12
+ 2. Passing a block, where the return value is the world object.
13
+
14
+ 3. Passing a hash, where the keys are namespaces and the values are
15
+ modules. In this case, the methods of each module will be accessible using
16
+ the key as prefix.
17
+
18
+ Scenario: A world is extended using a module
19
+ Given a file named "features/support/helpers.rb" with:
20
+ """
21
+ module Helpers
22
+ def helper_method
23
+ 42
24
+ end
25
+ end
26
+
27
+ World(Helpers)
28
+ """
29
+ And a file named "features/step_definitions/step.rb" with:
30
+ """
31
+ Then /^the helper method is called$/ do
32
+ expect(helper_method).to eql(42)
33
+ end
34
+ """
35
+ And a file named "features/f.feature" with:
36
+ """
37
+ Feature: Calling a method
38
+ Scenario: I call a method without namespaces
39
+ Then the helper method is called
40
+ """
41
+ When I run `cucumber features/f.feature`
42
+ Then it should pass
43
+
44
+ Scenario: A world is created using a block
45
+ Given a file named "features/support/helpers.rb" with:
46
+ """
47
+ class Helper
48
+ def helper_method
49
+ 42
50
+ end
51
+ end
52
+
53
+ World do
54
+ Helper.new
55
+ end
56
+ """
57
+ And a file named "features/step_definitions/step.rb" with:
58
+ """
59
+ Then /^the helper method is called$/ do
60
+ expect(helper_method).to eql(42)
61
+ end
62
+ """
63
+ And a file named "features/f.feature" with:
64
+ """
65
+ Feature: Calling a method
66
+ Scenario: I call a method from a namespace
67
+ Then the helper method is called
68
+ """
69
+ When I run `cucumber features/f.feature`
70
+ Then it should pass
71
+
72
+ Scenario: A world is extended using a module with namespace
73
+ Given a file named "features/support/helpers.rb" with:
74
+ """
75
+ module Helpers
76
+ def helper_method
77
+ 42
78
+ end
79
+ end
80
+
81
+ World(my_namespace: Helpers)
82
+ """
83
+ And a file named "features/step_definitions/step.rb" with:
84
+ """
85
+ Then /^the helper method is called$/ do
86
+ expect(my_namespace.helper_method).to eql(42)
87
+ end
88
+ """
89
+ And a file named "features/f.feature" with:
90
+ """
91
+ Feature: Calling a method
92
+ Scenario: I call a method from a namespace
93
+ Then the helper method is called
94
+ """
95
+ When I run `cucumber features/f.feature`
96
+ Then it should pass
97
+
98
+ Scenario: A world is extended using multiple modules with different namespaces
99
+ Given a file named "features/support/helpers.rb" with:
100
+ """
101
+ module ModuleOne
102
+ def forty_one
103
+ 41
104
+ end
105
+ end
106
+
107
+ module ModuleTwo
108
+ def forty_two
109
+ 42
110
+ end
111
+ end
112
+
113
+ World(module_one: ModuleOne, module_two: ModuleTwo)
114
+ """
115
+ And a file named "features/step_definitions/step.rb" with:
116
+ """
117
+ Then /^the helper method is called$/ do
118
+ expect(module_one.forty_one).to eql(41)
119
+ expect(module_two.forty_two).to eql(42)
120
+ end
121
+ """
122
+ And a file named "features/f.feature" with:
123
+ """
124
+ Feature: Calling a method
125
+ Scenario: I call a method from two namespaces
126
+ Then the helper method is called
127
+ """
128
+ When I run `cucumber features/f.feature`
129
+ Then it should pass
@@ -1,26 +1,21 @@
1
- Given('a Gemfile with:') do |content|
2
- path = File.expand_path(current_dir + "/Gemfile")
3
- write_file path, content
4
- set_env "BUNDLE_GEMFILE", path
5
- end
6
-
1
+ # frozen_string_literal: true
7
2
  Then(/^it should (pass|fail)$/) do |result|
8
3
  assert_success result == 'pass'
9
4
  end
10
5
 
11
- Then(/^"([^"]*)" should not be required$/) do |file_name|
6
+ Then('{string} should not be required') do |file_name|
12
7
  expect(all_output).not_to include("* #{file_name}")
13
8
  end
14
9
 
15
- Then(/^"([^"]*)" should be required$/) do |file_name|
10
+ Then('{string} should be required') do |file_name|
16
11
  expect(all_output).to include("* #{file_name}")
17
12
  end
18
13
 
19
- Then /^it fails before running features with:$/ do |expected|
14
+ Then('it fails before running features with:') do |expected|
20
15
  assert_matching_output("\\A#{expected}", all_output)
21
16
  assert_success(false)
22
17
  end
23
18
 
24
- Then(/^the output includes the message "(.*)"$/) do |message|
19
+ Then('the output includes the message {string}') do |message|
25
20
  expect(all_output).to include(message)
26
21
  end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ Then('I should see the CLI help') do
3
+ expect(all_output).to include('Usage:')
4
+ end
@@ -1,22 +1,23 @@
1
- Given /^a directory without standard Cucumber project directory structure$/ do
1
+ # frozen_string_literal: true
2
+ Given('a directory without standard Cucumber project directory structure') do
2
3
  in_current_dir do
3
4
  FileUtils.rm_rf 'features' if File.directory?('features')
4
5
  end
5
6
  end
6
7
 
7
- Given /^a scenario with a step that looks like this:$/ do |string|
8
+ Given('a scenario with a step that looks like this:') do |string|
8
9
  create_feature do
9
10
  create_scenario { string }
10
11
  end
11
12
  end
12
13
 
13
- Given(/^a scenario with a step that looks like this in japanese:$/) do |string|
14
+ Given('a scenario with a step that looks like this in japanese:') do |string|
14
15
  create_feature_ja do
15
16
  create_scenario_ja { string }
16
17
  end
17
18
  end
18
19
 
19
- Given(/^the standard step definitions$/) do
20
+ Given('the standard step definitions') do
20
21
  write_file 'features/step_definitions/steps.rb',
21
22
 
22
23
  <<-STEPS
@@ -28,11 +29,11 @@ Given(/^the standard step definitions$/) do
28
29
  STEPS
29
30
  end
30
31
 
31
- Given /^a step definition that looks like this:$/ do |string|
32
+ Given('a step definition that looks like this:') do |string|
32
33
  create_step_definition { string }
33
34
  end
34
35
 
35
- Given /^a scenario "([^\"]*)" that passes$/ do |name|
36
+ Given('a scenario {string} that passes') do |name|
36
37
  write_file "features/#{name}.feature",
37
38
  <<-FEATURE
38
39
  Feature: #{name}
@@ -46,7 +47,7 @@ Given /^a scenario "([^\"]*)" that passes$/ do |name|
46
47
  STEPS
47
48
  end
48
49
 
49
- Given /^a scenario "([^\"]*)" that fails$/ do |name|
50
+ Given('a scenario {string} that fails') do |name|
50
51
  write_file "features/#{name}.feature",
51
52
  <<-FEATURE
52
53
  Feature: #{name}
@@ -60,15 +61,11 @@ Given /^a scenario "([^\"]*)" that fails$/ do |name|
60
61
  STEPS
61
62
  end
62
63
 
63
- When /^I run the feature with the (\w+) formatter$/ do |formatter|
64
+ When(/^I run the feature with the (\w+) formatter$/) do |formatter|
64
65
  expect(features.length).to eq 1
65
66
  run_feature features.first, formatter
66
67
  end
67
68
 
68
- Then /^the stderr should contain a warning message$/ do
69
- expect(all_stderr).to include("[warning]")
70
- end
71
-
72
69
  module CucumberHelper
73
70
  def run_feature(filename = 'features/a_feature.feature', formatter = 'progress')
74
71
  run_simple "#{Cucumber::BINARY} #{filename} --format #{formatter}", false
@@ -1,12 +1,16 @@
1
1
  # encoding: iso-8859-1
2
- # Ideally we would use Norwegian keywords here, but that won't work unless this file is UTF-8 encoded.
3
- # Alternatively it would be possible to use Norwegian keywords and encode the file as UTF-8.
2
+ # frozen_string_literal: true
3
+ # Ideally we would use Norwegian keywords here, but that won't work unless this
4
+ # file is UTF-8 encoded.
5
+ # Alternatively, it would be possible to use Norwegian keywords and encode the
6
+ # file as UTF-8.
4
7
  #
5
- # In both cases, stepdef arguments will be sent in as UTF-8, regardless of what encoding is used.
6
- Given /^jeg drikker en "([^"]*)"$/ do |drink|
8
+ # In both cases, stepdef arguments will be sent in as UTF-8, regardless of what
9
+ # encoding is used.
10
+ Given(/^jeg drikker en "([^"]*)"$/) do |drink|
7
11
  expect(drink).to eq '�l'.encode('UTF-8')
8
12
  end
9
13
 
10
- When /^skal de andre si "([^"]*)"$/ do |greeting|
14
+ When(/^skal de andre si "([^"]*)"$/) do |greeting|
11
15
  expect(greeting).to eq 'sk�l'.encode('UTF-8')
12
16
  end
@@ -1,4 +1,5 @@
1
- Then /^it should (pass|fail) with JSON:$/ do |pass_fail, json|
1
+ # frozen_string_literal: true
2
+ Then(/^it should (pass|fail) with JSON:$/) do |pass_fail, json|
2
3
  actual = normalise_json(MultiJson.load(all_stdout))
3
4
  expected = MultiJson.load(json)
4
5
 
@@ -1,4 +1,5 @@
1
- Then(/^the junit output file "(.*?)" should contain:$/) do |actual_file, text|
1
+ # frozen_string_literal: true
2
+ Then('the junit output file {string} should contain:') do |actual_file, text|
2
3
  actual = IO.read(current_dir + '/' + actual_file)
3
4
  actual = replace_junit_time(actual)
4
5
  expect(actual).to eq text
@@ -1,7 +1,8 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
- Then(/^cucumber lists all the supported languages$/) do
4
- sample_languages = ["Arabic", "български", "Pirate", "English", "日本語"]
4
+ Then('cucumber lists all the supported languages') do
5
+ sample_languages = %w(Arabic български Pirate English 日本語)
5
6
  sample_languages.each do |language|
6
7
  expect(all_output.force_encoding('utf-8')).to include(language)
7
8
  end
@@ -1,15 +1,16 @@
1
- Given /^the following profiles? (?:are|is) defined:$/ do |profiles|
1
+ # frozen_string_literal: true
2
+ Given('the following profile(s) are/is defined:') do |profiles|
2
3
  write_file 'cucumber.yml', profiles
3
4
  end
4
5
 
5
- Then /^the (.*) profile should be used$/ do |profile|
6
+ Then('the {word} profile should be used') do |profile|
6
7
  step 'the stdout should contain:', profile
7
8
  end
8
9
 
9
- Then /^exactly these files should be loaded:\s*(.*)$/ do |files|
10
- expect(all_stdout.scan(/^ \* (.*\.rb)$/).flatten).to eq files.split(/,\s+/)
10
+ Then('exactly these files should be loaded: {list}') do |files|
11
+ expect(all_stdout.scan(/^ \* (.*\.rb)$/).flatten).to eq files
11
12
  end
12
13
 
13
- Then /^exactly these features should be run:\s*(.*)$/ do |files|
14
- expect(all_stdout.scan(/^ \* (.*\.feature)$/).flatten).to eq files.split(/,\s+/)
14
+ Then('exactly these features should be run: {list}') do |files|
15
+ expect(all_stdout.scan(/^ \* (.*\.feature)$/).flatten).to eq files
15
16
  end
@@ -1,35 +1,55 @@
1
- Given /^a scenario "([^\"]*)" that fails once, then passes$/ do |name|
1
+ # frozen_string_literal: true
2
+ Given('a scenario {string} that fails once, then passes') do |full_name|
3
+ name = snake_case(full_name)
2
4
  write_file "features/#{name}.feature",
3
5
  <<-FEATURE
4
- Feature: #{name}
5
- Scenario: #{name}
6
+ Feature: #{full_name} feature
7
+ Scenario: #{full_name}
6
8
  Given it fails once, then passes
7
9
  FEATURE
8
10
 
9
- write_file "features/step_defnitions/#{name}_steps.rb",
11
+ write_file "features/step_definitions/#{name}_steps.rb",
10
12
  <<-STEPS
11
13
  Given(/^it fails once, then passes$/) do
12
- $#{name.downcase} ||= 0
13
- $#{name.downcase} += 1
14
- expect($#{name.downcase}).to eql 2
14
+ $#{name} += 1
15
+ expect($#{name}).to be > 1
15
16
  end
16
17
  STEPS
18
+
19
+ write_file "features/support/#{name}_init.rb",
20
+ <<-INIT
21
+ $#{name} = 0
22
+ INIT
17
23
  end
18
24
 
19
- Given /^a scenario "([^\"]*)" that fails twice, then passes$/ do |name|
25
+ Given('a scenario {string} that fails twice, then passes') do |full_name|
26
+ name = snake_case(full_name)
20
27
  write_file "features/#{name}.feature",
21
28
  <<-FEATURE
22
- Feature: #{name}
23
- Scenario: #{name}
29
+ Feature: #{full_name} feature
30
+ Scenario: #{full_name}
24
31
  Given it fails twice, then passes
25
32
  FEATURE
26
33
 
27
34
  write_file "features/step_definitions/#{name}_steps.rb",
28
35
  <<-STEPS
29
36
  Given(/^it fails twice, then passes$/) do
30
- $#{name.downcase} ||= 0
31
- $#{name.downcase} += 1
32
- expect($#{name.downcase}).to eql 3
37
+ $#{name} ||= 0
38
+ $#{name} += 1
39
+ expect($#{name}).to be > 2
33
40
  end
34
41
  STEPS
42
+
43
+ write_file "features/support/#{name}_init.rb",
44
+ <<-INIT
45
+ $#{name} = 0
46
+ INIT
35
47
  end
48
+
49
+ module SnakeCase
50
+ def snake_case(name)
51
+ name.downcase.gsub(/\W/, '_')
52
+ end
53
+ end
54
+
55
+ World(SnakeCase)
@@ -1,3 +1,4 @@
1
- When(/^I run the following Ruby code:$/) do |code|
1
+ # frozen_string_literal: true
2
+ When('I run the following Ruby code:') do |code|
2
3
  run_simple %{ruby -e "#{code}"}
3
4
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'aruba/cucumber'
2
3
  require 'aruba/in_process'
3
4
  require 'aruba/spawn_process'
@@ -7,7 +8,7 @@ Before('@spawn') do
7
8
  Aruba.process = Aruba::SpawnProcess
8
9
  end
9
10
 
10
- Before('~@spawn') do
11
+ Before('not @spawn') do
11
12
  Aruba::InProcess.main_class = Cucumber::Cli::Main
12
13
  Aruba.process = Aruba::InProcess
13
14
  end
@@ -17,5 +18,5 @@ Before do
17
18
  # set_env('SIMPLECOV', 'true')
18
19
 
19
20
  # Set a longer timeout for aruba, and a really long one if running on JRuby
20
- @aruba_timeout_seconds = Cucumber::JRUBY ? 35 : 15
21
+ @aruba_timeout_seconds = Cucumber::JRUBY ? 60 : 15
21
22
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'multi_json'
2
3
  require 'socket'
3
4
 
@@ -42,15 +43,20 @@ class FakeWireServer
42
43
  end
43
44
 
44
45
  def start
45
- while message = @socket.gets
46
+ message = @socket.gets
47
+
48
+ while message
46
49
  handle(message)
50
+ message = @socket.gets
47
51
  end
48
52
  end
49
53
 
50
54
  private
51
55
 
52
56
  def handle(data)
53
- if protocol_entry = response_to(data.strip)
57
+ protocol_entry = response_to(data.strip)
58
+
59
+ if protocol_entry
54
60
  sleep delay(data)
55
61
  @on_message.call(MultiJson.load(protocol_entry['request'])[0])
56
62
  send_response(protocol_entry['response'])
@@ -59,7 +65,15 @@ class FakeWireServer
59
65
  send_response(['fail', serialized_exception ].to_json)
60
66
  end
61
67
  rescue => e
62
- send_response(['fail', { :message => e.message, :backtrace => e.backtrace, :exception => e.class } ].to_json)
68
+ response = [
69
+ 'fail',
70
+ {
71
+ :message => e.message,
72
+ :backtrace => e.backtrace,
73
+ :exception => e.class
74
+ }
75
+ ].to_json
76
+ send_response(response)
63
77
  end
64
78
 
65
79
  def response_to(data)
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module FeatureFactory
3
4
  def create_feature(name = generate_feature_name)
4
5
  gherkin = <<-GHERKIN
@@ -54,7 +55,7 @@ Feature: #{name}
54
55
  end
55
56
 
56
57
  def filename(name)
57
- "features/#{name.downcase.gsub(' ', '_')}.feature"
58
+ "features/#{name.downcase.tr(' ', '_')}.feature"
58
59
  end
59
60
 
60
61
  def features
@@ -1,15 +1,20 @@
1
+ # frozen_string_literal: true
1
2
  # override aruba to filter out some stuff
2
3
  module NormaliseArubaOutput
3
4
  def all_stdout
4
5
  normalise_output(super)
5
6
  end
6
7
 
8
+ def sanitize_text(text)
9
+ normalise_output(super)
10
+ end
11
+
7
12
  def normalise_output(out)
8
- out = out.gsub(/#{Dir.pwd}\/tmp\/aruba/, '.') # Remove absolute paths
9
- out = out.gsub(/tmp\/aruba\//, '') # Fix aruba path
10
- out = out.gsub(/^.*cucumber_process\.rb.*$\n/, '')
11
- out = out.gsub(/^\d+m\d+\.\d+s$/, '0m0.012s') # Make duration predictable
12
- out = out.gsub(/Coverage report generated .+$\n/, '') # Remove SimpleCov message
13
+ out.gsub(/#{Dir.pwd}\/tmp\/aruba/, '.') # Remove absolute paths
14
+ .gsub(/tmp\/aruba\//, '') # Fix aruba path
15
+ .gsub(/^.*cucumber_process\.rb.*$\n/, '')
16
+ .gsub(/^\d+m\d+\.\d+s$/, '0m0.012s') # Make duration predictable
17
+ .gsub(/Coverage report generated .+$\n/, '') # Remove SimpleCov message
13
18
  end
14
19
 
15
20
  def normalise_json(json)
@@ -19,7 +24,7 @@ module NormaliseArubaOutput
19
24
  elements = feature.fetch('elements') { [] }
20
25
  elements.each do |scenario|
21
26
  scenario['steps'].each do |step|
22
- ['steps', 'before', 'after'].each do |type|
27
+ %w(steps before after).each do |type|
23
28
  if scenario[type]
24
29
  scenario[type].each do |step_or_hook|
25
30
  normalise_json_step_or_hook(step_or_hook)
@@ -37,12 +42,9 @@ module NormaliseArubaOutput
37
42
  end
38
43
 
39
44
  def normalise_json_step_or_hook(step_or_hook)
40
- if step_or_hook['result']
41
- if step_or_hook['result']['duration']
42
- expect(step_or_hook['result']['duration']).to be >= 0
43
- step_or_hook['result']['duration'] = 1
44
- end
45
- end
45
+ return unless step_or_hook['result'] && step_or_hook['result']['duration']
46
+ expect(step_or_hook['result']['duration']).to be >= 0
47
+ step_or_hook['result']['duration'] = 1
46
48
  end
47
49
 
48
50
  end
@@ -0,0 +1,5 @@
1
+ ParameterType(
2
+ name: 'list',
3
+ regexp: /.*/,
4
+ transformer: ->(s) { s.split(/,\s+/)}
5
+ )
@@ -1,15 +1,19 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
2
4
  desc 'List contributors'
3
5
  task :contributors do
4
- contributors = `git log --pretty=short --no-merges | git shortlog -ne | egrep -ve '^ +' | egrep -ve '^$'`.split("\n")
5
- puts contributors
6
- puts "Total: #{contributors.length}"
6
+ IO.popen("git log --pretty=short --no-merges | git shortlog -ne | egrep -ve '^ +' | egrep -ve '^$'") do |f|
7
+ contributors = f.readlines
8
+ puts contributors
9
+ puts "Total: #{contributors.length}"
10
+ end
7
11
  end
8
12
 
9
13
  task :codeswarm do
10
- sh "code_swarm --reload" rescue nil # Fails because of encoding - which we'll fix
11
- sh "iconv -f latin1 -t utf-8 .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
14
+ sh 'code_swarm --reload' rescue nil # Fails because of encoding - which we'll fix
15
+ sh 'iconv -f latin1 -t utf-8 .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml'
12
16
  sh "sed -e 's/Aslak\ Hellesøy@.BEKK.no/aslak.hellesoy@gmail.com/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
13
17
  sh "sed -e 's/josephwilk@joesniff.co.uk/joe@josephwilk.net/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
14
- sh "code_swarm"
18
+ sh 'code_swarm'
15
19
  end
data/gem_tasks/cov.rake CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  desc 'Run all tests and collect code coverage'
2
3
  task :cov do
3
4
  ENV['SIMPLECOV'] = 'features'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'httparty'
2
3
  require 'multi_json'
3
4
 
@@ -1,7 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  task :ruby_env do
2
- RUBY_APP = if RUBY_PLATFORM =~ /java/
3
- "jruby"
4
- else
5
- "ruby"
6
- end unless defined? RUBY_APP
3
+ RUBY_APP ||= RUBY_PLATFORM =~ /java/ ? 'jruby' : 'ruby'
7
4
  end