cucumber 3.0.0.pre.1 → 4.0.0.rc.4

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 (533) hide show
  1. checksums.yaml +5 -5
  2. data/{History.md → CHANGELOG.md} +339 -37
  3. data/CONTRIBUTING.md +11 -21
  4. data/README.md +20 -12
  5. data/bin/cucumber +2 -1
  6. data/lib/autotest/cucumber.rb +1 -0
  7. data/lib/autotest/cucumber_mixin.rb +44 -48
  8. data/lib/autotest/cucumber_rails.rb +1 -0
  9. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  10. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  11. data/lib/autotest/cucumber_rspec.rb +1 -0
  12. data/lib/autotest/cucumber_rspec2.rb +1 -0
  13. data/lib/autotest/discover.rb +3 -2
  14. data/lib/cucumber.rb +2 -1
  15. data/lib/cucumber/cli/configuration.rb +15 -20
  16. data/lib/cucumber/cli/main.rb +15 -15
  17. data/lib/cucumber/cli/options.rb +249 -197
  18. data/lib/cucumber/cli/profile_loader.rb +63 -38
  19. data/lib/cucumber/cli/rerun_file.rb +1 -0
  20. data/lib/cucumber/configuration.rb +49 -44
  21. data/lib/cucumber/constantize.rb +8 -10
  22. data/lib/cucumber/core_ext/string.rb +2 -1
  23. data/lib/cucumber/deprecate.rb +34 -10
  24. data/lib/cucumber/encoding.rb +2 -1
  25. data/lib/cucumber/errors.rb +10 -8
  26. data/lib/cucumber/events.rb +18 -3
  27. data/lib/cucumber/events/envelope.rb +9 -0
  28. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  29. data/lib/cucumber/events/gherkin_source_read.rb +14 -0
  30. data/lib/cucumber/events/hook_test_step_created.rb +13 -0
  31. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +8 -8
  32. data/lib/cucumber/events/step_definition_registered.rb +5 -9
  33. data/lib/cucumber/events/test_case_created.rb +13 -0
  34. data/lib/cucumber/events/test_case_finished.rb +14 -0
  35. data/lib/cucumber/events/test_case_ready.rb +12 -0
  36. data/lib/cucumber/events/test_case_started.rb +11 -0
  37. data/lib/cucumber/events/test_run_finished.rb +2 -3
  38. data/lib/cucumber/events/test_run_started.rb +14 -0
  39. data/lib/cucumber/events/test_step_created.rb +13 -0
  40. data/lib/cucumber/events/test_step_finished.rb +14 -0
  41. data/lib/cucumber/events/test_step_started.rb +11 -0
  42. data/lib/cucumber/file_specs.rb +7 -6
  43. data/lib/cucumber/filters.rb +3 -0
  44. data/lib/cucumber/filters/activate_steps.rb +12 -6
  45. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  46. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  47. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  48. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  49. data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
  50. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +28 -0
  51. data/lib/cucumber/filters/gated_receiver.rb +1 -2
  52. data/lib/cucumber/filters/prepare_world.rb +6 -13
  53. data/lib/cucumber/filters/quit.rb +3 -7
  54. data/lib/cucumber/filters/randomizer.rb +6 -7
  55. data/lib/cucumber/filters/retry.rb +3 -3
  56. data/lib/cucumber/filters/tag_limits.rb +5 -5
  57. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
  58. data/lib/cucumber/filters/tag_limits/verifier.rb +4 -7
  59. data/lib/cucumber/formatter/ansicolor.rb +38 -45
  60. data/lib/cucumber/formatter/ast_lookup.rb +165 -0
  61. data/lib/cucumber/formatter/backtrace_filter.rb +24 -12
  62. data/lib/cucumber/formatter/console.rb +48 -88
  63. data/lib/cucumber/formatter/console_counts.rb +11 -29
  64. data/lib/cucumber/formatter/console_issues.rb +34 -10
  65. data/lib/cucumber/formatter/duration.rb +2 -1
  66. data/lib/cucumber/formatter/duration_extractor.rb +4 -2
  67. data/lib/cucumber/formatter/errors.rb +6 -0
  68. data/lib/cucumber/formatter/fail_fast.rb +8 -5
  69. data/lib/cucumber/formatter/fanout.rb +3 -3
  70. data/lib/cucumber/formatter/ignore_missing_messages.rb +2 -4
  71. data/lib/cucumber/formatter/interceptor.rb +12 -14
  72. data/lib/cucumber/formatter/io.rb +5 -4
  73. data/lib/cucumber/formatter/json.rb +109 -115
  74. data/lib/cucumber/formatter/junit.rb +85 -80
  75. data/lib/cucumber/formatter/message.rb +246 -0
  76. data/lib/cucumber/formatter/pretty.rb +353 -153
  77. data/lib/cucumber/formatter/progress.rb +34 -38
  78. data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
  79. data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
  80. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
  81. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
  82. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
  83. data/lib/cucumber/formatter/rerun.rb +24 -5
  84. data/lib/cucumber/formatter/stepdefs.rb +2 -2
  85. data/lib/cucumber/formatter/steps.rb +5 -6
  86. data/lib/cucumber/formatter/summary.rb +18 -11
  87. data/lib/cucumber/formatter/unicode.rb +16 -18
  88. data/lib/cucumber/formatter/usage.rb +37 -33
  89. data/lib/cucumber/gherkin/data_table_parser.rb +18 -6
  90. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +83 -86
  91. data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
  92. data/lib/cucumber/gherkin/i18n.rb +1 -0
  93. data/lib/cucumber/gherkin/steps_parser.rb +18 -8
  94. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +37 -23
  95. data/lib/cucumber/glue/hook.rb +67 -0
  96. data/lib/cucumber/glue/invoke_in_world.rb +65 -0
  97. data/lib/cucumber/glue/proto_world.rb +231 -0
  98. data/lib/cucumber/glue/registry_and_more.rb +221 -0
  99. data/lib/cucumber/glue/snippet.rb +205 -0
  100. data/lib/cucumber/glue/step_definition.rb +166 -0
  101. data/lib/cucumber/glue/world_factory.rb +21 -0
  102. data/lib/cucumber/hooks.rb +30 -20
  103. data/lib/cucumber/load_path.rb +1 -0
  104. data/lib/cucumber/multiline_argument.rb +9 -19
  105. data/lib/cucumber/multiline_argument/data_table.rb +143 -250
  106. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +154 -0
  107. data/lib/cucumber/multiline_argument/doc_string.rb +2 -1
  108. data/lib/cucumber/platform.rb +5 -6
  109. data/lib/cucumber/project_initializer.rb +2 -2
  110. data/lib/cucumber/rake/task.rb +34 -27
  111. data/lib/cucumber/rspec/disable_option_parser.rb +10 -8
  112. data/lib/cucumber/rspec/doubles.rb +2 -1
  113. data/lib/cucumber/running_test_case.rb +4 -54
  114. data/lib/cucumber/runtime.rb +54 -72
  115. data/lib/cucumber/runtime/after_hooks.rb +10 -5
  116. data/lib/cucumber/runtime/before_hooks.rb +9 -4
  117. data/lib/cucumber/runtime/for_programming_languages.rb +12 -44
  118. data/lib/cucumber/runtime/step_hooks.rb +5 -2
  119. data/lib/cucumber/runtime/support_code.rb +30 -32
  120. data/lib/cucumber/runtime/user_interface.rb +16 -34
  121. data/lib/cucumber/step_definition_light.rb +7 -4
  122. data/lib/cucumber/step_definitions.rb +3 -2
  123. data/lib/cucumber/step_match.rb +42 -26
  124. data/lib/cucumber/step_match_search.rb +11 -12
  125. data/lib/cucumber/term/ansicolor.rb +39 -39
  126. data/lib/cucumber/unit.rb +1 -0
  127. data/lib/cucumber/version +1 -1
  128. data/lib/simplecov_setup.rb +2 -1
  129. metadata +238 -623
  130. data/.coveralls.yml +0 -1
  131. data/.github/ISSUE_TEMPLATE.md +0 -48
  132. data/.github/PULL_REQUEST_TEMPLATE.md +0 -39
  133. data/.rspec +0 -1
  134. data/.ruby-gemset +0 -1
  135. data/.travis.yml +0 -35
  136. data/.yardopts +0 -1
  137. data/Gemfile +0 -22
  138. data/Rakefile +0 -22
  139. data/cucumber.gemspec +0 -47
  140. data/cucumber.yml +0 -20
  141. data/examples/i18n/README.textile +0 -3
  142. data/examples/i18n/Rakefile +0 -33
  143. data/examples/i18n/ar/Rakefile +0 -6
  144. data/examples/i18n/ar/features/addition.feature +0 -17
  145. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -24
  146. data/examples/i18n/ar/lib/calculator.rb +0 -11
  147. data/examples/i18n/bg/Rakefile +0 -6
  148. data/examples/i18n/bg/features/addition.feature +0 -12
  149. data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
  150. data/examples/i18n/bg/features/division.feature +0 -17
  151. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
  152. data/examples/i18n/bg/features/support/env.rb +0 -5
  153. data/examples/i18n/bg/features/support/world.rb +0 -8
  154. data/examples/i18n/bg/lib/calculator.rb +0 -24
  155. data/examples/i18n/ca/Rakefile +0 -6
  156. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -21
  157. data/examples/i18n/ca/features/suma.feature +0 -17
  158. data/examples/i18n/ca/lib/calculadora.rb +0 -16
  159. data/examples/i18n/cs/Rakefile +0 -6
  160. data/examples/i18n/cs/features/addition.feature +0 -17
  161. data/examples/i18n/cs/features/division.feature +0 -11
  162. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -24
  163. data/examples/i18n/cs/lib/calculator.rb +0 -14
  164. data/examples/i18n/da/Rakefile +0 -6
  165. data/examples/i18n/da/features/sammenlaegning.feature +0 -18
  166. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -24
  167. data/examples/i18n/da/lib/lommeregner.rb +0 -11
  168. data/examples/i18n/de/Rakefile +0 -6
  169. data/examples/i18n/de/features/addition.feature +0 -17
  170. data/examples/i18n/de/features/division.feature +0 -10
  171. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -24
  172. data/examples/i18n/de/lib/calculator.rb +0 -14
  173. data/examples/i18n/el/Rakefile +0 -6
  174. data/examples/i18n/el/features/addition.feature +0 -17
  175. data/examples/i18n/el/features/division.feature +0 -10
  176. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -24
  177. data/examples/i18n/el/lib/calculator.rb +0 -14
  178. data/examples/i18n/en-lol/Rakefile +0 -4
  179. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
  180. data/examples/i18n/en-lol/features/stuffing.feature +0 -8
  181. data/examples/i18n/en-lol/features/support/env.rb +0 -7
  182. data/examples/i18n/en-lol/lib/basket.rb +0 -12
  183. data/examples/i18n/en-lol/lib/belly.rb +0 -11
  184. data/examples/i18n/en/Rakefile +0 -6
  185. data/examples/i18n/en/features/addition.feature +0 -17
  186. data/examples/i18n/en/features/division.feature +0 -10
  187. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -24
  188. data/examples/i18n/en/lib/calculator.rb +0 -14
  189. data/examples/i18n/eo/Rakefile +0 -6
  190. data/examples/i18n/eo/features/adicio.feature +0 -17
  191. data/examples/i18n/eo/features/divido.feature +0 -10
  192. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -24
  193. data/examples/i18n/eo/lib/calculator.rb +0 -14
  194. data/examples/i18n/es/Rakefile +0 -6
  195. data/examples/i18n/es/features/adicion.feature +0 -17
  196. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -21
  197. data/examples/i18n/es/lib/calculador.rb +0 -14
  198. data/examples/i18n/et/Rakefile +0 -6
  199. data/examples/i18n/et/features/jagamine.feature +0 -10
  200. data/examples/i18n/et/features/liitmine.feature +0 -17
  201. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -24
  202. data/examples/i18n/et/lib/kalkulaator.rb +0 -14
  203. data/examples/i18n/fi/Rakefile +0 -6
  204. data/examples/i18n/fi/features/jakolasku.feature +0 -10
  205. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -24
  206. data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
  207. data/examples/i18n/fi/lib/laskin.rb +0 -14
  208. data/examples/i18n/fr/Rakefile +0 -8
  209. data/examples/i18n/fr/features/addition.feature +0 -18
  210. data/examples/i18n/fr/features/addition2.feature +0 -17
  211. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
  212. data/examples/i18n/fr/features/support/env.rb +0 -5
  213. data/examples/i18n/fr/lib/calculatrice.rb +0 -10
  214. data/examples/i18n/he/Rakefile +0 -6
  215. data/examples/i18n/he/features/addition.feature +0 -17
  216. data/examples/i18n/he/features/division.feature +0 -10
  217. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -24
  218. data/examples/i18n/he/lib/calculator.rb +0 -15
  219. data/examples/i18n/hi/Rakefile +0 -6
  220. data/examples/i18n/hi/features/addition.feature +0 -16
  221. data/examples/i18n/hi/features/division.feature +0 -10
  222. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -24
  223. data/examples/i18n/hi/lib/calculator.rb +0 -15
  224. data/examples/i18n/ht/Rakefile +0 -6
  225. data/examples/i18n/ht/features/adisyon.feature +0 -17
  226. data/examples/i18n/ht/features/divizyon.feature +0 -10
  227. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +0 -25
  228. data/examples/i18n/ht/lib/kalkilatris.rb +0 -14
  229. data/examples/i18n/hu/Rakefile +0 -6
  230. data/examples/i18n/hu/features/osszeadas.feature +0 -17
  231. data/examples/i18n/hu/features/osztas.feature +0 -10
  232. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -25
  233. data/examples/i18n/hu/lib/calculator.rb +0 -14
  234. data/examples/i18n/id/Rakefile +0 -6
  235. data/examples/i18n/id/features/addition.feature +0 -17
  236. data/examples/i18n/id/features/division.feature +0 -10
  237. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -24
  238. data/examples/i18n/id/lib/calculator.rb +0 -14
  239. data/examples/i18n/it/Rakefile +0 -6
  240. data/examples/i18n/it/features/somma.feature +0 -11
  241. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -24
  242. data/examples/i18n/it/lib/calcolatrice.rb +0 -11
  243. data/examples/i18n/ja/Rakefile +0 -6
  244. data/examples/i18n/ja/features/addition.feature +0 -17
  245. data/examples/i18n/ja/features/division.feature +0 -10
  246. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
  247. data/examples/i18n/ja/features/support/env.rb +0 -5
  248. data/examples/i18n/ja/lib/calculator.rb +0 -14
  249. data/examples/i18n/ko/Rakefile +0 -6
  250. data/examples/i18n/ko/features/addition.feature +0 -17
  251. data/examples/i18n/ko/features/division.feature +0 -11
  252. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -24
  253. data/examples/i18n/ko/lib/calculator.rb +0 -14
  254. data/examples/i18n/lt/Rakefile +0 -6
  255. data/examples/i18n/lt/features/addition.feature +0 -17
  256. data/examples/i18n/lt/features/division.feature +0 -10
  257. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -24
  258. data/examples/i18n/lt/lib/calculator.rb +0 -14
  259. data/examples/i18n/lv/Rakefile +0 -6
  260. data/examples/i18n/lv/features/addition.feature +0 -17
  261. data/examples/i18n/lv/features/division.feature +0 -10
  262. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -24
  263. data/examples/i18n/lv/lib/calculator.rb +0 -14
  264. data/examples/i18n/no/Rakefile +0 -6
  265. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
  266. data/examples/i18n/no/features/summering.feature +0 -19
  267. data/examples/i18n/no/features/support/env.rb +0 -6
  268. data/examples/i18n/no/lib/kalkulator.rb +0 -11
  269. data/examples/i18n/pl/Rakefile +0 -6
  270. data/examples/i18n/pl/features/addition.feature +0 -17
  271. data/examples/i18n/pl/features/division.feature +0 -10
  272. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -24
  273. data/examples/i18n/pl/features/support/env.rb +0 -5
  274. data/examples/i18n/pl/lib/calculator.rb +0 -14
  275. data/examples/i18n/pt/Rakefile +0 -6
  276. data/examples/i18n/pt/features/adicao.feature +0 -11
  277. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
  278. data/examples/i18n/pt/features/support/env.rb +0 -5
  279. data/examples/i18n/pt/lib/calculadora.rb +0 -10
  280. data/examples/i18n/ro/Rakefile +0 -6
  281. data/examples/i18n/ro/features/adunare.feature +0 -12
  282. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -21
  283. data/examples/i18n/ro/lib/calculator.rb +0 -11
  284. data/examples/i18n/ru/Rakefile +0 -6
  285. data/examples/i18n/ru/features/addition.feature +0 -11
  286. data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
  287. data/examples/i18n/ru/features/division.feature +0 -16
  288. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
  289. data/examples/i18n/ru/features/support/env.rb +0 -5
  290. data/examples/i18n/ru/features/support/world.rb +0 -8
  291. data/examples/i18n/ru/lib/calculator.rb +0 -24
  292. data/examples/i18n/sk/Rakefile +0 -6
  293. data/examples/i18n/sk/features/addition.feature +0 -17
  294. data/examples/i18n/sk/features/division.feature +0 -10
  295. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -24
  296. data/examples/i18n/sk/lib/calculator.rb +0 -14
  297. data/examples/i18n/sr-Cyrl/Rakefile +0 -6
  298. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
  299. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
  300. data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -5
  301. data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
  302. data/examples/i18n/sr-Latn/Rakefile +0 -6
  303. data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
  304. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -24
  305. data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
  306. data/examples/i18n/sv/Rakefile +0 -6
  307. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -24
  308. data/examples/i18n/sv/features/summering.feature +0 -18
  309. data/examples/i18n/sv/lib/kalkulator.rb +0 -11
  310. data/examples/i18n/tr/Rakefile +0 -6
  311. data/examples/i18n/tr/features/bolme.feature +0 -10
  312. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -24
  313. data/examples/i18n/tr/features/toplama.feature +0 -18
  314. data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
  315. data/examples/i18n/uk/Rakefile +0 -6
  316. data/examples/i18n/uk/features/addition.feature +0 -11
  317. data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
  318. data/examples/i18n/uk/features/division.feature +0 -16
  319. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
  320. data/examples/i18n/uk/features/support/env.rb +0 -5
  321. data/examples/i18n/uk/features/support/world.rb +0 -8
  322. data/examples/i18n/uk/lib/calculator.rb +0 -24
  323. data/examples/i18n/uz/Rakefile +0 -6
  324. data/examples/i18n/uz/features/addition.feature +0 -10
  325. data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
  326. data/examples/i18n/uz/features/division.feature +0 -17
  327. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
  328. data/examples/i18n/uz/features/support/env.rb +0 -5
  329. data/examples/i18n/uz/features/support/world.rb +0 -8
  330. data/examples/i18n/uz/lib/calculator.rb +0 -24
  331. data/examples/i18n/zh-CN/Rakefile +0 -4
  332. data/examples/i18n/zh-CN/features/addition.feature +0 -18
  333. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -26
  334. data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
  335. data/examples/i18n/zh-TW/Rakefile +0 -4
  336. data/examples/i18n/zh-TW/features/addition.feature +0 -17
  337. data/examples/i18n/zh-TW/features/division.feature +0 -11
  338. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -24
  339. data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
  340. data/examples/rspec_doubles/Rakefile +0 -4
  341. data/examples/rspec_doubles/features/mocking.feature +0 -9
  342. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
  343. data/examples/rspec_doubles/features/support/env.rb +0 -12
  344. data/examples/sinatra/README.textile +0 -13
  345. data/examples/sinatra/Rakefile +0 -6
  346. data/examples/sinatra/app.rb +0 -14
  347. data/examples/sinatra/features/add.feature +0 -11
  348. data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
  349. data/examples/sinatra/features/support/env.rb +0 -10
  350. data/examples/sinatra/views/add.erb +0 -7
  351. data/examples/sinatra/views/layout.erb +0 -8
  352. data/examples/tcl/README.textile +0 -11
  353. data/examples/tcl/Rakefile +0 -6
  354. data/examples/tcl/features/fibonnacci.feature +0 -17
  355. data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
  356. data/examples/tcl/features/support/env.rb +0 -6
  357. data/examples/tcl/src/fib.tcl +0 -3
  358. data/examples/test_unit/Gemfile +0 -4
  359. data/examples/test_unit/Rakefile +0 -6
  360. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
  361. data/examples/test_unit/features/test_unit.feature +0 -9
  362. data/examples/watir/README.textile +0 -16
  363. data/examples/watir/Rakefile +0 -12
  364. data/examples/watir/cucumber.yml +0 -1
  365. data/examples/watir/features/search.feature +0 -12
  366. data/examples/watir/features/step_definitions/search_steps.rb +0 -26
  367. data/examples/watir/features/support/env.rb +0 -35
  368. data/examples/watir/features/support/screenshots.rb +0 -47
  369. data/features/docs/api/list_step_defs_as_json.feature +0 -50
  370. data/features/docs/api/listen_for_events.feature +0 -59
  371. data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -26
  372. data/features/docs/cli/backtraces.feature +0 -36
  373. data/features/docs/cli/dry_run.feature +0 -70
  374. data/features/docs/cli/exclude_files.feature +0 -18
  375. data/features/docs/cli/execute_with_tag_filter.feature +0 -117
  376. data/features/docs/cli/fail_fast.feature +0 -46
  377. data/features/docs/cli/finding_steps.feature +0 -28
  378. data/features/docs/cli/help.feature +0 -8
  379. data/features/docs/cli/randomize.feature +0 -140
  380. data/features/docs/cli/require.feature +0 -27
  381. data/features/docs/cli/retry_failing_tests.feature +0 -67
  382. data/features/docs/cli/run_scenarios_matching_name.feature +0 -104
  383. data/features/docs/cli/run_specific_scenarios.feature +0 -77
  384. data/features/docs/cli/showing_differences.feature +0 -43
  385. data/features/docs/cli/specifying_multiple_formatters.feature +0 -65
  386. data/features/docs/cli/strict_mode.feature +0 -64
  387. data/features/docs/defining_steps/nested_steps.feature +0 -177
  388. data/features/docs/defining_steps/nested_steps_i18n.feature +0 -36
  389. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -54
  390. data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
  391. data/features/docs/defining_steps/printing_messages.feature +0 -147
  392. data/features/docs/defining_steps/skip_scenario.feature +0 -30
  393. data/features/docs/defining_steps/snippets.feature +0 -56
  394. data/features/docs/defining_steps/table_diffing.feature +0 -50
  395. data/features/docs/exception_in_after_hook.feature +0 -126
  396. data/features/docs/exception_in_after_step_hook.feature +0 -102
  397. data/features/docs/exception_in_around_hook.feature +0 -78
  398. data/features/docs/exception_in_before_hook.feature +0 -96
  399. data/features/docs/extending_cucumber/custom_filter.feature +0 -29
  400. data/features/docs/extending_cucumber/custom_formatter.feature +0 -102
  401. data/features/docs/formatters/api_methods.feature +0 -37
  402. data/features/docs/formatters/debug_formatter.feature +0 -47
  403. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  404. data/features/docs/formatters/html_formatter.feature +0 -91
  405. data/features/docs/formatters/json_formatter.feature +0 -767
  406. data/features/docs/formatters/junit_formatter.feature +0 -454
  407. data/features/docs/formatters/pretty_formatter.feature +0 -73
  408. data/features/docs/formatters/progress_formatter.feature +0 -31
  409. data/features/docs/formatters/rerun_formatter.feature +0 -188
  410. data/features/docs/formatters/summary_formatter.feature +0 -34
  411. data/features/docs/formatters/usage_formatter.feature +0 -98
  412. data/features/docs/getting_started.feature +0 -27
  413. data/features/docs/gherkin/background.feature +0 -548
  414. data/features/docs/gherkin/doc_strings.feature +0 -74
  415. data/features/docs/gherkin/expand_option_for_outlines.feature +0 -46
  416. data/features/docs/gherkin/language_from_header.feature +0 -32
  417. data/features/docs/gherkin/language_help.feature +0 -42
  418. data/features/docs/gherkin/outlines.feature +0 -156
  419. data/features/docs/gherkin/unicode_table.feature +0 -32
  420. data/features/docs/gherkin/using_descriptions.feature +0 -82
  421. data/features/docs/gherkin/using_star_notation.feature +0 -37
  422. data/features/docs/iso-8859-1.feature +0 -6
  423. data/features/docs/post_configuration_hook.feature +0 -33
  424. data/features/docs/profiles.feature +0 -120
  425. data/features/docs/rake_task.feature +0 -141
  426. data/features/docs/raketask.feature +0 -44
  427. data/features/docs/work_in_progress.feature +0 -154
  428. data/features/docs/writing_support_code/after_hooks.feature +0 -102
  429. data/features/docs/writing_support_code/after_step_hooks.feature +0 -53
  430. data/features/docs/writing_support_code/around_hooks.feature +0 -260
  431. data/features/docs/writing_support_code/before_hook.feature +0 -65
  432. data/features/docs/writing_support_code/hook_order.feature +0 -61
  433. data/features/docs/writing_support_code/load_path.feature +0 -17
  434. data/features/docs/writing_support_code/state.feature +0 -32
  435. data/features/docs/writing_support_code/tagged_hooks.feature +0 -95
  436. data/features/docs/writing_support_code/transforms.feature +0 -98
  437. data/features/docs/writing_support_code/world.feature +0 -129
  438. data/features/lib/step_definitions/aruba_steps.rb +0 -27
  439. data/features/lib/step_definitions/cli_steps.rb +0 -4
  440. data/features/lib/step_definitions/cucumber_steps.rb +0 -79
  441. data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -13
  442. data/features/lib/step_definitions/json_steps.rb +0 -8
  443. data/features/lib/step_definitions/junit_steps.rb +0 -14
  444. data/features/lib/step_definitions/language_steps.rb +0 -9
  445. data/features/lib/step_definitions/profile_steps.rb +0 -16
  446. data/features/lib/step_definitions/retry_steps.rb +0 -55
  447. data/features/lib/step_definitions/ruby_steps.rb +0 -4
  448. data/features/lib/step_definitions/wire_steps.rb +0 -59
  449. data/features/lib/support/env.rb +0 -22
  450. data/features/lib/support/fake_wire_server.rb +0 -81
  451. data/features/lib/support/feature_factory.rb +0 -68
  452. data/features/lib/support/normalise_output.rb +0 -51
  453. data/gem_tasks/contributors.rake +0 -16
  454. data/gem_tasks/cov.rake +0 -6
  455. data/gem_tasks/cucumber.rake +0 -26
  456. data/gem_tasks/downloads.rb +0 -8
  457. data/gem_tasks/environment.rake +0 -8
  458. data/gem_tasks/examples.rake +0 -12
  459. data/gem_tasks/fix_cr_lf.rake +0 -11
  460. data/gem_tasks/flog.rake +0 -5
  461. data/gem_tasks/rspec.rake +0 -7
  462. data/gem_tasks/sass.rake +0 -5
  463. data/gem_tasks/stats +0 -16
  464. data/gem_tasks/versions.txt +0 -74
  465. data/lib/cucumber/core_ext/instance_exec.rb +0 -71
  466. data/lib/cucumber/formatter/cucumber.css +0 -286
  467. data/lib/cucumber/formatter/cucumber.sass +0 -247
  468. data/lib/cucumber/formatter/debug.rb +0 -36
  469. data/lib/cucumber/formatter/hook_query_visitor.rb +0 -41
  470. data/lib/cucumber/formatter/html.rb +0 -690
  471. data/lib/cucumber/formatter/jquery-min.js +0 -154
  472. data/lib/cucumber/formatter/json_pretty.rb +0 -11
  473. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1012
  474. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -390
  475. data/lib/cucumber/formatter/legacy_api/results.rb +0 -52
  476. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
  477. data/lib/cucumber/rb_support/rb_hook.rb +0 -20
  478. data/lib/cucumber/rb_support/rb_language.rb +0 -227
  479. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -132
  480. data/lib/cucumber/rb_support/rb_transform.rb +0 -60
  481. data/lib/cucumber/rb_support/rb_world.rb +0 -171
  482. data/lib/cucumber/rb_support/snippet.rb +0 -171
  483. data/lib/cucumber/step_argument.rb +0 -26
  484. data/spec/cucumber/cli/configuration_spec.rb +0 -436
  485. data/spec/cucumber/cli/main_spec.rb +0 -84
  486. data/spec/cucumber/cli/options_spec.rb +0 -411
  487. data/spec/cucumber/cli/profile_loader_spec.rb +0 -47
  488. data/spec/cucumber/cli/rerun_spec.rb +0 -86
  489. data/spec/cucumber/configuration_spec.rb +0 -148
  490. data/spec/cucumber/constantize_spec.rb +0 -20
  491. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -5
  492. data/spec/cucumber/file_specs_spec.rb +0 -61
  493. data/spec/cucumber/filters/activate_steps_spec.rb +0 -152
  494. data/spec/cucumber/filters/gated_receiver_spec.rb +0 -48
  495. data/spec/cucumber/filters/retry_spec.rb +0 -85
  496. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -39
  497. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -58
  498. data/spec/cucumber/filters/tag_limits_spec.rb +0 -60
  499. data/spec/cucumber/formatter/ansicolor_spec.rb +0 -33
  500. data/spec/cucumber/formatter/console_counts_spec.rb +0 -14
  501. data/spec/cucumber/formatter/debug_spec.rb +0 -65
  502. data/spec/cucumber/formatter/duration_spec.rb +0 -23
  503. data/spec/cucumber/formatter/fail_fast_spec.rb +0 -88
  504. data/spec/cucumber/formatter/html_spec.rb +0 -543
  505. data/spec/cucumber/formatter/interceptor_spec.rb +0 -137
  506. data/spec/cucumber/formatter/json_spec.rb +0 -842
  507. data/spec/cucumber/formatter/junit_spec.rb +0 -253
  508. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2187
  509. data/spec/cucumber/formatter/pretty_spec.rb +0 -920
  510. data/spec/cucumber/formatter/progress_spec.rb +0 -170
  511. data/spec/cucumber/formatter/rerun_spec.rb +0 -97
  512. data/spec/cucumber/formatter/spec_helper.rb +0 -83
  513. data/spec/cucumber/hooks_spec.rb +0 -31
  514. data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -604
  515. data/spec/cucumber/project_initializer_spec.rb +0 -88
  516. data/spec/cucumber/rake/forked_spec.rb +0 -54
  517. data/spec/cucumber/rake/task_spec.rb +0 -86
  518. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -321
  519. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -200
  520. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -47
  521. data/spec/cucumber/rb_support/rb_world_spec.rb +0 -48
  522. data/spec/cucumber/rb_support/snippet_spec.rb +0 -138
  523. data/spec/cucumber/running_test_case_spec.rb +0 -140
  524. data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -37
  525. data/spec/cucumber/runtime/support_code_spec.rb +0 -17
  526. data/spec/cucumber/runtime_spec.rb +0 -21
  527. data/spec/cucumber/sell_cucumbers.feature +0 -19
  528. data/spec/cucumber/step_argument_spec.rb +0 -19
  529. data/spec/cucumber/step_match_search_spec.rb +0 -123
  530. data/spec/cucumber/step_match_spec.rb +0 -86
  531. data/spec/cucumber/world/pending_spec.rb +0 -48
  532. data/spec/spec_helper.rb +0 -30
  533. data/spec/support/standard_step_actions.rb +0 -19
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'optparse'
3
4
  require 'cucumber'
4
5
  require 'logger'
@@ -13,7 +14,7 @@ module Cucumber
13
14
  end
14
15
  end
15
16
 
16
- def initialize(args, _=nil, out=STDOUT, err=STDERR, kernel=Kernel)
17
+ def initialize(args, _ = nil, out = STDOUT, err = STDERR, kernel = Kernel)
17
18
  @args = args
18
19
  @out = out
19
20
  @err = err
@@ -23,22 +24,15 @@ module Cucumber
23
24
  def execute!(existing_runtime = nil)
24
25
  trap_interrupt
25
26
 
26
- runtime = if existing_runtime
27
- existing_runtime.configure(configuration)
28
- existing_runtime
29
- else
30
- Runtime.new(configuration)
31
- end
27
+ runtime = runtime(existing_runtime)
32
28
 
33
29
  runtime.run!
34
30
  if Cucumber.wants_to_quit
35
31
  exit_unable_to_finish
32
+ elsif runtime.failure?
33
+ exit_tests_failed
36
34
  else
37
- if runtime.failure?
38
- exit_tests_failed
39
- else
40
- exit_ok
41
- end
35
+ exit_ok
42
36
  end
43
37
  rescue SystemExit => e
44
38
  @kernel.exit(e.status)
@@ -47,7 +41,7 @@ module Cucumber
47
41
  @err.puts("Couldn't open #{e.path}")
48
42
  exit_unable_to_finish
49
43
  rescue FeatureFolderNotFoundException => e
50
- @err.puts(e.message + ". You can use `cucumber --init` to get started.")
44
+ @err.puts(e.message + '. You can use `cucumber --init` to get started.')
51
45
  exit_unable_to_finish
52
46
  rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
53
47
  @err.puts(e.message)
@@ -55,7 +49,7 @@ module Cucumber
55
49
  rescue Errno::EACCES, Errno::ENOENT => e
56
50
  @err.puts("#{e.message} (#{e.class})")
57
51
  exit_unable_to_finish
58
- rescue Exception => e
52
+ rescue Exception => e # rubocop:disable Lint/RescueException
59
53
  @err.puts("#{e.message} (#{e.class})")
60
54
  @err.puts(e.backtrace.join("\n"))
61
55
  exit_unable_to_finish
@@ -70,7 +64,6 @@ module Cucumber
70
64
 
71
65
  private
72
66
 
73
-
74
67
  def exit_ok
75
68
  @kernel.exit 0
76
69
  end
@@ -93,8 +86,15 @@ module Cucumber
93
86
  exit_unable_to_finish! if Cucumber.wants_to_quit
94
87
  Cucumber.wants_to_quit = true
95
88
  STDERR.puts "\nExiting... Interrupt again to exit immediately."
89
+ exit_unable_to_finish
96
90
  end
97
91
  end
92
+
93
+ def runtime(existing_runtime)
94
+ return Runtime.new(configuration) unless existing_runtime
95
+ existing_runtime.configure(configuration)
96
+ existing_runtime
97
+ end
98
98
  end
99
99
  end
100
100
  end
@@ -1,60 +1,62 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/cli/profile_loader'
3
4
  require 'cucumber/formatter/ansicolor'
4
- require 'cucumber/rb_support/rb_language'
5
+ require 'cucumber/glue/registry_and_more'
5
6
  require 'cucumber/project_initializer'
7
+ require 'cucumber/core/test/result'
6
8
 
7
9
  module Cucumber
8
10
  module Cli
9
-
10
11
  class Options
11
12
  INDENT = ' ' * 53
12
13
  BUILTIN_FORMATS = {
13
- 'html' => ['Cucumber::Formatter::Html', 'Generates a nice looking HTML report.'],
14
14
  'pretty' => ['Cucumber::Formatter::Pretty', 'Prints the feature as is - in colours.'],
15
15
  'progress' => ['Cucumber::Formatter::Progress', 'Prints one character per scenario.'],
16
16
  'rerun' => ['Cucumber::Formatter::Rerun', 'Prints failing files with line numbers.'],
17
- 'usage' => ['Cucumber::Formatter::Usage', "Prints where step definitions are used.\n" +
18
- "#{INDENT}The slowest step definitions (with duration) are\n" +
19
- "#{INDENT}listed first. If --dry-run is used the duration\n" +
20
- "#{INDENT}is not shown, and step definitions are sorted by\n" +
17
+ 'usage' => ['Cucumber::Formatter::Usage', "Prints where step definitions are used.\n" \
18
+ "#{INDENT}The slowest step definitions (with duration) are\n" \
19
+ "#{INDENT}listed first. If --dry-run is used the duration\n" \
20
+ "#{INDENT}is not shown, and step definitions are sorted by\n" \
21
21
  "#{INDENT}filename instead."],
22
- 'stepdefs' => ['Cucumber::Formatter::Stepdefs', "Prints All step definitions with their locations. Same as\n" +
22
+ 'stepdefs' => ['Cucumber::Formatter::Stepdefs', "Prints All step definitions with their locations. Same as\n" \
23
23
  "#{INDENT}the usage formatter, except that steps are not printed."],
24
24
  'junit' => ['Cucumber::Formatter::Junit', 'Generates a report similar to Ant+JUnit.'],
25
- 'json' => ['Cucumber::Formatter::Json', 'Prints the feature as JSON'],
26
- 'json_pretty' => ['Cucumber::Formatter::JsonPretty', 'Prints the feature as prettified JSON'],
27
- 'debug' => ['Cucumber::Formatter::Debug', 'For developing formatters - prints the calls made to the listeners.'],
28
- 'summary' => ['Cucumber::Formatter::Summary', 'Summary output of feature and scenarios']
29
- }
30
- max = BUILTIN_FORMATS.keys.map{|s| s.length}.max
31
- FORMAT_HELP_MSG = ["Use --format rerun --out rerun.txt to write out failing",
32
- "features. You can rerun them with cucumber @rerun.txt.",
33
- "FORMAT can also be the fully qualified class name of",
25
+ 'json' => ['Cucumber::Formatter::Json', '[DEPRECATED] Prints the feature as JSON'],
26
+ 'message' => ['Cucumber::Formatter::Message', 'Outputs protobuf messages'],
27
+ 'summary' => ['Cucumber::Formatter::Summary', 'Summary output of feature and scenarios']
28
+ }.freeze
29
+ max = BUILTIN_FORMATS.keys.map(&:length).max
30
+ FORMAT_HELP_MSG = [
31
+ 'Use --format rerun --out rerun.txt to write out failing',
32
+ 'features. You can rerun them with cucumber @rerun.txt.',
33
+ 'FORMAT can also be the fully qualified class name of',
34
34
  "your own custom formatter. If the class isn't loaded,",
35
- "Cucumber will attempt to require a file with a relative",
36
- "file name that is the underscore name of the class name.",
37
- "Example: --format Foo::BarZap -> Cucumber will look for",
38
- "foo/bar_zap.rb. You can place the file with this relative",
39
- "path underneath your features/support directory or anywhere",
35
+ 'Cucumber will attempt to require a file with a relative',
36
+ 'file name that is the underscore name of the class name.',
37
+ 'Example: --format Foo::BarZap -> Cucumber will look for',
38
+ 'foo/bar_zap.rb. You can place the file with this relative',
39
+ 'path underneath your features/support directory or anywhere',
40
40
  "on Ruby's LOAD_PATH, for example in a Ruby gem."
41
- ]
41
+ ].freeze
42
42
 
43
43
  FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
44
44
  " #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
45
45
  end) + FORMAT_HELP_MSG
46
- PROFILE_SHORT_FLAG = '-p'
47
- NO_PROFILE_SHORT_FLAG = '-P'
48
- PROFILE_LONG_FLAG = '--profile'
49
- NO_PROFILE_LONG_FLAG = '--no-profile'
50
- FAIL_FAST_FLAG = '--fail-fast'
51
- RETRY_FLAG = '--retry'
52
- OPTIONS_WITH_ARGS = ['-r', '--require', '--i18n', '-f', '--format', '-o', '--out',
53
- '-t', '--tags', '-n', '--name', '-e', '--exclude',
54
- PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG, RETRY_FLAG,
55
- '-l', '--lines', '--port',
56
- '-I', '--snippet-type']
57
- ORDER_TYPES = %w{defined random}
46
+ PROFILE_SHORT_FLAG = '-p'.freeze
47
+ NO_PROFILE_SHORT_FLAG = '-P'.freeze
48
+ PROFILE_LONG_FLAG = '--profile'.freeze
49
+ NO_PROFILE_LONG_FLAG = '--no-profile'.freeze
50
+ FAIL_FAST_FLAG = '--fail-fast'.freeze
51
+ RETRY_FLAG = '--retry'.freeze
52
+ OPTIONS_WITH_ARGS = [
53
+ '-r', '--require', '--i18n-keywords', '-f', '--format', '-o',
54
+ '--out', '-t', '--tags', '-n', '--name', '-e', '--exclude',
55
+ PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG, RETRY_FLAG, '-l',
56
+ '--lines', '--port', '-I', '--snippet-type'
57
+ ].freeze
58
+ ORDER_TYPES = %w[defined random].freeze
59
+ TAG_LIMIT_MATCHER = /(?<tag_name>\@\w+):(?<limit>\d+)/x
58
60
 
59
61
  def self.parse(args, out_stream, error_stream, options = {})
60
62
  new(out_stream, error_stream, options).parse!(args)
@@ -82,70 +84,72 @@ module Cucumber
82
84
  @options[key] = value
83
85
  end
84
86
 
85
- def parse!(args)
87
+ def parse!(args) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
86
88
  @args = args
87
89
  @expanded_args = @args.dup
88
90
 
89
91
  @args.extend(::OptionParser::Arguable)
90
92
 
91
- @args.options do |opts|
93
+ @args.options do |opts| # rubocop:disable Metrics/BlockLength
92
94
  opts.banner = banner
93
- opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR", *require_files_msg) {|lib| require_files(lib) }
95
+ opts.on('-r LIBRARY|DIR', '--require LIBRARY|DIR', *require_files_msg) { |lib| require_files(lib) }
94
96
 
95
- if(Cucumber::JRUBY)
96
- opts.on("-j DIR", "--jars DIR", "Load all the jars under DIR") {|jars| load_jars(jars) }
97
- end
97
+ opts.on('-j DIR', '--jars DIR', 'Load all the jars under DIR') { |jars| load_jars(jars) } if Cucumber::JRUBY
98
98
 
99
- opts.on("#{RETRY_FLAG} ATTEMPTS", *retry_msg) {|v| set_option :retry, v.to_i }
100
- opts.on("--i18n LANG", *i18n_msg) {|lang| set_language lang }
101
- opts.on(FAIL_FAST_FLAG, "Exit immediately following the first failing scenario") { set_option :fail_fast }
102
- opts.on("-f FORMAT", "--format FORMAT", *format_msg, *FORMAT_HELP) {|v| add_option :formats, [v, @out_stream] }
103
- opts.on('--init', *init_msg) {|v| initialize_project }
104
- opts.on("-o", "--out [FILE|DIR]", *out_msg) {|v| set_out_stream v }
105
- opts.on("-t TAG_EXPRESSION", "--tags TAG_EXPRESSION", *tags_msg) {|v| add_option :tag_expressions, v }
106
- opts.on("-n NAME", "--name NAME", *name_msg) {|v| add_option :name_regexps, /#{v}/ }
107
- opts.on("-e", "--exclude PATTERN", *exclude_msg) {|v| add_option :excludes, Regexp.new(v) }
108
- opts.on(PROFILE_SHORT_FLAG, "#{PROFILE_LONG_FLAG} PROFILE", *profile_short_flag_msg) {|v| add_profile v }
109
- opts.on(NO_PROFILE_SHORT_FLAG, NO_PROFILE_LONG_FLAG, *no_profile_short_flag_msg) {|v| disable_profile_loading }
110
- opts.on("-c", "--[no-]color", *color_msg) {|v| set_color v }
111
- opts.on("-d", "--dry-run", *dry_run_msg) { set_dry_run_and_duration }
112
- opts.on("-m", "--no-multiline", "Don't print multiline strings and tables under steps.") { set_option :no_multiline }
113
- opts.on("-s", "--no-source", "Don't print the file and line of the step definition with the steps.") { set_option :source, false }
114
- opts.on("-i", "--no-snippets", "Don't print snippets for pending steps.") { set_option :snippets, false }
115
- opts.on("-I", "--snippet-type TYPE", *snippet_type_msg) {|v| set_option :snippet_type, v.to_sym }
116
- opts.on("-q", "--quiet", "Alias for --no-snippets --no-source.") { shut_up }
117
- opts.on("--no-duration", "Don't print the duration at the end of the summary") { set_option :duration, false }
118
- opts.on("-b", "--backtrace", "Show full backtrace for all errors.") { Cucumber.use_full_backtrace = true }
119
- opts.on("-S", "--strict", "Fail if there are any undefined or pending steps.") { set_option :strict }
120
- opts.on("-w", "--wip", "Fail if there are any passing scenarios.") { set_option :wip }
121
- opts.on("-v", "--verbose", "Show the files and features loaded.") { set_option :verbose }
122
- opts.on("-g", "--guess", "Guess best match for Ambiguous steps.") { set_option :guess }
123
- opts.on("-l", "--lines LINES", *lines_msg) {|lines| set_option :lines, lines }
124
- opts.on("-x", "--expand", "Expand Scenario Outline Tables in output.") { set_option :expand }
125
-
126
- opts.on("--order TYPE[:SEED]", "Run examples in the specified order. Available types:",
127
- *<<-TEXT.split("\n")) do |order|
99
+ opts.on("#{RETRY_FLAG} ATTEMPTS", *retry_msg) { |v| set_option :retry, v.to_i }
100
+ opts.on('--i18n-languages', *i18n_languages_msg) { list_languages_and_exit }
101
+ opts.on('--i18n-keywords LANG', *i18n_keywords_msg) { |lang| language lang }
102
+ opts.on(FAIL_FAST_FLAG, 'Exit immediately following the first failing scenario') { set_option :fail_fast }
103
+ opts.on('-f FORMAT', '--format FORMAT', *format_msg, *FORMAT_HELP) do |v|
104
+ add_option :formats, [*parse_formats(v), @out_stream]
105
+ end
106
+ opts.on('--init', *init_msg) { |_v| initialize_project }
107
+ opts.on('-o', '--out [FILE|DIR]', *out_msg) { |v| out_stream v }
108
+ opts.on('-t TAG_EXPRESSION', '--tags TAG_EXPRESSION', *tags_msg) { |v| add_tag v }
109
+ opts.on('-n NAME', '--name NAME', *name_msg) { |v| add_option :name_regexps, /#{v}/ }
110
+ opts.on('-e', '--exclude PATTERN', *exclude_msg) { |v| add_option :excludes, Regexp.new(v) }
111
+ opts.on(PROFILE_SHORT_FLAG, "#{PROFILE_LONG_FLAG} PROFILE", *profile_short_flag_msg) { |v| add_profile v }
112
+ opts.on(NO_PROFILE_SHORT_FLAG, NO_PROFILE_LONG_FLAG, *no_profile_short_flag_msg) { |_v| disable_profile_loading }
113
+ opts.on('-c', '--[no-]color', *color_msg) { |v| color v }
114
+ opts.on('-d', '--dry-run', *dry_run_msg) { set_dry_run_and_duration }
115
+ opts.on('-m', '--no-multiline', "Don't print multiline strings and tables under steps.") { set_option :no_multiline }
116
+ opts.on('-s', '--no-source', "Don't print the file and line of the step definition with the steps.") { set_option :source, false }
117
+ opts.on('-i', '--no-snippets', "Don't print snippets for pending steps.") { set_option :snippets, false }
118
+ opts.on('-I', '--snippet-type TYPE', *snippet_type_msg) { |v| set_option :snippet_type, v.to_sym }
119
+ opts.on('-q', '--quiet', 'Alias for --no-snippets --no-source.') { shut_up }
120
+ opts.on('--no-duration', "Don't print the duration at the end of the summary") { set_option :duration, false }
121
+ opts.on('-b', '--backtrace', 'Show full backtrace for all errors.') { Cucumber.use_full_backtrace = true }
122
+ opts.on('-S', '--[no-]strict', *strict_msg) { |setting| set_strict(setting) }
123
+ opts.on('--[no-]strict-undefined', 'Fail if there are any undefined results.') { |setting| set_strict(setting, :undefined) }
124
+ opts.on('--[no-]strict-pending', 'Fail if there are any pending results.') { |setting| set_strict(setting, :pending) }
125
+ opts.on('--[no-]strict-flaky', 'Fail if there are any flaky results.') { |setting| set_strict(setting, :flaky) }
126
+ opts.on('-w', '--wip', 'Fail if there are any passing scenarios.') { set_option :wip }
127
+ opts.on('-v', '--verbose', 'Show the files and features loaded.') { set_option :verbose }
128
+ opts.on('-g', '--guess', 'Guess best match for Ambiguous steps.') { set_option :guess }
129
+ opts.on('-l', '--lines LINES', *lines_msg) { |lines| set_option :lines, lines }
130
+ opts.on('-x', '--expand', 'Expand Scenario Outline Tables in output.') { set_option :expand }
131
+
132
+ opts.on('--order TYPE[:SEED]', 'Run examples in the specified order. Available types:',
133
+ *<<-TEXT.split("\n")) do |order|
128
134
  [defined] Run scenarios in the order they were defined (default).
129
135
  [random] Shuffle scenarios before running.
130
136
  Specify SEED to reproduce the shuffling from a previous run.
131
137
  e.g. --order random:5738
132
- TEXT
133
- @options[:order], @options[:seed] = *order.split(":")
134
- unless ORDER_TYPES.include?(@options[:order])
135
- fail "'#{@options[:order]}' is not a recognised order type. Please use one of #{ORDER_TYPES.join(", ")}."
136
- end
138
+ TEXT
139
+ @options[:order], @options[:seed] = *order.split(':')
140
+ raise "'#{@options[:order]}' is not a recognised order type. Please use one of #{ORDER_TYPES.join(', ')}." unless ORDER_TYPES.include?(@options[:order])
137
141
  end
138
142
 
139
- opts.on_tail("--version", "Show version.") { exit_ok(Cucumber::VERSION) }
140
- opts.on_tail("-h", "--help", "You're looking at it.") { exit_ok(opts.help) }
143
+ opts.on_tail('--version', 'Show version.') { exit_ok(Cucumber::VERSION) }
144
+ opts.on_tail('-h', '--help', "You're looking at it.") { exit_ok(opts.help) }
141
145
  end.parse!
142
146
 
143
147
  @args.map! { |a| "#{a}:#{@options[:lines]}" } if @options[:lines]
144
148
 
145
149
  extract_environment_variables
146
- @options[:paths] = @args.dup #whatver is left over
150
+ @options[:paths] = @args.dup # whatver is left over
147
151
 
148
- check_formatter_stream_conflicts()
152
+ check_formatter_stream_conflicts
149
153
 
150
154
  merge_profiles
151
155
 
@@ -160,50 +164,52 @@ TEXT
160
164
  @options[:filters] ||= []
161
165
  end
162
166
 
163
- def check_formatter_stream_conflicts()
164
- streams = @options[:formats].uniq.map { |(_, stream)| stream }
165
- if streams != streams.uniq
166
- raise "All but one formatter must use --out, only one can print to each stream (or STDOUT)"
167
- end
167
+ def check_formatter_stream_conflicts
168
+ streams = @options[:formats].uniq.map { |(_, _, stream)| stream }
169
+ return if streams == streams.uniq
170
+ raise 'All but one formatter must use --out, only one can print to each stream (or STDOUT)'
168
171
  end
169
172
 
170
173
  def to_hash
171
174
  Hash(@options)
172
175
  end
173
176
 
174
- protected
177
+ protected
175
178
 
176
179
  attr_reader :options, :profiles, :expanded_args
177
180
  protected :options, :profiles, :expanded_args
178
181
 
179
- private
182
+ private
180
183
 
181
184
  def color_msg
182
185
  [
183
- "Whether or not to use ANSI color in the output. Cucumber decides",
184
- "based on your platform and the output destination if not specified."
186
+ 'Whether or not to use ANSI color in the output. Cucumber decides',
187
+ 'based on your platform and the output destination if not specified.'
185
188
  ]
186
189
  end
187
190
 
188
191
  def dry_run_msg
189
- [
190
- "Invokes formatters without executing the steps.",
191
- "This also omits the loading of your support/env.rb file if it exists."
192
- ]
192
+ ['Invokes formatters without executing the steps.']
193
193
  end
194
194
 
195
195
  def exclude_msg
196
- [ "Don't run feature files or require ruby files matching PATTERN" ]
196
+ ["Don't run feature files or require ruby files matching PATTERN"]
197
197
  end
198
198
 
199
199
  def format_msg
200
- [ "How to format features (Default: pretty). Available formats:" ]
200
+ ['How to format features (Default: pretty). Available formats:']
201
201
  end
202
202
 
203
- def i18n_msg
203
+ def i18n_languages_msg
204
204
  [
205
- "List keywords for in a particular language",
206
- %{Run with "--i18n help" to see all languages}
205
+ 'List all available languages'
206
+ ]
207
+ end
208
+
209
+ def i18n_keywords_msg
210
+ [
211
+ 'List keywords for in a particular language',
212
+ %(Run with "--i18n help" to see all languages)
207
213
  ]
208
214
  end
209
215
 
@@ -215,7 +221,7 @@ TEXT
215
221
  end
216
222
 
217
223
  def lines_msg
218
- [ "Run given line numbers. Equivalent to FILE:LINE syntax" ]
224
+ ['Run given line numbers. Equivalent to FILE:LINE syntax']
219
225
  end
220
226
 
221
227
  def no_profile_short_flag_msg
@@ -226,112 +232,125 @@ TEXT
226
232
 
227
233
  def profile_short_flag_msg
228
234
  [
229
- "Pull commandline arguments from cucumber.yml which can be defined as",
235
+ 'Pull commandline arguments from cucumber.yml which can be defined as',
230
236
  "strings or arrays. When a 'default' profile is defined and no profile",
231
- "is specified it is always used. (Unless disabled, see -P below.)",
232
- "When feature files are defined in a profile and on the command line",
233
- "then only the ones from the command line are used."
237
+ 'is specified it is always used. (Unless disabled, see -P below.)',
238
+ 'When feature files are defined in a profile and on the command line',
239
+ 'then only the ones from the command line are used.'
234
240
  ]
235
241
  end
236
242
 
237
243
  def retry_msg
238
- [ "Specify the number of times to retry failing tests (default: 0)" ]
244
+ ['Specify the number of times to retry failing tests (default: 0)']
239
245
  end
240
246
 
241
247
  def name_msg
242
248
  [
243
- "Only execute the feature elements which match part of the given name.",
244
- "If this option is given more than once, it will match against all the",
245
- "given names."
249
+ 'Only execute the feature elements which match part of the given name.',
250
+ 'If this option is given more than once, it will match against all the',
251
+ 'given names.'
252
+ ]
253
+ end
254
+
255
+ def strict_msg
256
+ [
257
+ 'Fail if there are any strict affected results ',
258
+ '(that is undefined, pending or flaky results).'
246
259
  ]
247
260
  end
248
261
 
249
- def set_out_stream(v)
250
- @options[:formats] << ['pretty', nil] if @options[:formats].empty?
251
- @options[:formats][-1][1] = v
262
+ def parse_formats(v)
263
+ formatter, *formatter_options = v.split(',')
264
+ options_hash = Hash[formatter_options.map { |s| s.split('=') }]
265
+ [formatter, options_hash]
266
+ end
267
+
268
+ def out_stream(v)
269
+ @options[:formats] << ['pretty', {}, nil] if @options[:formats].empty?
270
+ @options[:formats][-1][2] = v
252
271
  end
253
272
 
254
273
  def tags_msg
255
274
  [
256
- "Only execute the features or scenarios with tags matching TAG_EXPRESSION.",
257
- "Scenarios inherit tags declared on the Feature level. The simplest",
258
- "TAG_EXPRESSION is simply a tag. Example: --tags @dev. When a tag in a tag",
259
- "expression starts with a ~, this represents boolean NOT. Example: --tags ~@dev.",
260
- "A tag expression can have several tags separated by a comma, which represents",
261
- "logical OR. Example: --tags @dev,@wip. The --tags option can be specified",
262
- "several times, and this represents logical AND. Example: --tags @foo,~@bar --tags @zap.",
263
- "This represents the boolean expression (@foo || !@bar) && @zap.",
275
+ 'Only execute the features or scenarios with tags matching TAG_EXPRESSION.',
276
+ 'Scenarios inherit tags declared on the Feature level. The simplest',
277
+ 'TAG_EXPRESSION is simply a tag. Example: --tags @dev. To represent',
278
+ "boolean NOT preceed the tag with 'not '. Example: --tags 'not @dev'.",
279
+ 'A tag expression can have several tags separated by an or which represents',
280
+ "logical OR. Example: --tags '@dev or @wip'. The --tags option can be specified",
281
+ 'A tag expression can have several tags separated by an and which represents',
282
+ "logical AND. Example: --tags '@dev and @wip'. The --tags option can be specified",
283
+ 'several times, and this also represents logical AND.',
284
+ "Example: --tags '@foo or not @bar' --tags @zap. This represents the boolean",
285
+ 'expression (@foo || !@bar) && @zap.',
264
286
  "\n",
265
- "Beware that if you want to use several negative tags to exclude several tags",
266
- "you have to use logical AND: --tags ~@fixme --tags ~@buggy.",
287
+ 'Beware that if you want to use several negative tags to exclude several tags',
288
+ "you have to use logical AND: --tags 'not @fixme and not @buggy'.",
267
289
  "\n",
268
- "Positive tags can be given a threshold to limit the number of occurrences.",
269
- "Example: --tags @qa:3 will fail if there are more than 3 occurrences of the @qa tag.",
270
- "This can be practical if you are practicing Kanban or CONWIP."
290
+ 'Tags can be given a threshold to limit the number of occurrences.',
291
+ 'Example: --tags @qa:3 will fail if there are more than 3 occurrences of the @qa tag.',
292
+ 'This can be practical if you are practicing Kanban or CONWIP.'
271
293
  ]
272
294
  end
273
295
 
274
296
  def out_msg
275
297
  [
276
- "Write output to a file/directory instead of STDOUT. This option",
277
- "applies to the previously specified --format, or the",
278
- "default format if no format is specified. Check the specific",
298
+ 'Write output to a file/directory instead of STDOUT. This option',
299
+ 'applies to the previously specified --format, or the',
300
+ 'default format if no format is specified. Check the specific',
279
301
  "formatter's docs to see whether to pass a file or a dir."
280
302
  ]
281
303
  end
282
304
 
283
305
  def require_files_msg
284
306
  [
285
- "Require files before executing the features. If this",
286
- "option is not specified, all *.rb files that are",
287
- "siblings or below the features will be loaded auto-",
288
- "matically. Automatic loading is disabled when this",
289
- "option is specified, and all loading becomes explicit.",
290
- "Files under directories named \"support\" are always",
291
- "loaded first.",
292
- "This option can be specified multiple times."
307
+ 'Require files before executing the features. If this',
308
+ 'option is not specified, all *.rb files that are',
309
+ 'siblings of or below the features will be loaded auto-',
310
+ 'matically. Automatic loading is disabled when this',
311
+ 'option is specified; all loading becomes explicit.',
312
+ 'Files in directories named "support" are still always',
313
+ 'loaded first when their parent directories are',
314
+ 'required or if the "support" directoires themselves are',
315
+ 'explicitly required.',
316
+ 'This option can be specified multiple times.'
293
317
  ]
294
318
  end
295
319
 
296
320
  def snippet_type_msg
297
321
  [
298
- "Use different snippet type (Default: regexp). Available types:",
299
- Cucumber::RbSupport::RbLanguage.cli_snippet_type_options
322
+ 'Use different snippet type (Default: cucumber_expression). Available types:',
323
+ Cucumber::Glue::RegistryAndMore.cli_snippet_type_options
300
324
  ].flatten
301
325
  end
302
326
 
303
327
  def banner
304
- ["Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+", "",
305
- "Examples:",
306
- "cucumber examples/i18n/en/features",
307
- "cucumber @rerun.txt (See --format rerun)",
308
- "cucumber examples/i18n/it/features/somma.feature:6:98:113",
309
- "cucumber -s -i http://rubyurl.com/eeCl", "", "",
328
+ [
329
+ 'Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+', '',
330
+ 'Examples:',
331
+ 'cucumber examples/i18n/en/features',
332
+ 'cucumber @rerun.txt (See --format rerun)',
333
+ 'cucumber examples/i18n/it/features/somma.feature:6:98:113',
334
+ 'cucumber -s -i http://rubyurl.com/eeCl', '', ''
310
335
  ].join("\n")
311
336
  end
312
337
 
313
338
  def require_files(v)
314
339
  @options[:require] << v
315
- if(Cucumber::JRUBY && File.directory?(v))
316
- require 'java'
317
- $CLASSPATH << v
318
- end
340
+ return unless Cucumber::JRUBY && File.directory?(v)
341
+ require 'java'
342
+ $CLASSPATH << v
319
343
  end
320
344
 
321
345
  def require_jars(jars)
322
- Dir["#{jars}/**/*.jar"].each {|jar| require jar}
346
+ Dir["#{jars}/**/*.jar"].each { |jar| require jar }
323
347
  end
324
348
 
325
- def set_language(lang)
349
+ def language(lang)
326
350
  require 'gherkin/dialect'
327
351
 
328
- if lang == 'help'
329
- list_languages_and_exit
330
- elsif !::Gherkin::DIALECTS.keys.include? lang
331
- indicate_invalid_language_and_exit(lang)
332
- else
333
- list_keywords_and_exit(lang)
334
- end
352
+ return indicate_invalid_language_and_exit(lang) unless ::Gherkin::DIALECTS.key?(lang)
353
+ list_keywords_and_exit(lang)
335
354
  end
336
355
 
337
356
  def disable_profile_loading
@@ -339,14 +358,32 @@ TEXT
339
358
  end
340
359
 
341
360
  def non_stdout_formats
342
- @options[:formats].select {|format, output| output != @out_stream }
361
+ @options[:formats].reject { |_, _, output| output == @out_stream }
343
362
  end
344
363
 
345
364
  def add_option(option, value)
346
365
  @options[option] << value
347
366
  end
348
367
 
349
- def set_color(color)
368
+ def add_tag(value)
369
+ raise("Found tags option '#{value}'. '~@tag' is no longer supported, use 'not @tag' instead.") if value.include?('~')
370
+ raise("Found tags option '#{value}'. '@tag1,@tag2' is no longer supported, use '@tag or @tag2' instead.") if value.include?(',')
371
+ @options[:tag_expressions] << value.gsub(/(@\w+)(:\d+)?/, '\1')
372
+ add_tag_limits(value)
373
+ end
374
+
375
+ def add_tag_limits(value)
376
+ value.split(/[, ]/).map { |part| TAG_LIMIT_MATCHER.match(part) }.compact.each do |matchdata|
377
+ add_tag_limit(@options[:tag_limits], matchdata[:tag_name], matchdata[:limit].to_i)
378
+ end
379
+ end
380
+
381
+ def add_tag_limit(tag_limits, tag_name, limit)
382
+ raise "Inconsistent tag limits for #{tag_name}: #{tag_limits[tag_name]} and #{limit}" if tag_limits[tag_name] && tag_limits[tag_name] != limit
383
+ tag_limits[tag_name] = limit
384
+ end
385
+
386
+ def color(color)
350
387
  Cucumber::Term::ANSIColor.coloring = color
351
388
  end
352
389
 
@@ -358,7 +395,7 @@ TEXT
358
395
  @profiles << p
359
396
  end
360
397
 
361
- def set_option(option, value=nil)
398
+ def set_option(option, value = nil)
362
399
  @options[option] = value.nil? ? true : value
363
400
  end
364
401
 
@@ -378,14 +415,18 @@ TEXT
378
415
  @options[:duration] = false
379
416
  end
380
417
 
418
+ def set_strict(setting, type = nil)
419
+ @options[:strict].set_strict(setting, type)
420
+ end
421
+
381
422
  def stdout_formats
382
- @options[:formats].select {|format, output| output == @out_stream }
423
+ @options[:formats].select { |_, _, output| output == @out_stream }
383
424
  end
384
425
 
385
426
  def extract_environment_variables
386
427
  @args.delete_if do |arg|
387
428
  if arg =~ /^(\w+)=(.*)$/
388
- @options[:env_vars][$1] = $2
429
+ @options[:env_vars][Regexp.last_match(1)] = Regexp.last_match(2)
389
430
  true
390
431
  end
391
432
  end
@@ -397,7 +438,7 @@ TEXT
397
438
 
398
439
  def merge_profiles
399
440
  if @disable_profile_loading
400
- @out_stream.puts "Disabling profiles..."
441
+ @out_stream.puts 'Disabling profiles...'
401
442
  return
402
443
  end
403
444
 
@@ -414,8 +455,8 @@ TEXT
414
455
  profile_args = profile_loader.args_from(profile)
415
456
  profile_options = Options.parse(
416
457
  profile_args, @out_stream, @error_stream,
417
- :skip_profile_information => true,
418
- :profile_loader => profile_loader
458
+ skip_profile_information: true,
459
+ profile_loader: profile_loader
419
460
  )
420
461
  reverse_merge(profile_options)
421
462
  end
@@ -423,19 +464,20 @@ TEXT
423
464
  def default_profile_should_be_used?
424
465
  @profiles.empty? &&
425
466
  profile_loader.cucumber_yml_defined? &&
426
- profile_loader.has_profile?(@default_profile)
467
+ profile_loader.profile?(@default_profile)
427
468
  end
428
469
 
429
470
  def profile_loader
430
471
  @profile_loader ||= ProfileLoader.new
431
472
  end
432
473
 
433
- def reverse_merge(other_options)
474
+ def reverse_merge(other_options) # rubocop:disable Metrics/AbcSize
434
475
  @options = other_options.options.merge(@options)
435
476
  @options[:require] += other_options[:require]
436
477
  @options[:excludes] += other_options[:excludes]
437
478
  @options[:name_regexps] += other_options[:name_regexps]
438
479
  @options[:tag_expressions] += other_options[:tag_expressions]
480
+ merge_tag_limits(@options[:tag_limits], other_options[:tag_limits])
439
481
  @options[:env_vars] = other_options[:env_vars].merge(@options[:env_vars])
440
482
  if @options[:paths].empty?
441
483
  @options[:paths] = other_options[:paths]
@@ -445,7 +487,7 @@ TEXT
445
487
  @options[:source] &= other_options[:source]
446
488
  @options[:snippets] &= other_options[:snippets]
447
489
  @options[:duration] &= other_options[:duration]
448
- @options[:strict] |= other_options[:strict]
490
+ @options[:strict] = other_options[:strict].merge!(@options[:strict])
449
491
  @options[:dry_run] |= other_options[:dry_run]
450
492
 
451
493
  @profiles += other_options.profiles
@@ -458,9 +500,15 @@ TEXT
458
500
  @options[:formats] = stdout_formats[0..0] + non_stdout_formats
459
501
  end
460
502
 
503
+ @options[:retry] = other_options[:retry] if @options[:retry].zero?
504
+
461
505
  self
462
506
  end
463
507
 
508
+ def merge_tag_limits(option_limits, other_limits)
509
+ other_limits.each { |key, value| add_tag_limit(option_limits, key, value) }
510
+ end
511
+
464
512
  def indicate_invalid_language_and_exit(lang)
465
513
  @out_stream.write("Invalid language '#{lang}'. Available languages are:\n")
466
514
  list_languages_and_exit
@@ -470,22 +518,25 @@ TEXT
470
518
  require 'gherkin/dialect'
471
519
  language = ::Gherkin::Dialect.for(lang)
472
520
  data = Cucumber::MultilineArgument::DataTable.from(
473
- [["feature", to_keywords_string(language.feature_keywords)],
474
- ["background", to_keywords_string(language.background_keywords)],
475
- ["scenario", to_keywords_string(language.scenario_keywords)],
476
- ["scenario_outline", to_keywords_string(language.scenario_outline_keywords)],
477
- ["examples", to_keywords_string(language.examples_keywords)],
478
- ["given", to_keywords_string(language.given_keywords)],
479
- ["when", to_keywords_string(language.when_keywords)],
480
- ["then", to_keywords_string(language.then_keywords)],
481
- ["and", to_keywords_string(language.and_keywords)],
482
- ["but", to_keywords_string(language.but_keywords)],
483
- ["given (code)", to_code_keywords_string(language.given_keywords)],
484
- ["when (code)", to_code_keywords_string(language.when_keywords)],
485
- ["then (code)", to_code_keywords_string(language.then_keywords)],
486
- ["and (code)", to_code_keywords_string(language.and_keywords)],
487
- ["but (code)", to_code_keywords_string(language.but_keywords)]])
488
- @out_stream.write(data.to_s({ color: false, prefixes: Hash.new('') }))
521
+ [
522
+ ['feature', to_keywords_string(language.feature_keywords)],
523
+ ['background', to_keywords_string(language.background_keywords)],
524
+ ['scenario', to_keywords_string(language.scenario_keywords)],
525
+ ['scenario_outline', to_keywords_string(language.scenario_outline_keywords)],
526
+ ['examples', to_keywords_string(language.examples_keywords)],
527
+ ['given', to_keywords_string(language.given_keywords)],
528
+ ['when', to_keywords_string(language.when_keywords)],
529
+ ['then', to_keywords_string(language.then_keywords)],
530
+ ['and', to_keywords_string(language.and_keywords)],
531
+ ['but', to_keywords_string(language.but_keywords)],
532
+ ['given (code)', to_code_keywords_string(language.given_keywords)],
533
+ ['when (code)', to_code_keywords_string(language.when_keywords)],
534
+ ['then (code)', to_code_keywords_string(language.then_keywords)],
535
+ ['and (code)', to_code_keywords_string(language.and_keywords)],
536
+ ['but (code)', to_code_keywords_string(language.but_keywords)]
537
+ ]
538
+ )
539
+ @out_stream.write(data.to_s(color: false, prefixes: Hash.new('')))
489
540
  Kernel.exit(0)
490
541
  end
491
542
 
@@ -494,8 +545,9 @@ TEXT
494
545
  data = Cucumber::MultilineArgument::DataTable.from(
495
546
  ::Gherkin::DIALECTS.keys.map do |key|
496
547
  [key, ::Gherkin::DIALECTS[key].fetch('name'), ::Gherkin::DIALECTS[key].fetch('native')]
497
- end)
498
- @out_stream.write(data.to_s({ color: false, prefixes: Hash.new('') }))
548
+ end
549
+ )
550
+ @out_stream.write(data.to_s(color: false, prefixes: Hash.new('')))
499
551
  Kernel.exit(0)
500
552
  end
501
553
 
@@ -509,22 +561,22 @@ TEXT
509
561
 
510
562
  def default_options
511
563
  {
512
- :strict => false,
513
- :require => [],
514
- :dry_run => false,
515
- :formats => [],
516
- :excludes => [],
517
- :tag_expressions => [],
518
- :name_regexps => [],
519
- :env_vars => {},
520
- :diff_enabled => true,
521
- :snippets => true,
522
- :source => true,
523
- :duration => true,
524
- :retry => 0
564
+ strict: Cucumber::Core::Test::Result::StrictConfiguration.new,
565
+ require: [],
566
+ dry_run: false,
567
+ formats: [],
568
+ excludes: [],
569
+ tag_expressions: [],
570
+ tag_limits: {},
571
+ name_regexps: [],
572
+ env_vars: {},
573
+ diff_enabled: true,
574
+ snippets: true,
575
+ source: true,
576
+ duration: true,
577
+ retry: 0
525
578
  }
526
579
  end
527
580
  end
528
-
529
581
  end
530
582
  end