cucumber 3.0.0.pre.2 → 4.0.0.rc.5

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