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,5 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
1
  # frozen_string_literal: true
2
+
3
3
  require 'fileutils'
4
4
  require 'multi_json'
5
5
  require 'cucumber/configuration'
@@ -14,12 +14,12 @@ require 'cucumber/step_match_search'
14
14
  module Cucumber
15
15
  module FixRuby21Bug9285
16
16
  def message
17
- String(super).gsub("@ rb_sysopen ", "")
17
+ String(super).gsub('@ rb_sysopen ', '')
18
18
  end
19
19
  end
20
20
 
21
- class FileException < Exception
22
- attr :path
21
+ class FileException < RuntimeError
22
+ attr_reader :path
23
23
 
24
24
  def initialize(original_exception, path)
25
25
  super(original_exception)
@@ -30,8 +30,14 @@ module Cucumber
30
30
  class FileNotFoundException < FileException
31
31
  end
32
32
 
33
- class FeatureFolderNotFoundException < FileException
34
- include FixRuby21Bug9285 if Cucumber::RUBY_2_1 || Cucumber::RUBY_2_2 || Cucumber::RUBY_2_3
33
+ class FeatureFolderNotFoundException < RuntimeError
34
+ def initialize(path)
35
+ @path = path
36
+ end
37
+
38
+ def message
39
+ "No such file or directory - #{@path}"
40
+ end
35
41
  end
36
42
 
37
43
  require 'cucumber/core'
@@ -47,7 +53,6 @@ module Cucumber
47
53
  def initialize(configuration = Configuration.default)
48
54
  @configuration = Configuration.new(configuration)
49
55
  @support_code = SupportCode.new(self, @configuration)
50
- @results = Formatter::LegacyApi::Results.new
51
56
  end
52
57
 
53
58
  # Allows you to take an existing runtime and change its configuration
@@ -58,15 +63,14 @@ module Cucumber
58
63
 
59
64
  require 'cucumber/wire/plugin'
60
65
  def run!
66
+ load_step_definitions
61
67
  install_wire_plugin
62
- load_support_files
63
68
  fire_after_configuration_hook
64
- formatters
65
- load_step_definitions
69
+ # TODO: can we remove this state?
66
70
  self.visitor = report
67
71
 
68
72
  receiver = Test::Runner.new(@configuration.event_bus)
69
- compile features, receiver, filters
73
+ compile features, receiver, filters, @configuration.event_bus
70
74
  @configuration.notify :test_run_finished
71
75
  end
72
76
 
@@ -78,36 +82,27 @@ module Cucumber
78
82
  @configuration.dry_run?
79
83
  end
80
84
 
81
- def scenarios(status = nil)
82
- @results.scenarios(status)
83
- end
84
-
85
- def steps(status = nil)
86
- @results.steps(status)
87
- end
88
-
89
85
  def unmatched_step_definitions
90
86
  @support_code.unmatched_step_definitions
91
87
  end
92
88
 
93
- def begin_scenario(scenario)
94
- @support_code.fire_hook(:begin_scenario, scenario)
89
+ def begin_scenario(test_case)
90
+ @support_code.fire_hook(:begin_scenario, test_case)
95
91
  end
96
92
 
97
- def end_scenario(scenario)
93
+ def end_scenario(_scenario)
98
94
  @support_code.fire_hook(:end_scenario)
99
95
  end
100
96
 
101
97
  # Returns Ast::DocString for +string_without_triple_quotes+.
102
98
  #
103
- def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
104
- location = Core::Ast::Location.of_caller
105
- Core::Ast::DocString.new(string_without_triple_quotes, content_type, location)
99
+ def doc_string(string_without_triple_quotes, content_type = '', _line_offset = 0)
100
+ Core::Test::DocString.new(string_without_triple_quotes, content_type)
106
101
  end
107
102
 
108
- private
103
+ private
109
104
 
110
- def fire_after_configuration_hook #:nodoc
105
+ def fire_after_configuration_hook #:nodoc:
111
106
  @support_code.fire_hook(:after_configuration, @configuration)
112
107
  end
113
108
 
@@ -115,6 +110,7 @@ module Cucumber
115
110
  def features
116
111
  @features ||= feature_files.map do |path|
117
112
  source = NormalisedEncodingFile.read(path)
113
+ @configuration.notify :gherkin_source_read, path, source
118
114
  Cucumber::Core::Gherkin::Document.new(path, source)
119
115
  end
120
116
  end
@@ -136,18 +132,16 @@ module Cucumber
136
132
  end
137
133
 
138
134
  def initialize(path)
139
- begin
140
- @file = File.new(path)
141
- set_encoding
142
- rescue Errno::EACCES => e
143
- raise FileNotFoundException.new(e, File.expand_path(path))
144
- rescue Errno::ENOENT => e
145
- raise FeatureFolderNotFoundException.new(e, path)
146
- end
135
+ @file = File.new(path)
136
+ set_encoding
137
+ rescue Errno::EACCES => e
138
+ raise FileNotFoundException.new(e, File.expand_path(path))
139
+ rescue Errno::ENOENT
140
+ raise FeatureFolderNotFoundException, path
147
141
  end
148
142
 
149
143
  def read
150
- @file.read.encode("UTF-8")
144
+ @file.read.encode('UTF-8')
151
145
  end
152
146
 
153
147
  private
@@ -155,7 +149,7 @@ module Cucumber
155
149
  def set_encoding
156
150
  @file.each do |line|
157
151
  if ENCODING_PATTERN =~ line
158
- @file.set_encoding $1
152
+ @file.set_encoding Regexp.last_match(1)
159
153
  break
160
154
  end
161
155
  break unless COMMENT_OR_EMPTY_LINE_PATTERN =~ line
@@ -164,9 +158,6 @@ module Cucumber
164
158
  end
165
159
  end
166
160
 
167
- require 'cucumber/formatter/legacy_api/adapter'
168
- require 'cucumber/formatter/legacy_api/runtime_facade'
169
- require 'cucumber/formatter/legacy_api/results'
170
161
  require 'cucumber/formatter/ignore_missing_messages'
171
162
  require 'cucumber/formatter/fail_fast'
172
163
  require 'cucumber/core/report/summary'
@@ -186,25 +177,24 @@ module Cucumber
186
177
  end
187
178
 
188
179
  def formatters
189
- @formatters ||= @configuration.formatter_factories { |factory, path_or_io, options|
190
- create_formatter(factory, path_or_io, options)
191
- }
180
+ @formatters ||=
181
+ @configuration.formatter_factories do |factory, formatter_options, path_or_io|
182
+ create_formatter(factory, formatter_options, path_or_io)
183
+ end
192
184
  end
193
185
 
194
- def create_formatter(factory, path_or_io, options)
195
- if !legacy_formatter?(factory)
186
+ def create_formatter(factory, formatter_options, path_or_io)
187
+ if accept_options?(factory)
188
+ return factory.new(@configuration, formatter_options) if path_or_io.nil?
189
+ factory.new(@configuration.with_options(out_stream: path_or_io),
190
+ formatter_options)
191
+ else
196
192
  return factory.new(@configuration) if path_or_io.nil?
197
- return factory.new(@configuration.with_options(out_stream: path_or_io))
193
+ factory.new(@configuration.with_options(out_stream: path_or_io))
198
194
  end
199
- results = Formatter::LegacyApi::Results.new
200
- runtime_facade = Formatter::LegacyApi::RuntimeFacade.new(results, @support_code, @configuration)
201
- formatter = factory.new(runtime_facade, path_or_io, options)
202
- Formatter::LegacyApi::Adapter.new(
203
- Formatter::IgnoreMissingMessages.new(formatter),
204
- results, @configuration)
205
195
  end
206
196
 
207
- def legacy_formatter?(factory)
197
+ def accept_options?(factory)
208
198
  factory.instance_method(:initialize).arity > 1
209
199
  end
210
200
 
@@ -212,14 +202,13 @@ module Cucumber
212
202
  if @configuration.wip?
213
203
  summary_report.test_cases.total_passed > 0
214
204
  else
215
- summary_report.test_cases.total_failed > 0 || summary_report.test_steps.total_failed > 0 ||
216
- (@configuration.strict? && (summary_report.test_steps.total_undefined > 0 || summary_report.test_steps.total_pending > 0))
205
+ !summary_report.ok?(@configuration.strict)
217
206
  end
218
207
  end
219
208
  public :failure?
220
209
 
221
210
  require 'cucumber/core/test/filters'
222
- def filters
211
+ def filters # rubocop:disable Metrics/AbcSize
223
212
  tag_expressions = @configuration.tag_expressions
224
213
  name_regexps = @configuration.name_regexps
225
214
  tag_limits = @configuration.tag_limits
@@ -229,43 +218,36 @@ module Cucumber
229
218
  filters << Cucumber::Core::Test::NameFilter.new(name_regexps)
230
219
  filters << Cucumber::Core::Test::LocationsFilter.new(filespecs.locations)
231
220
  filters << Filters::Randomizer.new(@configuration.seed) if @configuration.randomize?
232
- filters << Filters::Quit.new
233
- filters << Filters::Retry.new(@configuration)
234
- # TODO: can we just use RbLanguages's step definitions directly?
235
- step_match_search = StepMatchSearch.new(@support_code.ruby.method(:step_matches), @configuration)
221
+ # TODO: can we just use Glue::RegistryAndMore's step definitions directly?
222
+ step_match_search = StepMatchSearch.new(@support_code.registry.method(:step_matches), @configuration)
236
223
  filters << Filters::ActivateSteps.new(step_match_search, @configuration)
237
- @configuration.filters.each do |filter|
238
- filters << filter
239
- end
224
+ @configuration.filters.each { |filter| filters << filter }
240
225
  unless configuration.dry_run?
241
226
  filters << Filters::ApplyAfterStepHooks.new(@support_code)
242
227
  filters << Filters::ApplyBeforeHooks.new(@support_code)
243
228
  filters << Filters::ApplyAfterHooks.new(@support_code)
244
229
  filters << Filters::ApplyAroundHooks.new(@support_code)
230
+ filters << Filters::BroadcastTestCaseReadyEvent.new(@configuration)
231
+ filters << Filters::BroadcastTestRunStartedEvent.new(@configuration)
232
+ filters << Filters::Quit.new
233
+ filters << Filters::Retry.new(@configuration)
245
234
  # need to do this last so it becomes the first test step
246
235
  filters << Filters::PrepareWorld.new(self)
247
236
  end
248
237
  end
249
238
  end
250
239
 
251
- def load_support_files
252
- files = @configuration.support_to_load
253
- @support_code.load_files!(files)
254
- end
255
-
256
240
  def load_step_definitions
257
- files = @configuration.step_defs_to_load
241
+ files = @configuration.support_to_load + @configuration.step_defs_to_load
258
242
  @support_code.load_files!(files)
259
243
  end
260
244
 
261
245
  def install_wire_plugin
262
- Cucumber::Wire::Plugin.new(@configuration).install if @configuration.all_files_to_load.any? {|f| f =~ %r{\.wire$} }
246
+ Cucumber::Wire::Plugin.new(@configuration, @support_code.registry).install if @configuration.all_files_to_load.any? { |f| f =~ /\.wire$/ }
263
247
  end
264
248
 
265
249
  def log
266
250
  Cucumber.logger
267
251
  end
268
-
269
252
  end
270
-
271
253
  end
@@ -1,25 +1,30 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  class Runtime
4
5
  class AfterHooks
5
- def initialize(hooks, scenario)
6
+ def initialize(id_generator, hooks, scenario, event_bus)
6
7
  @hooks = hooks
7
8
  @scenario = scenario
9
+ @id_generator = id_generator
10
+ @event_bus = event_bus
8
11
  end
9
12
 
10
13
  def apply_to(test_case)
11
14
  test_case.with_steps(
12
- test_case.test_steps + after_hooks(test_case.source).reverse
15
+ test_case.test_steps + after_hooks.reverse
13
16
  )
14
17
  end
15
18
 
16
19
  private
17
20
 
18
- def after_hooks(source)
21
+ def after_hooks
19
22
  @hooks.map do |hook|
20
23
  action = ->(result) { hook.invoke('After', @scenario.with_result(result)) }
21
- Hooks.after_hook(source, hook.location, &action)
22
- end
24
+ hook_step = Hooks.after_hook(@id_generator.new_id, hook.location, &action)
25
+ @event_bus.hook_test_step_created(hook_step, hook)
26
+ hook_step
27
+ end
23
28
  end
24
29
  end
25
30
  end
@@ -1,26 +1,31 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/hooks'
3
4
 
4
5
  module Cucumber
5
6
  class Runtime
6
7
  class BeforeHooks
7
- def initialize(hooks, scenario)
8
+ def initialize(id_generator, hooks, scenario, event_bus)
8
9
  @hooks = hooks
9
10
  @scenario = scenario
11
+ @id_generator = id_generator
12
+ @event_bus = event_bus
10
13
  end
11
14
 
12
15
  def apply_to(test_case)
13
16
  test_case.with_steps(
14
- before_hooks(test_case.source) + test_case.test_steps
17
+ before_hooks + test_case.test_steps
15
18
  )
16
19
  end
17
20
 
18
21
  private
19
22
 
20
- def before_hooks(source)
23
+ def before_hooks
21
24
  @hooks.map do |hook|
22
25
  action_block = ->(result) { hook.invoke('Before', @scenario.with_result(result)) }
23
- Hooks.before_hook(source, hook.location, &action_block)
26
+ hook_step = Hooks.before_hook(@id_generator.new_id, hook.location, &action_block)
27
+ @event_bus.hook_test_step_created(hook_step, hook)
28
+ hook_step
24
29
  end
25
30
  end
26
31
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'forwardable'
3
- require 'cucumber/core/ast/doc_string'
4
- require 'cucumber/core/ast/data_table'
4
+ require 'cucumber/core/test/doc_string'
5
5
 
6
6
  module Cucumber
7
7
  class Runtime
@@ -15,53 +15,21 @@ module Cucumber
15
15
  attr_reader :support_code
16
16
 
17
17
  def initialize(support_code, user_interface)
18
- @support_code, @user_interface = support_code, user_interface
18
+ @support_code = support_code
19
+ @user_interface = user_interface
19
20
  end
20
21
 
21
22
  def_delegators :@user_interface,
22
- :embed,
23
- :ask,
24
- :puts,
25
- :features_paths,
26
- :step_match
23
+ :embed,
24
+ :attach,
25
+ :ask,
26
+ :puts,
27
+ :features_paths,
28
+ :step_match
27
29
 
28
30
  def_delegators :@support_code,
29
- :invoke_dynamic_steps,
30
- :invoke_dynamic_step,
31
- :load_programming_language
32
-
33
- # Returns a Cucumber::MultilineArgument::DataTable for +text_or_table+, which can either
34
- # be a String:
35
- #
36
- # table(%{
37
- # | account | description | amount |
38
- # | INT-100 | Taxi | 114 |
39
- # | CUC-101 | Peeler | 22 |
40
- # })
41
- #
42
- # or a 2D Array:
43
- #
44
- # table([
45
- # %w{ account description amount },
46
- # %w{ INT-100 Taxi 114 },
47
- # %w{ CUC-101 Peeler 22 }
48
- # ])
49
- #
50
- def table(text_or_table, file=nil, line=0)
51
- if !file
52
- location = Core::Ast::Location.of_caller
53
- else
54
- location = Core::Ast::Location.new(file, line)
55
- end
56
- MultilineArgument::DataTable.from(text_or_table, location)
57
- end
58
-
59
- # Returns a Cucumber::MultilineArgument::DocString for +body+.
60
- #
61
- def doc_string(body, content_type='', line_offset=0)
62
- location = Core::Ast::Location.of_caller
63
- MultilineArgument.doc_string(body, content_type, location)
64
- end
31
+ :invoke_dynamic_steps,
32
+ :invoke_dynamic_step
65
33
  end
66
34
  end
67
35
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  class Runtime
4
5
  class StepHooks
5
- def initialize(hooks)
6
+ def initialize(id_generator, hooks)
6
7
  @hooks = hooks
8
+ @id_generator = id_generator
7
9
  end
8
10
 
9
11
  def apply(test_steps)
@@ -13,10 +15,11 @@ module Cucumber
13
15
  end
14
16
 
15
17
  private
18
+
16
19
  def after_step_hooks(test_step)
17
20
  @hooks.map do |hook|
18
21
  action = ->(*args) { hook.invoke('AfterStep', [args, test_step]) }
19
- Hooks.after_step_hook(test_step.source, hook.location, &action)
22
+ Hooks.after_step_hook(@id_generator.new_id, test_step, hook.location, &action)
20
23
  end
21
24
  end
22
25
  end
@@ -1,22 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/constantize'
3
4
  require 'cucumber/runtime/for_programming_languages'
4
5
  require 'cucumber/runtime/step_hooks'
5
6
  require 'cucumber/runtime/before_hooks'
6
7
  require 'cucumber/runtime/after_hooks'
7
- require 'cucumber/events/step_match'
8
8
  require 'cucumber/gherkin/steps_parser'
9
9
  require 'cucumber/step_match_search'
10
10
 
11
11
  module Cucumber
12
-
13
12
  class Runtime
14
-
15
13
  class SupportCode
16
-
17
14
  require 'forwardable'
18
15
  class StepInvoker
19
-
20
16
  def initialize(support_code)
21
17
  @support_code = support_code
22
18
  end
@@ -26,17 +22,15 @@ module Cucumber
26
22
  end
27
23
 
28
24
  def step(step)
29
- location = Core::Ast::Location.of_caller
25
+ location = Core::Test::Location.of_caller
30
26
  @support_code.invoke_dynamic_step(step[:text], multiline_arg(step, location))
31
27
  end
32
28
 
33
29
  def multiline_arg(step, location)
34
- if argument = step[:argument]
35
- if argument[:type] == :DocString
36
- MultilineArgument.doc_string(argument[:content], argument[:content_type], location)
37
- else
38
- MultilineArgument::DataTable.from(argument[:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
39
- end
30
+ if !step[:doc_string].nil?
31
+ MultilineArgument.from(step[:doc_string][:content], location, step[:doc_string][:content_type])
32
+ elsif !step[:data_table].nil?
33
+ MultilineArgument::DataTable.from(step[:data_table][:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
40
34
  else
41
35
  MultilineArgument.from(nil)
42
36
  end
@@ -45,11 +39,13 @@ module Cucumber
45
39
 
46
40
  include Constantize
47
41
 
48
- attr_reader :ruby
49
- def initialize(user_interface, configuration=Configuration.default)
42
+ attr_reader :registry
43
+
44
+ def initialize(user_interface, configuration = Configuration.default)
50
45
  @configuration = configuration
46
+ # TODO: needs a better name, or inlining its methods
51
47
  @runtime_facade = Runtime::ForProgrammingLanguages.new(self, user_interface)
52
- @ruby = Cucumber::RbSupport::RbLanguage.new(@runtime_facade, @configuration)
48
+ @registry = Cucumber::Glue::RegistryAndMore.new(@runtime_facade, @configuration)
53
49
  end
54
50
 
55
51
  def configure(new_configuration)
@@ -62,8 +58,8 @@ module Cucumber
62
58
  # Given I have 8 cukes in my belly
63
59
  # Then I should not be thirsty
64
60
  # })
65
- def invoke_dynamic_steps(steps_text, i18n, location)
66
- parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), i18n.iso_code)
61
+ def invoke_dynamic_steps(steps_text, iso_code, _location)
62
+ parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), iso_code)
67
63
  parser.parse(steps_text)
68
64
  end
69
65
 
@@ -73,7 +69,7 @@ module Cucumber
73
69
  # steps which are compiled into test steps before execution.
74
70
  #
75
71
  # These are commonly called nested steps.
76
- def invoke_dynamic_step(step_name, multiline_argument, location=nil)
72
+ def invoke_dynamic_step(step_name, multiline_argument, _location = nil)
77
73
  matches = step_matches(step_name)
78
74
  raise UndefinedDynamicStep, step_name if matches.empty?
79
75
  matches.first.invoke(multiline_argument)
@@ -93,40 +89,43 @@ module Cucumber
93
89
  end
94
90
 
95
91
  def unmatched_step_definitions
96
- @ruby.unmatched_step_definitions
92
+ registry.unmatched_step_definitions
97
93
  end
98
94
 
99
95
  def fire_hook(name, *args)
100
- @ruby.send(name, *args)
96
+ # TODO: kill with fire
97
+ registry.send(name, *args)
101
98
  end
102
99
 
103
100
  def step_definitions
104
- @ruby.step_definitions
101
+ registry.step_definitions
105
102
  end
106
103
 
107
104
  def find_after_step_hooks(test_case)
108
105
  scenario = RunningTestCase.new(test_case)
109
- hooks = @ruby.hooks_for(:after_step, scenario)
110
- StepHooks.new hooks
106
+ hooks = registry.hooks_for(:after_step, scenario)
107
+ StepHooks.new(@configuration.id_generator, hooks)
111
108
  end
112
109
 
113
110
  def apply_before_hooks(test_case)
111
+ return test_case if test_case.test_steps.empty?
114
112
  scenario = RunningTestCase.new(test_case)
115
- hooks = @ruby.hooks_for(:before, scenario)
116
- BeforeHooks.new(hooks, scenario).apply_to(test_case)
113
+ hooks = registry.hooks_for(:before, scenario)
114
+ BeforeHooks.new(@configuration.id_generator, hooks, scenario, @configuration.event_bus).apply_to(test_case)
117
115
  end
118
116
 
119
117
  def apply_after_hooks(test_case)
118
+ return test_case if test_case.test_steps.empty?
120
119
  scenario = RunningTestCase.new(test_case)
121
- hooks = @ruby.hooks_for(:after, scenario)
122
- AfterHooks.new(hooks, scenario).apply_to(test_case)
120
+ hooks = registry.hooks_for(:after, scenario)
121
+ AfterHooks.new(@configuration.id_generator, hooks, scenario, @configuration.event_bus).apply_to(test_case)
123
122
  end
124
123
 
125
124
  def find_around_hooks(test_case)
126
125
  scenario = RunningTestCase.new(test_case)
127
126
 
128
- @ruby.hooks_for(:around, scenario).map do |hook|
129
- Hooks.around_hook(test_case.source) do |run_scenario|
127
+ registry.hooks_for(:around, scenario).map do |hook|
128
+ Hooks.around_hook do |run_scenario|
130
129
  hook.invoke('Around', scenario, &run_scenario)
131
130
  end
132
131
  end
@@ -135,18 +134,17 @@ module Cucumber
135
134
  private
136
135
 
137
136
  def step_matches(step_name)
138
- StepMatchSearch.new(@ruby.method(:step_matches), @configuration).call(step_name)
137
+ StepMatchSearch.new(registry.method(:step_matches), @configuration).call(step_name)
139
138
  end
140
139
 
141
140
  def load_file(file)
142
141
  log.debug(" * #{file}\n")
143
- @ruby.load_code_file(file)
142
+ registry.load_code_file(file)
144
143
  end
145
144
 
146
145
  def log
147
146
  Cucumber.logger
148
147
  end
149
-
150
148
  end
151
149
  end
152
150
  end