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
@@ -0,0 +1,21 @@
1
+ module Cucumber
2
+ module Glue
3
+ class WorldFactory
4
+ def initialize(proc)
5
+ @proc = proc || -> { Object.new }
6
+ end
7
+
8
+ def create_world
9
+ @proc.call || raise_nil_world
10
+ end
11
+
12
+ def raise_nil_world
13
+ raise NilWorld
14
+ rescue NilWorld => e
15
+ e.backtrace.clear
16
+ e.backtrace.push(Glue.backtrace_line(@proc, 'World'))
17
+ raise e
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,38 +1,37 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'pathname'
3
- require 'cucumber/core/ast/location'
4
+ require 'cucumber/core/test/location'
4
5
  require 'cucumber/core/test/around_hook'
5
6
 
6
7
  module Cucumber
7
-
8
8
  # Hooks quack enough like `Cucumber::Core::Ast` source nodes that we can use them as
9
9
  # source for test steps
10
10
  module Hooks
11
-
12
11
  class << self
13
- def before_hook(source, location, &block)
14
- build_hook_step(source, location, block, BeforeHook, Core::Test::UnskippableAction)
12
+ def before_hook(id, location, &block)
13
+ build_hook_step(id, location, block, BeforeHook, Core::Test::UnskippableAction)
15
14
  end
16
15
 
17
- def after_hook(source, location, &block)
18
- build_hook_step(source, location, block, AfterHook, Core::Test::UnskippableAction)
16
+ def after_hook(id, location, &block)
17
+ build_hook_step(id, location, block, AfterHook, Core::Test::UnskippableAction)
19
18
  end
20
19
 
21
- def after_step_hook(source, location, &block)
22
- raise ArgumentError unless source.last.kind_of?(Core::Ast::Step)
23
- build_hook_step(source, location, block, AfterStepHook, Core::Test::Action)
20
+ def after_step_hook(id, test_step, location, &block)
21
+ raise ArgumentError if test_step.hook?
22
+ build_hook_step(id, location, block, AfterStepHook, Core::Test::Action)
24
23
  end
25
24
 
26
- def around_hook(source, &block)
25
+ def around_hook(&block)
27
26
  Core::Test::AroundHook.new(&block)
28
27
  end
29
28
 
30
29
  private
31
30
 
32
- def build_hook_step(source, location, block, hook_type, action_type)
31
+ def build_hook_step(id, location, block, hook_type, action_type)
33
32
  action = action_type.new(location, &block)
34
33
  hook = hook_type.new(action.location)
35
- Core::Test::Step.new(source + [hook], action)
34
+ Core::Test::HookStep.new(id, hook.text, location, action)
36
35
  end
37
36
  end
38
37
 
@@ -43,8 +42,12 @@ module Cucumber
43
42
  @location = location
44
43
  end
45
44
 
46
- def name
47
- "After hook"
45
+ def text
46
+ 'After hook'
47
+ end
48
+
49
+ def to_s
50
+ "#{text} at #{location}"
48
51
  end
49
52
 
50
53
  def match_locations?(queried_locations)
@@ -63,8 +66,12 @@ module Cucumber
63
66
  @location = location
64
67
  end
65
68
 
66
- def name
67
- "Before hook"
69
+ def text
70
+ 'Before hook'
71
+ end
72
+
73
+ def to_s
74
+ "#{text} at #{location}"
68
75
  end
69
76
 
70
77
  def match_locations?(queried_locations)
@@ -83,8 +90,12 @@ module Cucumber
83
90
  @location = location
84
91
  end
85
92
 
86
- def name
87
- "AfterStep hook"
93
+ def text
94
+ 'AfterStep hook'
95
+ end
96
+
97
+ def to_s
98
+ "#{text} at #{location}"
88
99
  end
89
100
 
90
101
  def match_locations?(queried_locations)
@@ -95,6 +106,5 @@ module Cucumber
95
106
  visitor.after_step_hook(self, *args)
96
107
  end
97
108
  end
98
-
99
109
  end
100
110
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module LoadPath
4
5
  def add_dirs(*dirs)
@@ -1,24 +1,24 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'delegate'
3
4
  require 'cucumber/multiline_argument/data_table'
4
5
  require 'cucumber/multiline_argument/doc_string'
5
6
 
6
7
  module Cucumber
7
8
  module MultilineArgument
8
-
9
9
  class << self
10
10
  def from_core(node)
11
11
  builder.wrap(node)
12
12
  end
13
13
 
14
- def from(argument, location=nil)
15
- location ||= Core::Ast::Location.of_caller
14
+ def from(argument, location = nil, content_type = nil)
15
+ location ||= Core::Test::Location.of_caller
16
16
  case argument
17
17
  when String
18
- doc_string(argument, 'text/plain', location)
18
+ builder.doc_string(Core::Test::DocString.new(argument, content_type))
19
19
  when Array
20
20
  location = location.on_line(argument.first.line..argument.last.line)
21
- data_table(argument.map{ |row| row.cells }, location)
21
+ builder.data_table(argument.map(&:cells), location)
22
22
  when DataTable, DocString, None
23
23
  argument
24
24
  when nil
@@ -28,14 +28,6 @@ module Cucumber
28
28
  end
29
29
  end
30
30
 
31
- def doc_string(argument, content_type, location)
32
- builder.doc_string(Core::Ast::DocString.new(argument, content_type, location))
33
- end
34
-
35
- def data_table(data, location)
36
- builder.data_table(Core::Ast::DataTable.new(data, location))
37
- end
38
-
39
31
  private
40
32
 
41
33
  def builder
@@ -49,22 +41,20 @@ module Cucumber
49
41
  @result
50
42
  end
51
43
 
52
- def doc_string(node, *args)
44
+ def doc_string(node, *_args)
53
45
  @result = DocString.new(node)
54
46
  end
55
47
 
56
- def data_table(node, *args)
48
+ def data_table(node, *_args)
57
49
  @result = DataTable.new(node)
58
50
  end
59
51
  end
60
52
  end
61
53
 
62
54
  class None
63
- def append_to(array)
64
- end
55
+ def append_to(array); end
65
56
 
66
- def describe_to(visitor)
67
- end
57
+ def describe_to(visitor); end
68
58
  end
69
59
  end
70
60
  end
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'forwardable'
3
4
  require 'cucumber/gherkin/data_table_parser'
4
5
  require 'cucumber/gherkin/formatter/escaping'
5
- require 'cucumber/core/ast/describes_itself'
6
+ require 'cucumber/multiline_argument/data_table/diff_matrices'
6
7
 
7
8
  module Cucumber
8
9
  module MultilineArgument
@@ -26,72 +27,62 @@ module Cucumber
26
27
  # This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
27
28
  #
28
29
  class DataTable
29
- class Different < StandardError
30
- def initialize(table)
31
- super("Tables were not identical:\n#{table}")
32
- end
33
- end
34
-
35
- class Builder
36
- attr_reader :rows
37
-
38
- def initialize
39
- @rows = []
40
- end
41
-
42
- def row(row)
43
- @rows << row
44
- end
45
-
46
- def eof
47
- end
30
+ def self.default_arg_name #:nodoc:
31
+ 'table'
48
32
  end
49
33
 
50
- include Enumerable
51
- include Core::Ast::DescribesItself
52
- extend Forwardable
53
-
54
- NULL_CONVERSIONS = Hash.new({ :strict => false, :proc => lambda{ |cell_value| cell_value } }).freeze
55
-
56
- attr_accessor :file
57
- def_delegator :@ast_table, :location
58
-
59
- def self.default_arg_name #:nodoc:
60
- "table"
34
+ def describe_to(visitor, *args)
35
+ visitor.legacy_table(self, *args)
61
36
  end
62
37
 
63
38
  class << self
64
- def from(data, location = Core::Ast::Location.of_caller)
39
+ def from(data)
65
40
  case data
66
41
  when Array
67
- from_array(data, location)
42
+ from_array(data)
68
43
  when String
69
- parse(data, location)
44
+ parse(data)
70
45
  else
71
- raise ArgumentError, "expected data to be a String or an Array."
46
+ raise ArgumentError, 'expected data to be a String or an Array.'
72
47
  end
73
48
  end
74
49
 
75
50
  private
76
- def parse(text, location = Core::Ast::Location.of_caller)
51
+
52
+ def parse(text)
77
53
  builder = Builder.new
78
54
  parser = Cucumber::Gherkin::DataTableParser.new(builder)
79
55
  parser.parse(text)
80
- from_array(builder.rows, location)
56
+ from_array(builder.rows)
81
57
  end
82
58
 
83
- def from_array(data, location = Core::Ast::Location.of_caller)
84
- new Core::Ast::DataTable.new(data, location)
59
+ def from_array(data)
60
+ new Core::Test::DataTable.new(data)
85
61
  end
86
62
  end
87
63
 
64
+ class Builder
65
+ attr_reader :rows
66
+
67
+ def initialize
68
+ @rows = []
69
+ end
70
+
71
+ def row(row)
72
+ @rows << row
73
+ end
74
+
75
+ def eof; end
76
+ end
77
+
78
+ NULL_CONVERSIONS = Hash.new(strict: false, proc: ->(cell_value) { cell_value }).freeze
88
79
 
89
- # @param data [Core::Ast::DataTable] the data for the table
80
+ # @param data [Core::Test::DataTable] the data for the table
90
81
  # @param conversion_procs [Hash] see map_columns!
91
82
  # @param header_mappings [Hash] see map_headers!
92
83
  # @param header_conversion_proc [Proc] see map_headers!
93
84
  def initialize(data, conversion_procs = NULL_CONVERSIONS.dup, header_mappings = {}, header_conversion_proc = nil)
94
- raise ArgumentError, "data must be a Core::Ast::DataTable" unless data.kind_of? Core::Ast::DataTable
85
+ raise ArgumentError, 'data must be a Core::Test::DataTable' unless data.is_a? Core::Test::DataTable
95
86
  ast_table = data
96
87
  # Verify that it's square
97
88
  ast_table.transpose
@@ -110,11 +101,17 @@ module Cucumber
110
101
  dup
111
102
  end
112
103
 
104
+ attr_accessor :file
105
+
106
+ def location
107
+ @ast_table.location
108
+ end
109
+
113
110
  # Creates a copy of this table, inheriting any column and header mappings
114
111
  # registered with #map_column! and #map_headers!.
115
112
  #
116
113
  def dup
117
- self.class.new(Core::Ast::DataTable.new(raw, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
114
+ self.class.new(Core::Test::DataTable.new(raw), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
118
115
  end
119
116
 
120
117
  # Returns a new, transposed table. Example:
@@ -129,7 +126,7 @@ module Cucumber
129
126
  # | 4 | 2 |
130
127
  #
131
128
  def transpose
132
- self.class.new(Core::Ast::DataTable.new(raw.transpose, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
129
+ self.class.new(Core::Test::DataTable.new(raw.transpose), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
133
130
  end
134
131
 
135
132
  # Converts this table into an Array of Hash where the keys of each
@@ -162,8 +159,10 @@ module Cucumber
162
159
  # [{:foo => '2', :bar => '3', :foo_bar => '5'}, {:foo => '7', :bar => '9', :foo_bar => '16'}]
163
160
  #
164
161
  def symbolic_hashes
165
- @header_conversion_proc = lambda { |h| symbolize_key(h) }
166
- @symbolic_hashes ||= build_hashes
162
+ @symbolic_hashes ||=
163
+ hashes.map do |string_hash|
164
+ Hash[string_hash.map { |a, b| [symbolize_key(a), b] }]
165
+ end
167
166
  end
168
167
 
169
168
  # Converts this table into a Hash where the first column is
@@ -181,7 +180,7 @@ module Cucumber
181
180
  def rows_hash
182
181
  return @rows_hash if @rows_hash
183
182
  verify_table_width(2)
184
- @rows_hash = self.transpose.hashes[0]
183
+ @rows_hash = transpose.hashes[0]
185
184
  end
186
185
 
187
186
  # Gets the raw data of this table. For example, a Table built from
@@ -196,14 +195,12 @@ module Cucumber
196
195
  #
197
196
  def raw
198
197
  cell_matrix.map do |row|
199
- row.map do |cell|
200
- cell.value
201
- end
198
+ row.map(&:value)
202
199
  end
203
200
  end
204
201
 
205
202
  def column_names #:nodoc:
206
- @col_names ||= cell_matrix[0].map { |cell| cell.value }
203
+ @column_names ||= cell_matrix[0].map(&:value)
207
204
  end
208
205
 
209
206
  def rows
@@ -263,7 +260,7 @@ module Cucumber
263
260
  # table.hashes.keys
264
261
  # # => ['phone number', 'ADDRESS']
265
262
  #
266
- def map_headers!(mappings={}, &block)
263
+ def map_headers!(mappings = {}, &block)
267
264
  # TODO: Remove this method for 2.0
268
265
  clear_cache!
269
266
  @header_mappings = mappings
@@ -271,8 +268,8 @@ module Cucumber
271
268
  end
272
269
 
273
270
  # Returns a new Table where the headers are redefined. See #map_headers!
274
- def map_headers(mappings={}, &block)
275
- self.class.new(Core::Ast::DataTable.new(raw, location), @conversion_procs.dup, mappings, block)
271
+ def map_headers(mappings = {}, &block)
272
+ self.class.new(Core::Test::DataTable.new(raw), @conversion_procs.dup, mappings, block)
276
273
  end
277
274
 
278
275
  # Change how #hashes converts column values. The +column_name+ argument identifies the column
@@ -287,17 +284,17 @@ module Cucumber
287
284
  # end
288
285
  # end
289
286
  #
290
- def map_column!(column_name, strict=true, &conversion_proc)
287
+ def map_column!(column_name, strict = true, &conversion_proc)
291
288
  # TODO: Remove this method for 2.0
292
- @conversion_procs[column_name.to_s] = { :strict => strict, :proc => conversion_proc }
289
+ @conversion_procs[column_name.to_s] = { strict: strict, proc: conversion_proc }
293
290
  self
294
291
  end
295
292
 
296
293
  # Returns a new Table with an additional column mapping. See #map_column!
297
- def map_column(column_name, strict=true, &conversion_proc)
294
+ def map_column(column_name, strict = true, &conversion_proc)
298
295
  conversion_procs = @conversion_procs.dup
299
- conversion_procs[column_name.to_s] = { :strict => strict, :proc => conversion_proc }
300
- self.class.new(Core::Ast::DataTable.new(raw, location), conversion_procs, @header_mappings.dup, @header_conversion_proc)
296
+ conversion_procs[column_name.to_s] = { strict: strict, proc: conversion_proc }
297
+ self.class.new(Core::Test::DataTable.new(raw), conversion_procs, @header_mappings.dup, @header_conversion_proc)
301
298
  end
302
299
 
303
300
  # Compares +other_table+ to self. If +other_table+ contains columns
@@ -336,86 +333,32 @@ module Cucumber
336
333
  # Calling this method is particularly useful in <tt>Then</tt> steps that take
337
334
  # a Table argument, if you want to compare that table to some actual values.
338
335
  #
339
- def diff!(other_table, options={})
340
- options = {
341
- :missing_row => true,
342
- :surplus_row => true,
343
- :missing_col => true,
344
- :surplus_col => false,
345
- :misplaced_col => false
346
- }.merge(options)
347
-
336
+ def diff!(other_table, options = {})
348
337
  other_table = ensure_table(other_table)
349
338
  other_table.convert_headers!
350
339
  other_table.convert_columns!
351
- ensure_green!
352
340
 
353
341
  convert_headers!
354
342
  convert_columns!
355
343
 
356
- original_width = cell_matrix[0].length
357
- @cell_matrix, other_table_cell_matrix = pad_and_match(@cell_matrix, other_table.cell_matrix)
358
- padded_width = cell_matrix[0].length
359
-
360
- missing_col = cell_matrix[0].detect{|cell| cell.status == :undefined}
361
- surplus_col = padded_width > original_width
362
- misplaced_col = cell_matrix[0] != other_table.cell_matrix[0]
363
-
364
- require_diff_lcs
365
- cell_matrix.extend(Diff::LCS)
366
- changes = cell_matrix.diff(other_table_cell_matrix).flatten
367
-
368
- inserted = 0
369
- missing = 0
370
-
371
- row_indices = Array.new(other_table_cell_matrix.length) {|n| n}
372
-
373
- last_change = nil
374
- missing_row_pos = nil
375
- insert_row_pos = nil
376
-
377
- changes.each do |change|
378
- if(change.action == '-')
379
- missing_row_pos = change.position + inserted
380
- cell_matrix[missing_row_pos].each{|cell| cell.status = :undefined}
381
- row_indices.insert(missing_row_pos, nil)
382
- missing += 1
383
- else # '+'
384
- insert_row_pos = change.position + missing
385
- inserted_row = change.element
386
- inserted_row.each{|cell| cell.status = :comment}
387
- cell_matrix.insert(insert_row_pos, inserted_row)
388
- row_indices[insert_row_pos] = nil
389
- inspect_rows(cell_matrix[missing_row_pos], inserted_row) if last_change && last_change.action == '-'
390
- inserted += 1
391
- end
392
- last_change = change
393
- end
344
+ DiffMatrices.new(cell_matrix, other_table.cell_matrix, options).call
345
+ end
394
346
 
395
- other_table_cell_matrix.each_with_index do |other_row, i|
396
- row_index = row_indices.index(i)
397
- row = cell_matrix[row_index] if row_index
398
- if row
399
- (original_width..padded_width).each do |col_index|
400
- surplus_cell = other_row[col_index]
401
- row[col_index].value = surplus_cell.value if row[col_index]
402
- end
403
- end
347
+ class Different < StandardError
348
+ attr_reader :table
349
+ def initialize(table)
350
+ @table = table
351
+ super("Tables were not identical:\n#{table}")
404
352
  end
353
+ end
405
354
 
406
- clear_cache!
407
- should_raise =
408
- missing_row_pos && options[:missing_row] ||
409
- insert_row_pos && options[:surplus_row] ||
410
- missing_col && options[:missing_col] ||
411
- surplus_col && options[:surplus_col] ||
412
- misplaced_col && options[:misplaced_col]
413
- raise Different.new(self) if should_raise
355
+ def to_hash
356
+ cells_rows.map { |cells| cells.map(&:value) }
414
357
  end
415
358
 
416
- def to_hash(cells) #:nodoc:
417
- hash = Hash.new do |hash, key|
418
- hash[key.to_s] if key.is_a?(Symbol)
359
+ def cells_to_hash(cells) #:nodoc:
360
+ hash = Hash.new do |hash_inner, key|
361
+ hash_inner[key.to_s] if key.is_a?(Symbol)
419
362
  end
420
363
  column_names.each_with_index do |column_name, column_index|
421
364
  hash[column_name] = cells.value(column_index)
@@ -428,19 +371,21 @@ module Cucumber
428
371
  end
429
372
 
430
373
  def verify_column(column_name) #:nodoc:
431
- raise %{The column named "#{column_name}" does not exist} unless raw[0].include?(column_name)
374
+ raise %(The column named "#{column_name}" does not exist) unless raw[0].include?(column_name)
432
375
  end
433
376
 
434
377
  def verify_table_width(width) #:nodoc:
435
- raise %{The table must have exactly #{width} columns} unless raw[0].size == width
378
+ raise %(The table must have exactly #{width} columns) unless raw[0].size == width
436
379
  end
437
380
 
438
- def has_text?(text) #:nodoc:
439
- raw.flatten.compact.detect{|cell_value| cell_value.index(text)}
381
+ # TODO: remove the below function if it's not actually being used.
382
+ # Nothing else in this repo calls it.
383
+ def text?(text) #:nodoc:
384
+ raw.flatten.compact.detect { |cell_value| cell_value.index(text) }
440
385
  end
441
386
 
442
387
  def cells_rows #:nodoc:
443
- @rows ||= cell_matrix.map do |cell_row|
388
+ @rows ||= cell_matrix.map do |cell_row| # rubocop:disable Naming/MemoizedInstanceVariableName
444
389
  Cells.new(self, cell_row)
445
390
  end
446
391
  end
@@ -453,35 +398,55 @@ module Cucumber
453
398
  cells_rows[0][col]
454
399
  end
455
400
 
456
- def cell_matrix #:nodoc:
457
- @cell_matrix
458
- end
401
+ attr_reader :cell_matrix
459
402
 
460
403
  def col_width(col) #:nodoc:
461
404
  columns[col].__send__(:width)
462
405
  end
463
406
 
464
407
  def to_s(options = {}) #:nodoc:
465
- # TODO: factor out this code so we don't depend on such a big lump of old cruft
466
- require 'cucumber/formatter/pretty'
467
- require 'cucumber/formatter/legacy_api/adapter'
468
- options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
469
- io = StringIO.new
470
-
471
- c = Cucumber::Term::ANSIColor.coloring?
472
- Cucumber::Term::ANSIColor.coloring = options[:color]
473
- runtime = Struct.new(:configuration).new(Configuration.new)
474
- formatter = Formatter::Pretty.new(runtime, io, options)
475
- formatter.instance_variable_set('@indent', options[:indent])
476
- Formatter::LegacyApi::Ast::MultilineArg.for(self).accept(Formatter::Fanout.new([formatter]))
477
- Cucumber::Term::ANSIColor.coloring = c
478
- io.rewind
479
- s = "\n" + io.read + (" " * (options[:indent] - 2))
480
- s
408
+ indentation = options.key?(:indent) ? options[:indent] : 2
409
+ prefixes = options.key?(:prefixes) ? options[:prefixes] : TO_S_PREFIXES
410
+ DataTablePrinter.new(self, indentation, prefixes).to_s
481
411
  end
482
412
 
483
- def description_for_visitors
484
- :legacy_table
413
+ class DataTablePrinter #:nodoc:
414
+ include Cucumber::Gherkin::Formatter::Escaping
415
+ attr_reader :data_table, :indentation, :prefixes
416
+ private :data_table, :indentation, :prefixes
417
+
418
+ def initialize(data_table, indentation, prefixes)
419
+ @data_table = data_table
420
+ @indentation = indentation
421
+ @prefixes = prefixes
422
+ end
423
+
424
+ def to_s
425
+ leading_row = "\n"
426
+ end_indentation = indentation - 2
427
+ trailing_row = "\n" + (' ' * end_indentation)
428
+ table_rows = data_table.cell_matrix.map { |row| format_row(row) }
429
+ leading_row + table_rows.join("\n") + trailing_row
430
+ end
431
+
432
+ private
433
+
434
+ def format_row(row)
435
+ row_start = (' ' * indentation) + '| '
436
+ row_end = '|'
437
+ cells = row.map.with_index do |cell, i|
438
+ format_cell(cell, data_table.col_width(i))
439
+ end
440
+ row_start + cells.join('| ') + row_end
441
+ end
442
+
443
+ def format_cell(cell, col_width)
444
+ cell_text = escape_cell(cell.value.to_s)
445
+ cell_text_width = cell_text.unpack('U*').length
446
+ padded_text = cell_text + (' ' * (col_width - cell_text_width))
447
+ prefix = prefixes[cell.status]
448
+ "#{prefix}#{padded_text} "
449
+ end
485
450
  end
486
451
 
487
452
  def columns #:nodoc:
@@ -494,35 +459,26 @@ module Cucumber
494
459
  raw.to_json(*args)
495
460
  end
496
461
 
497
- private
498
-
499
462
  TO_S_PREFIXES = Hash.new(' ')
500
463
  TO_S_PREFIXES[:comment] = '(+) '
501
464
  TO_S_PREFIXES[:undefined] = '(-) '
465
+ private_constant :TO_S_PREFIXES
502
466
 
503
467
  protected
504
468
 
505
469
  def build_hashes
506
470
  convert_headers!
507
471
  convert_columns!
508
- cells_rows[1..-1].map do |row|
509
- row.to_hash
510
- end
511
- end
512
-
513
- def inspect_rows(missing_row, inserted_row) #:nodoc:
514
- missing_row.each_with_index do |missing_cell, col|
515
- inserted_cell = inserted_row[col]
516
- if(missing_cell.value != inserted_cell.value && (missing_cell.value.to_s == inserted_cell.value.to_s))
517
- missing_cell.inspect!
518
- inserted_cell.inspect!
519
- end
520
- end
472
+ cells_rows[1..-1].map(&:to_hash)
521
473
  end
522
474
 
523
475
  def create_cell_matrix(ast_table) #:nodoc:
524
476
  ast_table.raw.map do |raw_row|
525
- line = raw_row.line rescue -1
477
+ line = begin
478
+ raw_row.line
479
+ rescue StandardError
480
+ -1
481
+ end
526
482
  raw_row.map do |raw_cell|
527
483
  Cell.new(raw_cell, self, line)
528
484
  end
@@ -547,94 +503,28 @@ module Cucumber
547
503
  header_cells = cell_matrix[0]
548
504
 
549
505
  if @header_conversion_proc
550
- header_values = header_cells.map { |cell| cell.value } - @header_mappings.keys
506
+ header_values = header_cells.map(&:value) - @header_mappings.keys
551
507
  @header_mappings = @header_mappings.merge(Hash[*header_values.zip(header_values.map(&@header_conversion_proc)).flatten])
552
508
  end
553
509
 
554
510
  @header_mappings.each_pair do |pre, post|
555
- mapped_cells = header_cells.select { |cell| pre === cell.value }
511
+ mapped_cells = header_cells.reject { |cell| cell.value.match(pre).nil? }
556
512
  raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
557
- raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map { |c| c.value }.inspect}" if mapped_cells.length > 1
513
+ raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map(&:value).inspect}" if mapped_cells.length > 1
558
514
  mapped_cells[0].value = post
559
- if @conversion_procs.has_key?(pre)
560
- @conversion_procs[post] = @conversion_procs.delete(pre)
561
- end
562
- end
563
- end
564
-
565
- def require_diff_lcs #:nodoc:
566
- begin
567
- require 'diff/lcs'
568
- rescue LoadError => e
569
- e.message << "\n Please gem install diff-lcs\n"
570
- raise e
515
+ @conversion_procs[post] = @conversion_procs.delete(pre) if @conversion_procs.key?(pre)
571
516
  end
572
517
  end
573
518
 
574
519
  def clear_cache! #:nodoc:
575
- @hashes = @rows_hash = @col_names = @rows = @columns = nil
576
- end
577
-
578
- # Pads two cell matrices to same column width and matches columns according to header value.
579
- # The first cell matrix is the reference matrix with the second matrix matched against it.
580
- def pad_and_match(a_cell_matrix, other_cell_matrix) #:nodoc:
581
- clear_cache!
582
- cols = a_cell_matrix.transpose
583
- unmatched_cols = other_cell_matrix.transpose
584
-
585
-
586
- header_values = cols.map(&:first)
587
- matched_cols = []
588
-
589
- header_values.each_with_index do |v, i|
590
- mapped_index = unmatched_cols.index{|unmapped_col| unmapped_col.first == v}
591
- if (mapped_index)
592
- matched_cols << unmatched_cols.delete_at(mapped_index)
593
- else
594
- mark_as_missing(cols[i])
595
- empty_col = other_cell_matrix.collect {SurplusCell.new(nil, self, -1)}
596
- empty_col.first.value = v
597
- matched_cols << empty_col
598
- end
599
- end
600
-
601
-
602
- empty_col = cell_matrix.collect {SurplusCell.new(nil, self, -1)}
603
- unmatched_cols.each do
604
- cols << empty_col
605
- end
606
-
607
- return cols.transpose, (matched_cols + unmatched_cols).transpose
520
+ @hashes = @rows_hash = @column_names = @rows = @columns = nil
608
521
  end
609
522
 
610
523
  def ensure_table(table_or_array) #:nodoc:
611
- return table_or_array if DataTable === table_or_array
524
+ return table_or_array if DataTable == table_or_array.class
612
525
  DataTable.from(table_or_array)
613
526
  end
614
527
 
615
- def ensure_array_of_array(array)
616
- Hash === array[0] ? hashes_to_array(array) : array
617
- end
618
-
619
- def hashes_to_array(hashes) #:nodoc:
620
- header = hashes[0].keys.sort
621
- [header] + hashes.map{|hash| header.map{|key| hash[key]}}
622
- end
623
-
624
- def ensure_green! #:nodoc:
625
- each_cell{|cell| cell.status = :passed}
626
- end
627
-
628
- def each_cell(&proc) #:nodoc:
629
- cell_matrix.each{|row| row.each(&proc)}
630
- end
631
-
632
- def mark_as_missing(col) #:nodoc:
633
- col.each do |cell|
634
- cell.status = :undefined
635
- end
636
- end
637
-
638
528
  def symbolize_key(key)
639
529
  key.downcase.tr(' ', '_').to_sym
640
530
  end
@@ -647,7 +537,8 @@ module Cucumber
647
537
  attr_reader :exception
648
538
 
649
539
  def initialize(table, cells)
650
- @table, @cells = table, cells
540
+ @table = table
541
+ @cells = cells
651
542
  end
652
543
 
653
544
  def accept(visitor)
@@ -660,11 +551,11 @@ module Cucumber
660
551
 
661
552
  # For testing only
662
553
  def to_sexp #:nodoc:
663
- [:row, line, *@cells.map{|cell| cell.to_sexp}]
554
+ [:row, line, *@cells.map(&:to_sexp)]
664
555
  end
665
556
 
666
557
  def to_hash #:nodoc:
667
- @to_hash ||= @table.to_hash(self)
558
+ @to_hash ||= @table.cells_to_hash(self)
668
559
  end
669
560
 
670
561
  def value(n) #:nodoc:
@@ -694,7 +585,7 @@ module Cucumber
694
585
  end
695
586
 
696
587
  def width
697
- map{|cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0}.max
588
+ map { |cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0 }.max
698
589
  end
699
590
  end
700
591
 
@@ -703,19 +594,21 @@ module Cucumber
703
594
  attr_accessor :status, :value
704
595
 
705
596
  def initialize(value, table, line)
706
- @value, @table, @line = value, table, line
597
+ @value = value
598
+ @table = table
599
+ @line = line
707
600
  end
708
601
 
709
602
  def inspect!
710
603
  @value = "(i) #{value.inspect}"
711
604
  end
712
605
 
713
- def ==(o)
714
- SurplusCell === o || value == o.value
606
+ def ==(other)
607
+ SurplusCell == other.class || value == other.value
715
608
  end
716
609
 
717
- def eql?(o)
718
- self == o
610
+ def eql?(other)
611
+ self == other
719
612
  end
720
613
 
721
614
  def hash
@@ -733,7 +626,7 @@ module Cucumber
733
626
  :comment
734
627
  end
735
628
 
736
- def ==(o)
629
+ def ==(_other)
737
630
  true
738
631
  end
739
632