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,20 +0,0 @@
1
- # frozen_string_literal: true
2
- module Cucumber
3
- module RbSupport
4
- # Wrapper for Before, After and AfterStep hooks
5
- class RbHook
6
- attr_reader :tag_expressions, :location
7
-
8
- def initialize(rb_language, tag_expressions, proc)
9
- @rb_language = rb_language
10
- @tag_expressions = tag_expressions
11
- @proc = proc
12
- @location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
13
- end
14
-
15
- def invoke(pseudo_method, arguments, &block)
16
- @rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].flatten.compact, &@proc)
17
- end
18
- end
19
- end
20
- end
@@ -1,227 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'cucumber/core_ext/instance_exec'
3
- require 'cucumber/rb_support/rb_dsl'
4
- require 'cucumber/rb_support/rb_world'
5
- require 'cucumber/rb_support/rb_step_definition'
6
- require 'cucumber/rb_support/rb_hook'
7
- require 'cucumber/rb_support/rb_transform'
8
- require 'cucumber/rb_support/snippet'
9
- require 'cucumber/gherkin/i18n'
10
- require 'multi_test'
11
- require 'cucumber/step_match'
12
- require 'cucumber/step_definition_light'
13
- require 'cucumber/events/step_definition_registered'
14
-
15
- module Cucumber
16
- module RbSupport
17
- # Raised if a World block returns Nil.
18
- class NilWorld < StandardError
19
- def initialize
20
- super("World procs should never return nil")
21
- end
22
- end
23
-
24
- # Raised if there are 2 or more World blocks.
25
- class MultipleWorld < StandardError
26
- def initialize(first_proc, second_proc)
27
- message = String.new
28
- message << "You can only pass a proc to #World once, but it's happening\n"
29
- message << "in 2 places:\n\n"
30
- message << RbSupport.backtrace_line(first_proc, 'World') << "\n"
31
- message << RbSupport.backtrace_line(second_proc, 'World') << "\n\n"
32
- message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
33
- message << "or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.\n\n"
34
- super(message)
35
- end
36
- end
37
-
38
- # The Ruby implementation of the programming language API.
39
- class RbLanguage
40
- attr_reader :current_world,
41
- :step_definitions
42
-
43
- all_keywords = ::Gherkin::DIALECTS.keys.map do |dialect_name|
44
- dialect = ::Gherkin::Dialect.for(dialect_name)
45
- dialect.given_keywords + dialect.when_keywords + dialect.then_keywords + dialect.and_keywords + dialect.but_keywords
46
- end
47
- Cucumber::Gherkin::I18n.code_keywords_for(all_keywords.flatten.uniq.sort).each do |adverb|
48
- RbDsl.alias_adverb(adverb.strip)
49
- end
50
-
51
- def initialize(runtime, configuration)
52
- @runtime, @configuration = runtime, configuration
53
- @step_definitions = []
54
- RbDsl.rb_language = self
55
- @world_proc = @world_modules = nil
56
- @configuration.register_snippet_generator(Snippet::Generator.new)
57
- end
58
-
59
- def step_matches(name_to_match)
60
- @step_definitions.reduce([]) { |result, step_definition|
61
- if (arguments = step_definition.arguments_from(name_to_match))
62
- result << StepMatch.new(step_definition, name_to_match, arguments)
63
- end
64
- result
65
- }
66
- end
67
-
68
- def begin_rb_scenario(scenario)
69
- create_world
70
- extend_world
71
- connect_world(scenario)
72
- end
73
-
74
- def register_rb_hook(phase, tag_expressions, proc)
75
- add_hook(phase, RbHook.new(self, tag_expressions, proc))
76
- end
77
-
78
- def register_rb_transform(regexp, proc)
79
- add_transform(RbTransform.new(self, regexp, proc))
80
- end
81
-
82
- def register_rb_step_definition(regexp, proc_or_sym, options)
83
- step_definition = RbStepDefinition.new(self, regexp, proc_or_sym, options)
84
- @step_definitions << step_definition
85
- @configuration.notify :step_definition_registered, step_definition
86
- step_definition
87
- end
88
-
89
- def build_rb_world_factory(world_modules, namespaced_world_modules, proc)
90
- if proc
91
- raise MultipleWorld.new(@world_proc, proc) if @world_proc
92
- @world_proc = proc
93
- end
94
- @world_modules ||= []
95
- @world_modules += world_modules
96
-
97
- @namespaced_world_modules ||= Hash.new { |h, k| h[k] = [] }
98
- namespaced_world_modules.each do |namespace, world_module|
99
- unless @namespaced_world_modules[namespace].include?(world_module)
100
- @namespaced_world_modules[namespace] << world_module
101
- end
102
- end
103
- end
104
-
105
- def load_code_file(code_file)
106
- return unless File.extname(code_file) == ".rb"
107
- load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
108
- end
109
-
110
- def begin_scenario(scenario)
111
- begin_rb_scenario(scenario)
112
- end
113
-
114
- def end_scenario
115
- @current_world = nil
116
- end
117
-
118
- def after_configuration(configuration)
119
- hooks[:after_configuration].each do |hook|
120
- hook.invoke('AfterConfiguration', configuration)
121
- end
122
- end
123
-
124
- def execute_transforms(args)
125
- args.map do |arg|
126
- matching_transform = transforms.detect {|transform| transform.match(arg) }
127
- matching_transform ? matching_transform.invoke(arg) : arg
128
- end
129
- end
130
-
131
- def add_hook(phase, hook)
132
- hooks[phase.to_sym] << hook
133
- hook
134
- end
135
-
136
- def clear_hooks
137
- @hooks = nil
138
- end
139
-
140
- def add_transform(transform)
141
- transforms.unshift transform
142
- transform
143
- end
144
-
145
- def hooks_for(phase, scenario) #:nodoc:
146
- hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
147
- end
148
-
149
- def unmatched_step_definitions
150
- available_step_definition_hash.keys - invoked_step_definition_hash.keys
151
- end
152
-
153
- def available_step_definition(regexp_source, file_colon_line)
154
- available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
155
- end
156
-
157
- def invoked_step_definition(regexp_source, file_colon_line)
158
- invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
159
- end
160
-
161
- private
162
-
163
- def available_step_definition_hash
164
- @available_step_definition_hash ||= {}
165
- end
166
-
167
- def invoked_step_definition_hash
168
- @invoked_step_definition_hash ||= {}
169
- end
170
-
171
- def hooks
172
- @hooks ||= Hash.new{|h,k| h[k] = []}
173
- end
174
-
175
- def transforms
176
- @transforms ||= []
177
- end
178
-
179
- def create_world
180
- if(@world_proc)
181
- @current_world = @world_proc.call
182
- check_nil(@current_world, @world_proc)
183
- else
184
- @current_world = Object.new
185
- end
186
- end
187
-
188
- def extend_world
189
- @current_world.extend(RbWorld)
190
- MultiTest.extend_with_best_assertion_library(@current_world)
191
-
192
- @current_world.add_modules!(@world_modules || [],
193
- @namespaced_world_modules || {})
194
- end
195
-
196
- def connect_world(scenario)
197
- @current_world.__cucumber_runtime = @runtime
198
- @current_world.__natural_language = scenario.language
199
- end
200
-
201
- def check_nil(o, proc)
202
- if o.nil?
203
- begin
204
- raise NilWorld.new
205
- rescue NilWorld => e
206
- e.backtrace.clear
207
- e.backtrace.push(RbSupport.backtrace_line(proc, "World"))
208
- raise e
209
- end
210
- else
211
- o
212
- end
213
- end
214
-
215
- def self.cli_snippet_type_options
216
- Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
217
- Snippet::SNIPPET_TYPES[type].cli_option_string(type)
218
- end
219
- end
220
- end
221
-
222
- def self.backtrace_line(proc, name)
223
- location = Cucumber::Core::Ast::Location.from_source_location(*proc.source_location)
224
- "#{location.to_s}:in `#{name}'"
225
- end
226
- end
227
- end
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'cucumber/step_match'
3
- require 'cucumber/step_argument'
4
- require 'cucumber/core_ext/string'
5
-
6
- module Cucumber
7
- module RbSupport
8
- # A Ruby Step Definition holds a Regexp and a Proc, and is created
9
- # by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
10
- # in the <tt>step_definitions</tt> ruby files. See also RbDsl.
11
- #
12
- # Example:
13
- #
14
- # Given /I have (\d+) cucumbers in my belly/ do
15
- # # some code here
16
- # end
17
- #
18
- class RbStepDefinition
19
-
20
- class MissingProc < StandardError
21
- def message
22
- "Step definitions must always have a proc or symbol"
23
- end
24
- end
25
-
26
- class << self
27
- def new(rb_language, pattern, proc_or_sym, options)
28
- raise MissingProc if proc_or_sym.nil?
29
- super rb_language, parse_pattern(pattern), create_proc(proc_or_sym, options)
30
- end
31
-
32
- private
33
-
34
- def parse_pattern(pattern)
35
- return pattern if pattern.is_a?(Regexp)
36
- raise ArgumentError unless pattern.is_a?(String)
37
- p = Regexp.escape(pattern)
38
- p = p.gsub(/\\\$\w+/, '(.*)') # Replace $var with (.*)
39
- Regexp.new("^#{p}$")
40
- end
41
-
42
- def create_proc(proc_or_sym, options)
43
- return proc_or_sym if proc_or_sym.is_a?(Proc)
44
- raise ArgumentError unless proc_or_sym.is_a?(Symbol)
45
- message = proc_or_sym
46
- target_proc = parse_target_proc_from(options)
47
- patch_location_onto lambda { |*args|
48
- target = instance_exec(&target_proc)
49
- target.send(message, *args)
50
- }
51
- end
52
-
53
- def patch_location_onto(block)
54
- location = Core::Ast::Location.of_caller(5)
55
- block.define_singleton_method(:source_location) { [location.file, location.line] }
56
- block
57
- end
58
-
59
- def parse_target_proc_from(options)
60
- return lambda { self } unless options.key?(:on)
61
- target = options[:on]
62
- case target
63
- when Proc
64
- target
65
- when Symbol
66
- lambda { self.send(target) }
67
- else
68
- lambda { raise ArgumentError, "Target must be a symbol or a proc" }
69
- end
70
- end
71
- end
72
-
73
- def initialize(rb_language, regexp, proc)
74
- @rb_language, @regexp, @proc = rb_language, regexp, proc
75
- @rb_language.available_step_definition(regexp_source, location)
76
- end
77
-
78
- def regexp_source
79
- @regexp.inspect
80
- end
81
-
82
- def to_hash
83
- flags = ''
84
- flags += 'm' if (@regexp.options & Regexp::MULTILINE) != 0
85
- flags += 'i' if (@regexp.options & Regexp::IGNORECASE) != 0
86
- flags += 'x' if (@regexp.options & Regexp::EXTENDED) != 0
87
- {'source' => @regexp.source, 'flags' => flags}
88
- end
89
-
90
- def ==(step_definition)
91
- regexp_source == step_definition.regexp_source
92
- end
93
-
94
- def arguments_from(step_name)
95
- args = StepArgument.arguments_from(@regexp, step_name)
96
- @rb_language.invoked_step_definition(regexp_source, location) if args
97
- args
98
- end
99
-
100
- def invoke(args)
101
- begin
102
- args = @rb_language.execute_transforms(args)
103
- @rb_language.current_world.cucumber_instance_exec(true, regexp_source, *args, &@proc)
104
- rescue Cucumber::ArityMismatchError => e
105
- e.backtrace.unshift(self.backtrace_line)
106
- raise e
107
- end
108
- end
109
-
110
- def backtrace_line
111
- "#{location.to_s}:in `#{regexp_source}'"
112
- end
113
-
114
- def file_colon_line
115
- case @proc
116
- when Proc
117
- location.to_s
118
- when Symbol
119
- ":#{@proc}"
120
- end
121
- end
122
-
123
- def location
124
- @location ||= Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
125
- end
126
-
127
- def file
128
- @file ||= location.file
129
- end
130
- end
131
- end
132
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
- module Cucumber
3
- module RbSupport
4
- # A Ruby Transform holds a Regexp and a Proc, and is created
5
- # by calling <tt>Transform in the <tt>support</tt> ruby files.
6
- # See also RbDsl.
7
- #
8
- # Example:
9
- #
10
- # Transform /^(\d+) cucumbers$/ do |cucumbers_string|
11
- # cucumbers_string.to_i
12
- # end
13
- #
14
- class RbTransform
15
- class MissingProc < StandardError
16
- def message
17
- "Transforms must always have a proc with at least one argument"
18
- end
19
- end
20
-
21
- def initialize(rb_language, pattern, proc)
22
- raise MissingProc if proc.nil? || proc.arity < 1
23
- @rb_language, @regexp, @proc = rb_language, Regexp.new(pattern), proc
24
- end
25
-
26
- def match(arg)
27
- arg ? arg.match(@regexp) : nil
28
- end
29
-
30
- def invoke(arg)
31
- if matched = match(arg)
32
- args = matched.captures.empty? ? [arg] : matched.captures
33
- @rb_language.current_world.cucumber_instance_exec(true, @regexp.inspect, *args, &@proc)
34
- end
35
- end
36
-
37
- def to_s
38
- convert_captures(strip_anchors(@regexp.source))
39
- end
40
-
41
- private
42
- def convert_captures(regexp_source)
43
- regexp_source
44
- .gsub(/(\()(?!\?[<:=!])/,'(?:')
45
- .gsub(/(\(\?<)(?![=!])/,'(?:<')
46
- end
47
-
48
- def strip_captures(regexp_source)
49
- regexp_source.
50
- gsub(/(\()/, '').
51
- gsub(/(\))/, '')
52
- end
53
-
54
- def strip_anchors(regexp_source)
55
- regexp_source.
56
- gsub(/(^\^|\$$)/, '')
57
- end
58
- end
59
- end
60
- end
@@ -1,171 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'cucumber/gherkin/formatter/ansi_escapes'
3
-
4
- module Cucumber
5
- module RbSupport
6
- # Defines the basic DSL methods availlable in all Cucumber step definitions.
7
- #
8
- # You can, and probably should, extend this DSL with your own methods that
9
- # make sense in your domain. For more on that, see {Cucumber::RbSupport::RbDsl#World}
10
- module RbWorld
11
-
12
- # @private
13
- AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
14
-
15
- # Call a Transform with a string from another Transform definition
16
- def Transform(arg)
17
- rb = @__cucumber_runtime.support_code.ruby
18
- rb.execute_transforms([arg]).first
19
- end
20
-
21
- # @private
22
- attr_writer :__cucumber_runtime, :__natural_language
23
-
24
- # Extend the World with user-defined modules
25
- def add_modules!(world_modules, namespaced_world_modules)
26
- add_world_modules!(world_modules)
27
- add_namespaced_modules!(namespaced_world_modules)
28
- end
29
-
30
- # Run a single Gherkin step
31
- # @example Call another step
32
- # step "I am logged in"
33
- # @example Call a step with quotes in the name
34
- # step %{the user "Dave" is logged in}
35
- # @example Passing a table
36
- # step "the following users exist:", table(%{
37
- # | name | email |
38
- # | Matt | matt@matt.com |
39
- # | Aslak | aslak@aslak.com |
40
- # })
41
- # @example Passing a multiline string
42
- # step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
43
- # @param [String] name The name of the step
44
- # @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
45
- def step(name, raw_multiline_arg=nil)
46
- location = Core::Ast::Location.of_caller
47
- @__cucumber_runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
48
- end
49
-
50
- # Run a snippet of Gherkin
51
- # @example
52
- # steps %{
53
- # Given the user "Susan" exists
54
- # And I am logged in as "Susan"
55
- # }
56
- # @param [String] steps_text The Gherkin snippet to run
57
- def steps(steps_text)
58
- location = Core::Ast::Location.of_caller
59
- @__cucumber_runtime.invoke_dynamic_steps(steps_text, @__natural_language, location)
60
- end
61
-
62
- # Parse Gherkin into a {Cucumber::Ast::Table} object.
63
- #
64
- # Useful in conjunction with the #step method.
65
- # @example Create a table
66
- # users = table(%{
67
- # | name | email |
68
- # | Matt | matt@matt.com |
69
- # | Aslak | aslak@aslak.com |
70
- # })
71
- # @param [String] text_or_table The Gherkin string that represents the table
72
- def table(text_or_table, file=nil, line_offset=0)
73
- @__cucumber_runtime.table(text_or_table, file, line_offset)
74
- end
75
-
76
- # Print a message to the output.
77
- #
78
- # @note Cucumber might surprise you with the behaviour of this method. Instead
79
- # of sending the output directly to STDOUT, Cucumber will intercept and cache
80
- # the message until the current step has finished, and then display it.
81
- #
82
- # If you'd prefer to see the message immediately, call {Kernel.puts} instead.
83
- def puts(*messages)
84
- # Even though they won't be output until later, converting the messages to
85
- # strings right away will protect them from modifications to their original
86
- # objects in the mean time
87
- messages.collect! { |message| "#{message}" }
88
-
89
- @__cucumber_runtime.puts(*messages)
90
- end
91
-
92
- # Pause the tests and ask the operator for input
93
- def ask(question, timeout_seconds=60)
94
- @__cucumber_runtime.ask(question, timeout_seconds)
95
- end
96
-
97
- # Embed an image in the output
98
- def embed(file, mime_type, label='Screenshot')
99
- @__cucumber_runtime.embed(file, mime_type, label)
100
- end
101
-
102
- # Mark the matched step as pending.
103
- def pending(message = "TODO")
104
- if block_given?
105
- begin
106
- yield
107
- rescue Exception
108
- raise Pending, message
109
- end
110
- raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
111
- else
112
- raise Pending, message
113
- end
114
- end
115
-
116
- # Skips this step and the remaining steps in the scenario
117
- def skip_this_scenario(message = "Scenario skipped")
118
- raise Core::Test::Result::Skipped, message
119
- end
120
-
121
- # Prints the list of modules that are included in the World
122
- def inspect
123
- modules = [self.class]
124
- (class << self; self; end).instance_eval do
125
- modules += included_modules
126
- end
127
- modules << stringify_namespaced_modules
128
- sprintf("#<%s:0x%x>", modules.join('+'), self.object_id)
129
- end
130
-
131
- # see {#inspect}
132
- def to_s
133
- inspect
134
- end
135
-
136
- private
137
-
138
- # @private
139
- def add_world_modules!(modules)
140
- modules.each do |world_module|
141
- extend(world_module)
142
- end
143
- end
144
-
145
- # @private
146
- def add_namespaced_modules!(modules)
147
- @__namespaced_modules = modules
148
- modules.each do |namespace, world_modules|
149
- world_modules.each do |world_module|
150
- variable_name = "@__#{namespace}_world"
151
-
152
- inner_world = if self.class.respond_to?(namespace)
153
- instance_variable_get(variable_name)
154
- else
155
- Object.new
156
- end
157
- instance_variable_set(variable_name,
158
- inner_world.extend(world_module))
159
- self.class.send(:define_method, namespace) do
160
- instance_variable_get(variable_name)
161
- end
162
- end
163
- end
164
- end
165
-
166
- def stringify_namespaced_modules
167
- @__namespaced_modules.map { |k, v| "#{v.join(',')} (as #{k})" }.join('+')
168
- end
169
- end
170
- end
171
- end