cucumber 2.0.0.rc.4 → 4.0.0.rc.2

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 (518) hide show
  1. checksums.yaml +5 -5
  2. data/{History.md → CHANGELOG.md} +734 -283
  3. data/CONTRIBUTING.md +26 -23
  4. data/LICENSE +1 -1
  5. data/README.md +25 -8
  6. data/bin/cucumber +3 -3
  7. data/lib/autotest/cucumber.rb +2 -0
  8. data/lib/autotest/cucumber_mixin.rb +45 -48
  9. data/lib/autotest/cucumber_rails.rb +2 -0
  10. data/lib/autotest/cucumber_rails_rspec.rb +2 -0
  11. data/lib/autotest/cucumber_rails_rspec2.rb +2 -0
  12. data/lib/autotest/cucumber_rspec.rb +2 -0
  13. data/lib/autotest/cucumber_rspec2.rb +2 -0
  14. data/lib/autotest/discover.rb +4 -2
  15. data/lib/cucumber.rb +3 -9
  16. data/lib/cucumber/cli/configuration.rb +23 -106
  17. data/lib/cucumber/cli/main.rb +45 -25
  18. data/lib/cucumber/cli/options.rb +411 -223
  19. data/lib/cucumber/cli/profile_loader.rb +64 -38
  20. data/lib/cucumber/cli/rerun_file.rb +31 -0
  21. data/lib/cucumber/configuration.rb +240 -8
  22. data/lib/cucumber/constantize.rb +9 -10
  23. data/lib/cucumber/core_ext/string.rb +3 -1
  24. data/lib/cucumber/deprecate.rb +30 -0
  25. data/lib/cucumber/encoding.rb +7 -0
  26. data/lib/cucumber/errors.rb +17 -8
  27. data/lib/cucumber/events.rb +40 -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/step_activated.rb +26 -0
  31. data/lib/cucumber/events/step_definition_registered.rb +20 -0
  32. data/lib/cucumber/events/test_case_finished.rb +14 -0
  33. data/lib/cucumber/events/test_case_started.rb +11 -0
  34. data/lib/cucumber/events/test_run_finished.rb +11 -0
  35. data/lib/cucumber/events/test_run_started.rb +14 -0
  36. data/lib/cucumber/events/test_step_finished.rb +14 -0
  37. data/lib/cucumber/events/test_step_started.rb +11 -0
  38. data/lib/cucumber/file_specs.rb +8 -6
  39. data/lib/cucumber/filters.rb +4 -0
  40. data/lib/cucumber/filters/activate_steps.rb +48 -7
  41. data/lib/cucumber/filters/apply_after_hooks.rb +2 -0
  42. data/lib/cucumber/filters/apply_after_step_hooks.rb +2 -0
  43. data/lib/cucumber/filters/apply_around_hooks.rb +2 -0
  44. data/lib/cucumber/filters/apply_before_hooks.rb +2 -0
  45. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +28 -0
  46. data/lib/cucumber/filters/gated_receiver.rb +2 -2
  47. data/lib/cucumber/filters/prepare_world.rb +13 -11
  48. data/lib/cucumber/filters/quit.rb +4 -7
  49. data/lib/cucumber/filters/randomizer.rb +10 -5
  50. data/lib/cucumber/filters/retry.rb +32 -0
  51. data/lib/cucumber/filters/tag_limits.rb +6 -5
  52. data/lib/cucumber/filters/tag_limits/test_case_index.rb +2 -2
  53. data/lib/cucumber/filters/tag_limits/verifier.rb +5 -7
  54. data/lib/cucumber/formatter/ansicolor.rb +39 -45
  55. data/lib/cucumber/formatter/ast_lookup.rb +165 -0
  56. data/lib/cucumber/formatter/backtrace_filter.rb +54 -0
  57. data/lib/cucumber/formatter/console.rb +93 -115
  58. data/lib/cucumber/formatter/console_counts.rb +39 -0
  59. data/lib/cucumber/formatter/console_issues.rb +61 -0
  60. data/lib/cucumber/formatter/duration.rb +3 -1
  61. data/lib/cucumber/formatter/duration_extractor.rb +31 -0
  62. data/lib/cucumber/formatter/fail_fast.rb +23 -0
  63. data/lib/cucumber/formatter/fanout.rb +4 -3
  64. data/lib/cucumber/formatter/ignore_missing_messages.rb +3 -4
  65. data/lib/cucumber/formatter/interceptor.rb +13 -14
  66. data/lib/cucumber/formatter/io.rb +10 -5
  67. data/lib/cucumber/formatter/json.rb +310 -8
  68. data/lib/cucumber/formatter/junit.rb +175 -110
  69. data/lib/cucumber/formatter/pretty.rb +359 -154
  70. data/lib/cucumber/formatter/progress.rb +78 -72
  71. data/lib/cucumber/formatter/rerun.rb +34 -17
  72. data/lib/cucumber/formatter/stepdefs.rb +3 -2
  73. data/lib/cucumber/formatter/steps.rb +7 -7
  74. data/lib/cucumber/formatter/summary.rb +50 -20
  75. data/lib/cucumber/formatter/unicode.rb +17 -18
  76. data/lib/cucumber/formatter/usage.rb +61 -54
  77. data/lib/cucumber/gherkin/data_table_parser.rb +44 -0
  78. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +97 -0
  79. data/lib/cucumber/gherkin/formatter/escaping.rb +19 -0
  80. data/lib/cucumber/gherkin/i18n.rb +17 -0
  81. data/lib/cucumber/gherkin/steps_parser.rb +42 -0
  82. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +47 -26
  83. data/lib/cucumber/glue/hook.rb +51 -0
  84. data/lib/cucumber/glue/invoke_in_world.rb +65 -0
  85. data/lib/cucumber/glue/proto_world.rb +219 -0
  86. data/lib/cucumber/glue/registry_and_more.rb +192 -0
  87. data/lib/cucumber/glue/snippet.rb +205 -0
  88. data/lib/cucumber/glue/step_definition.rb +142 -0
  89. data/lib/cucumber/glue/world_factory.rb +21 -0
  90. data/lib/cucumber/hooks.rb +34 -21
  91. data/lib/cucumber/load_path.rb +2 -0
  92. data/lib/cucumber/multiline_argument.rb +10 -24
  93. data/lib/cucumber/multiline_argument/data_table.rb +157 -253
  94. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +154 -0
  95. data/lib/cucumber/multiline_argument/doc_string.rb +3 -2
  96. data/lib/cucumber/platform.rb +7 -10
  97. data/lib/cucumber/project_initializer.rb +44 -0
  98. data/lib/cucumber/rake/task.rb +37 -29
  99. data/lib/cucumber/rspec/disable_option_parser.rb +11 -8
  100. data/lib/cucumber/rspec/doubles.rb +3 -1
  101. data/lib/cucumber/running_test_case.rb +60 -0
  102. data/lib/cucumber/runtime.rb +84 -78
  103. data/lib/cucumber/runtime/after_hooks.rb +10 -7
  104. data/lib/cucumber/runtime/before_hooks.rb +12 -6
  105. data/lib/cucumber/runtime/for_programming_languages.rb +14 -44
  106. data/lib/cucumber/runtime/step_hooks.rb +8 -4
  107. data/lib/cucumber/runtime/support_code.rb +55 -159
  108. data/lib/cucumber/runtime/user_interface.rb +15 -24
  109. data/lib/cucumber/step_definition_light.rb +10 -6
  110. data/lib/cucumber/step_definitions.rb +6 -4
  111. data/lib/cucumber/step_match.rb +58 -38
  112. data/lib/cucumber/step_match_search.rb +67 -0
  113. data/lib/cucumber/term/ansicolor.rb +40 -39
  114. data/lib/cucumber/unit.rb +2 -0
  115. data/lib/cucumber/version +1 -0
  116. data/{spec → lib}/simplecov_setup.rb +3 -1
  117. metadata +260 -607
  118. data/.coveralls.yml +0 -1
  119. data/.rspec +0 -1
  120. data/.ruby-gemset +0 -1
  121. data/.travis.yml +0 -18
  122. data/.yardopts +0 -1
  123. data/Gemfile +0 -11
  124. data/Rakefile +0 -22
  125. data/bin/cuke +0 -60
  126. data/cucumber.gemspec +0 -50
  127. data/cucumber.yml +0 -20
  128. data/examples/i18n/README.textile +0 -3
  129. data/examples/i18n/Rakefile +0 -33
  130. data/examples/i18n/ar/Rakefile +0 -6
  131. data/examples/i18n/ar/features/addition.feature +0 -17
  132. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -24
  133. data/examples/i18n/ar/lib/calculator.rb +0 -11
  134. data/examples/i18n/bg/Rakefile +0 -6
  135. data/examples/i18n/bg/features/addition.feature +0 -12
  136. data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
  137. data/examples/i18n/bg/features/division.feature +0 -17
  138. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
  139. data/examples/i18n/bg/features/support/env.rb +0 -5
  140. data/examples/i18n/bg/features/support/world.rb +0 -8
  141. data/examples/i18n/bg/lib/calculator.rb +0 -24
  142. data/examples/i18n/ca/Rakefile +0 -6
  143. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -21
  144. data/examples/i18n/ca/features/suma.feature +0 -17
  145. data/examples/i18n/ca/lib/calculadora.rb +0 -16
  146. data/examples/i18n/cs/Rakefile +0 -6
  147. data/examples/i18n/cs/features/addition.feature +0 -17
  148. data/examples/i18n/cs/features/division.feature +0 -11
  149. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -24
  150. data/examples/i18n/cs/lib/calculator.rb +0 -14
  151. data/examples/i18n/da/Rakefile +0 -6
  152. data/examples/i18n/da/features/sammenlaegning.feature +0 -18
  153. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -24
  154. data/examples/i18n/da/lib/lommeregner.rb +0 -11
  155. data/examples/i18n/de/Rakefile +0 -6
  156. data/examples/i18n/de/features/addition.feature +0 -17
  157. data/examples/i18n/de/features/division.feature +0 -10
  158. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -24
  159. data/examples/i18n/de/lib/calculator.rb +0 -14
  160. data/examples/i18n/el/Rakefile +0 -6
  161. data/examples/i18n/el/features/addition.feature +0 -17
  162. data/examples/i18n/el/features/division.feature +0 -10
  163. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -24
  164. data/examples/i18n/el/lib/calculator.rb +0 -14
  165. data/examples/i18n/en-lol/Rakefile +0 -4
  166. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
  167. data/examples/i18n/en-lol/features/stuffing.feature +0 -8
  168. data/examples/i18n/en-lol/features/support/env.rb +0 -7
  169. data/examples/i18n/en-lol/lib/basket.rb +0 -12
  170. data/examples/i18n/en-lol/lib/belly.rb +0 -11
  171. data/examples/i18n/en/Rakefile +0 -6
  172. data/examples/i18n/en/features/addition.feature +0 -17
  173. data/examples/i18n/en/features/division.feature +0 -10
  174. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -24
  175. data/examples/i18n/en/lib/calculator.rb +0 -14
  176. data/examples/i18n/eo/Rakefile +0 -6
  177. data/examples/i18n/eo/features/adicio.feature +0 -17
  178. data/examples/i18n/eo/features/divido.feature +0 -10
  179. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -24
  180. data/examples/i18n/eo/lib/calculator.rb +0 -14
  181. data/examples/i18n/es/Rakefile +0 -6
  182. data/examples/i18n/es/features/adicion.feature +0 -17
  183. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -21
  184. data/examples/i18n/es/lib/calculador.rb +0 -14
  185. data/examples/i18n/et/Rakefile +0 -6
  186. data/examples/i18n/et/features/jagamine.feature +0 -10
  187. data/examples/i18n/et/features/liitmine.feature +0 -17
  188. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -24
  189. data/examples/i18n/et/lib/kalkulaator.rb +0 -14
  190. data/examples/i18n/fi/Rakefile +0 -6
  191. data/examples/i18n/fi/features/jakolasku.feature +0 -10
  192. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -24
  193. data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
  194. data/examples/i18n/fi/lib/laskin.rb +0 -14
  195. data/examples/i18n/fr/Rakefile +0 -8
  196. data/examples/i18n/fr/features/addition.feature +0 -18
  197. data/examples/i18n/fr/features/addition2.feature +0 -17
  198. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
  199. data/examples/i18n/fr/features/support/env.rb +0 -5
  200. data/examples/i18n/fr/lib/calculatrice.rb +0 -10
  201. data/examples/i18n/he/Rakefile +0 -6
  202. data/examples/i18n/he/features/addition.feature +0 -17
  203. data/examples/i18n/he/features/division.feature +0 -10
  204. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -24
  205. data/examples/i18n/he/lib/calculator.rb +0 -15
  206. data/examples/i18n/hi/Rakefile +0 -6
  207. data/examples/i18n/hi/features/addition.feature +0 -16
  208. data/examples/i18n/hi/features/division.feature +0 -10
  209. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -24
  210. data/examples/i18n/hi/lib/calculator.rb +0 -15
  211. data/examples/i18n/hu/Rakefile +0 -6
  212. data/examples/i18n/hu/features/osszeadas.feature +0 -17
  213. data/examples/i18n/hu/features/osztas.feature +0 -10
  214. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -25
  215. data/examples/i18n/hu/lib/calculator.rb +0 -14
  216. data/examples/i18n/id/Rakefile +0 -6
  217. data/examples/i18n/id/features/addition.feature +0 -17
  218. data/examples/i18n/id/features/division.feature +0 -10
  219. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -24
  220. data/examples/i18n/id/lib/calculator.rb +0 -14
  221. data/examples/i18n/it/Rakefile +0 -6
  222. data/examples/i18n/it/features/somma.feature +0 -11
  223. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -24
  224. data/examples/i18n/it/lib/calcolatrice.rb +0 -11
  225. data/examples/i18n/ja/Rakefile +0 -6
  226. data/examples/i18n/ja/features/addition.feature +0 -17
  227. data/examples/i18n/ja/features/division.feature +0 -10
  228. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
  229. data/examples/i18n/ja/features/support/env.rb +0 -5
  230. data/examples/i18n/ja/lib/calculator.rb +0 -14
  231. data/examples/i18n/ko/Rakefile +0 -6
  232. data/examples/i18n/ko/features/addition.feature +0 -17
  233. data/examples/i18n/ko/features/division.feature +0 -11
  234. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -24
  235. data/examples/i18n/ko/lib/calculator.rb +0 -14
  236. data/examples/i18n/lt/Rakefile +0 -6
  237. data/examples/i18n/lt/features/addition.feature +0 -17
  238. data/examples/i18n/lt/features/division.feature +0 -10
  239. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -24
  240. data/examples/i18n/lt/lib/calculator.rb +0 -14
  241. data/examples/i18n/lv/Rakefile +0 -6
  242. data/examples/i18n/lv/features/addition.feature +0 -17
  243. data/examples/i18n/lv/features/division.feature +0 -10
  244. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -24
  245. data/examples/i18n/lv/lib/calculator.rb +0 -14
  246. data/examples/i18n/no/Rakefile +0 -6
  247. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
  248. data/examples/i18n/no/features/summering.feature +0 -19
  249. data/examples/i18n/no/features/support/env.rb +0 -6
  250. data/examples/i18n/no/lib/kalkulator.rb +0 -11
  251. data/examples/i18n/pl/Rakefile +0 -6
  252. data/examples/i18n/pl/features/addition.feature +0 -17
  253. data/examples/i18n/pl/features/division.feature +0 -10
  254. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -24
  255. data/examples/i18n/pl/features/support/env.rb +0 -5
  256. data/examples/i18n/pl/lib/calculator.rb +0 -14
  257. data/examples/i18n/pt/Rakefile +0 -6
  258. data/examples/i18n/pt/features/adicao.feature +0 -11
  259. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
  260. data/examples/i18n/pt/features/support/env.rb +0 -5
  261. data/examples/i18n/pt/lib/calculadora.rb +0 -10
  262. data/examples/i18n/ro/Rakefile +0 -6
  263. data/examples/i18n/ro/features/adunare.feature +0 -12
  264. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -21
  265. data/examples/i18n/ro/lib/calculator.rb +0 -11
  266. data/examples/i18n/ru/Rakefile +0 -6
  267. data/examples/i18n/ru/features/addition.feature +0 -11
  268. data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
  269. data/examples/i18n/ru/features/division.feature +0 -16
  270. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
  271. data/examples/i18n/ru/features/support/env.rb +0 -5
  272. data/examples/i18n/ru/features/support/world.rb +0 -8
  273. data/examples/i18n/ru/lib/calculator.rb +0 -24
  274. data/examples/i18n/sk/Rakefile +0 -6
  275. data/examples/i18n/sk/features/addition.feature +0 -17
  276. data/examples/i18n/sk/features/division.feature +0 -10
  277. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -24
  278. data/examples/i18n/sk/lib/calculator.rb +0 -14
  279. data/examples/i18n/sr-Cyrl/Rakefile +0 -6
  280. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
  281. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
  282. data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -5
  283. data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
  284. data/examples/i18n/sr-Latn/Rakefile +0 -6
  285. data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
  286. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -24
  287. data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
  288. data/examples/i18n/sv/Rakefile +0 -6
  289. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -24
  290. data/examples/i18n/sv/features/summering.feature +0 -18
  291. data/examples/i18n/sv/lib/kalkulator.rb +0 -11
  292. data/examples/i18n/tr/Rakefile +0 -6
  293. data/examples/i18n/tr/features/bolme.feature +0 -10
  294. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -24
  295. data/examples/i18n/tr/features/toplama.feature +0 -18
  296. data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
  297. data/examples/i18n/uk/Rakefile +0 -6
  298. data/examples/i18n/uk/features/addition.feature +0 -11
  299. data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
  300. data/examples/i18n/uk/features/division.feature +0 -16
  301. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
  302. data/examples/i18n/uk/features/support/env.rb +0 -5
  303. data/examples/i18n/uk/features/support/world.rb +0 -8
  304. data/examples/i18n/uk/lib/calculator.rb +0 -24
  305. data/examples/i18n/uz/Rakefile +0 -6
  306. data/examples/i18n/uz/features/addition.feature +0 -10
  307. data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
  308. data/examples/i18n/uz/features/division.feature +0 -17
  309. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
  310. data/examples/i18n/uz/features/support/env.rb +0 -5
  311. data/examples/i18n/uz/features/support/world.rb +0 -8
  312. data/examples/i18n/uz/lib/calculator.rb +0 -24
  313. data/examples/i18n/zh-CN/Rakefile +0 -4
  314. data/examples/i18n/zh-CN/features/addition.feature +0 -18
  315. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -26
  316. data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
  317. data/examples/i18n/zh-TW/Rakefile +0 -4
  318. data/examples/i18n/zh-TW/features/addition.feature +0 -17
  319. data/examples/i18n/zh-TW/features/division.feature +0 -11
  320. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -24
  321. data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
  322. data/examples/rspec_doubles/Rakefile +0 -4
  323. data/examples/rspec_doubles/features/mocking.feature +0 -9
  324. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
  325. data/examples/rspec_doubles/features/support/env.rb +0 -12
  326. data/examples/sinatra/README.textile +0 -13
  327. data/examples/sinatra/Rakefile +0 -6
  328. data/examples/sinatra/app.rb +0 -14
  329. data/examples/sinatra/features/add.feature +0 -11
  330. data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
  331. data/examples/sinatra/features/support/env.rb +0 -10
  332. data/examples/sinatra/views/add.erb +0 -7
  333. data/examples/sinatra/views/layout.erb +0 -8
  334. data/examples/tcl/README.textile +0 -11
  335. data/examples/tcl/Rakefile +0 -6
  336. data/examples/tcl/features/fibonnacci.feature +0 -17
  337. data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
  338. data/examples/tcl/features/support/env.rb +0 -6
  339. data/examples/tcl/src/fib.tcl +0 -3
  340. data/examples/test_unit/Gemfile +0 -4
  341. data/examples/test_unit/Rakefile +0 -6
  342. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
  343. data/examples/test_unit/features/test_unit.feature +0 -9
  344. data/examples/watir/README.textile +0 -16
  345. data/examples/watir/Rakefile +0 -12
  346. data/examples/watir/cucumber.yml +0 -1
  347. data/examples/watir/features/search.feature +0 -12
  348. data/examples/watir/features/step_definitions/search_steps.rb +0 -26
  349. data/examples/watir/features/support/env.rb +0 -35
  350. data/examples/watir/features/support/screenshots.rb +0 -47
  351. data/features/docs/api/list_step_defs_as_json.feature +0 -50
  352. data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -29
  353. data/features/docs/cli/backtraces.feature +0 -36
  354. data/features/docs/cli/dry_run.feature +0 -25
  355. data/features/docs/cli/exclude_files.feature +0 -19
  356. data/features/docs/cli/execute_with_tag_filter.feature +0 -117
  357. data/features/docs/cli/randomize.feature +0 -46
  358. data/features/docs/cli/require.feature +0 -27
  359. data/features/docs/cli/run_scenarios_matching_name.feature +0 -104
  360. data/features/docs/cli/run_specific_scenarios.feature +0 -130
  361. data/features/docs/cli/showing_differences.feature +0 -43
  362. data/features/docs/cli/specifying_multiple_formatters.feature +0 -44
  363. data/features/docs/cli/strict_mode.feature +0 -41
  364. data/features/docs/defining_steps/nested_steps.feature +0 -129
  365. data/features/docs/defining_steps/nested_steps_i18n.feature +0 -34
  366. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -73
  367. data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
  368. data/features/docs/defining_steps/printing_messages.feature +0 -148
  369. data/features/docs/defining_steps/skip_scenario.feature +0 -62
  370. data/features/docs/defining_steps/snippets.feature +0 -56
  371. data/features/docs/defining_steps/table_diffing.feature +0 -50
  372. data/features/docs/defining_steps/transforms.feature +0 -63
  373. data/features/docs/exception_in_after_hook.feature +0 -126
  374. data/features/docs/exception_in_after_step_hook.feature +0 -102
  375. data/features/docs/exception_in_before_hook.feature +0 -96
  376. data/features/docs/extending_cucumber/custom_filter.feature +0 -29
  377. data/features/docs/extending_cucumber/custom_formatter.feature +0 -94
  378. data/features/docs/formatters/debug_formatter.feature +0 -47
  379. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  380. data/features/docs/formatters/html_formatter.feature +0 -90
  381. data/features/docs/formatters/json_formatter.feature +0 -696
  382. data/features/docs/formatters/junit_formatter.feature +0 -276
  383. data/features/docs/formatters/pretty_formatter.feature +0 -73
  384. data/features/docs/formatters/progress_formatter.feature +0 -31
  385. data/features/docs/formatters/rerun_formatter.feature +0 -136
  386. data/features/docs/formatters/usage_formatter.feature +0 -102
  387. data/features/docs/getting_started.feature +0 -27
  388. data/features/docs/gherkin/background.feature +0 -559
  389. data/features/docs/gherkin/doc_strings.feature +0 -74
  390. data/features/docs/gherkin/expand_option_for_outlines.feature +0 -46
  391. data/features/docs/gherkin/language_from_header.feature +0 -32
  392. data/features/docs/gherkin/language_help.feature +0 -37
  393. data/features/docs/gherkin/outlines.feature +0 -158
  394. data/features/docs/gherkin/unicode_table.feature +0 -32
  395. data/features/docs/gherkin/using_descriptions.feature +0 -88
  396. data/features/docs/gherkin/using_star_notation.feature +0 -37
  397. data/features/docs/iso-8859-1.feature +0 -6
  398. data/features/docs/post_configuration_hook.feature +0 -49
  399. data/features/docs/profiles.feature +0 -120
  400. data/features/docs/rake_task.feature +0 -141
  401. data/features/docs/raketask.feature +0 -44
  402. data/features/docs/report_called_undefined_steps.feature +0 -57
  403. data/features/docs/wire_protocol.feature +0 -337
  404. data/features/docs/wire_protocol_erb.feature +0 -56
  405. data/features/docs/wire_protocol_table_diffing.feature +0 -125
  406. data/features/docs/wire_protocol_tags.feature +0 -86
  407. data/features/docs/wire_protocol_timeouts.feature +0 -63
  408. data/features/docs/work_in_progress.feature +0 -154
  409. data/features/docs/writing_support_code/after_hooks.feature +0 -56
  410. data/features/docs/writing_support_code/around_hooks.feature +0 -229
  411. data/features/docs/writing_support_code/before_hook.feature +0 -61
  412. data/features/docs/writing_support_code/hook_order.feature +0 -61
  413. data/features/docs/writing_support_code/load_path.feature +0 -17
  414. data/features/docs/writing_support_code/state.feature +0 -32
  415. data/features/docs/writing_support_code/tagged_hooks.feature +0 -57
  416. data/features/lib/step_definitions/aruba_steps.rb +0 -22
  417. data/features/lib/step_definitions/cucumber_steps.rb +0 -50
  418. data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -12
  419. data/features/lib/step_definitions/json_steps.rb +0 -7
  420. data/features/lib/step_definitions/junit_steps.rb +0 -13
  421. data/features/lib/step_definitions/language_steps.rb +0 -8
  422. data/features/lib/step_definitions/profile_steps.rb +0 -15
  423. data/features/lib/step_definitions/ruby_steps.rb +0 -3
  424. data/features/lib/step_definitions/wire_steps.rb +0 -41
  425. data/features/lib/support/env.rb +0 -21
  426. data/features/lib/support/fake_wire_server.rb +0 -77
  427. data/features/lib/support/feature_factory.rb +0 -67
  428. data/features/lib/support/normalise_output.rb +0 -33
  429. data/gem_tasks/contributors.rake +0 -15
  430. data/gem_tasks/cov.rake +0 -5
  431. data/gem_tasks/cucumber.rake +0 -25
  432. data/gem_tasks/downloads.rb +0 -7
  433. data/gem_tasks/environment.rake +0 -7
  434. data/gem_tasks/examples.rake +0 -11
  435. data/gem_tasks/fix_cr_lf.rake +0 -10
  436. data/gem_tasks/flog.rake +0 -4
  437. data/gem_tasks/rspec.rake +0 -6
  438. data/gem_tasks/sass.rake +0 -4
  439. data/gem_tasks/stats +0 -16
  440. data/gem_tasks/versions.txt +0 -74
  441. data/lib/cucumber/ast.rb +0 -13
  442. data/lib/cucumber/ast/facade.rb +0 -117
  443. data/lib/cucumber/core_ext/instance_exec.rb +0 -70
  444. data/lib/cucumber/core_ext/proc.rb +0 -36
  445. data/lib/cucumber/formatter/cucumber.css +0 -285
  446. data/lib/cucumber/formatter/cucumber.sass +0 -247
  447. data/lib/cucumber/formatter/debug.rb +0 -35
  448. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +0 -201
  449. data/lib/cucumber/formatter/gpretty.rb +0 -24
  450. data/lib/cucumber/formatter/html.rb +0 -674
  451. data/lib/cucumber/formatter/jquery-min.js +0 -154
  452. data/lib/cucumber/formatter/json_pretty.rb +0 -10
  453. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1024
  454. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -376
  455. data/lib/cucumber/formatter/legacy_api/results.rb +0 -51
  456. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -30
  457. data/lib/cucumber/language_support.rb +0 -30
  458. data/lib/cucumber/language_support/language_methods.rb +0 -71
  459. data/lib/cucumber/rb_support/rb_hook.rb +0 -18
  460. data/lib/cucumber/rb_support/rb_language.rb +0 -160
  461. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -122
  462. data/lib/cucumber/rb_support/rb_transform.rb +0 -59
  463. data/lib/cucumber/rb_support/rb_world.rb +0 -142
  464. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +0 -21
  465. data/lib/cucumber/rb_support/snippet.rb +0 -149
  466. data/lib/cucumber/wire_support/configuration.rb +0 -38
  467. data/lib/cucumber/wire_support/connection.rb +0 -61
  468. data/lib/cucumber/wire_support/request_handler.rb +0 -32
  469. data/lib/cucumber/wire_support/wire_exception.rb +0 -32
  470. data/lib/cucumber/wire_support/wire_language.rb +0 -68
  471. data/lib/cucumber/wire_support/wire_packet.rb +0 -34
  472. data/lib/cucumber/wire_support/wire_protocol.rb +0 -43
  473. data/lib/cucumber/wire_support/wire_protocol/requests.rb +0 -133
  474. data/lib/cucumber/wire_support/wire_step_definition.rb +0 -19
  475. data/spec/cucumber/cli/configuration_spec.rb +0 -503
  476. data/spec/cucumber/cli/main_spec.rb +0 -105
  477. data/spec/cucumber/cli/options_spec.rb +0 -335
  478. data/spec/cucumber/cli/profile_loader_spec.rb +0 -46
  479. data/spec/cucumber/configuration_spec.rb +0 -23
  480. data/spec/cucumber/constantize_spec.rb +0 -19
  481. data/spec/cucumber/core_ext/proc_spec.rb +0 -69
  482. data/spec/cucumber/file_specs_spec.rb +0 -60
  483. data/spec/cucumber/filters/activate_steps_spec.rb +0 -57
  484. data/spec/cucumber/filters/gated_receiver_spec.rb +0 -47
  485. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -38
  486. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -57
  487. data/spec/cucumber/filters/tag_limits_spec.rb +0 -59
  488. data/spec/cucumber/formatter/ansicolor_spec.rb +0 -32
  489. data/spec/cucumber/formatter/debug_spec.rb +0 -64
  490. data/spec/cucumber/formatter/duration_spec.rb +0 -22
  491. data/spec/cucumber/formatter/html_spec.rb +0 -459
  492. data/spec/cucumber/formatter/interceptor_spec.rb +0 -136
  493. data/spec/cucumber/formatter/junit_spec.rb +0 -196
  494. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2002
  495. data/spec/cucumber/formatter/pretty_spec.rb +0 -810
  496. data/spec/cucumber/formatter/progress_spec.rb +0 -85
  497. data/spec/cucumber/formatter/rerun_spec.rb +0 -107
  498. data/spec/cucumber/formatter/spec_helper.rb +0 -67
  499. data/spec/cucumber/hooks_spec.rb +0 -30
  500. data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -514
  501. data/spec/cucumber/rake/forked_spec.rb +0 -53
  502. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -279
  503. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -152
  504. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
  505. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +0 -22
  506. data/spec/cucumber/rb_support/snippet_spec.rb +0 -137
  507. data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -36
  508. data/spec/cucumber/runtime/support_code_spec.rb +0 -123
  509. data/spec/cucumber/runtime_spec.rb +0 -46
  510. data/spec/cucumber/sell_cucumbers.feature +0 -19
  511. data/spec/cucumber/step_match_spec.rb +0 -79
  512. data/spec/cucumber/wire_support/configuration_spec.rb +0 -64
  513. data/spec/cucumber/wire_support/connection_spec.rb +0 -64
  514. data/spec/cucumber/wire_support/wire_exception_spec.rb +0 -50
  515. data/spec/cucumber/wire_support/wire_language_spec.rb +0 -46
  516. data/spec/cucumber/wire_support/wire_packet_spec.rb +0 -44
  517. data/spec/cucumber/world/pending_spec.rb +0 -46
  518. data/spec/spec_helper.rb +0 -32
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module LoadPath
3
5
  def add_dirs(*dirs)
@@ -1,26 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delegate'
2
4
  require 'cucumber/multiline_argument/data_table'
3
5
  require 'cucumber/multiline_argument/doc_string'
4
- require 'gherkin/rubify'
5
6
 
6
7
  module Cucumber
7
8
  module MultilineArgument
8
- extend Gherkin::Rubify
9
-
10
9
  class << self
11
10
  def from_core(node)
12
11
  builder.wrap(node)
13
12
  end
14
13
 
15
- def from(argument, location=nil)
16
- location ||= Core::Ast::Location.of_caller
17
- argument = rubify(argument)
14
+ def from(argument, location = nil, content_type = nil)
15
+ location ||= Core::Test::Location.of_caller
18
16
  case argument
19
17
  when String
20
- doc_string(argument, 'text/plain', location)
18
+ builder.doc_string(Core::Test::DocString.new(argument, content_type, location))
21
19
  when Array
22
20
  location = location.on_line(argument.first.line..argument.last.line)
23
- data_table(argument.map{ |row| row.cells }, location)
21
+ builder.data_table(argument.map(&:cells), location)
24
22
  when DataTable, DocString, None
25
23
  argument
26
24
  when nil
@@ -30,14 +28,6 @@ module Cucumber
30
28
  end
31
29
  end
32
30
 
33
- def doc_string(argument, content_type, location)
34
- builder.doc_string(Core::Ast::DocString.new(argument, content_type, location))
35
- end
36
-
37
- def data_table(data, location)
38
- builder.data_table(Core::Ast::DataTable.new(data, location))
39
- end
40
-
41
31
  private
42
32
 
43
33
  def builder
@@ -51,24 +41,20 @@ module Cucumber
51
41
  @result
52
42
  end
53
43
 
54
- def doc_string(node, *args)
44
+ def doc_string(node, *_args)
55
45
  @result = DocString.new(node)
56
46
  end
57
47
 
58
- def data_table(node, *args)
48
+ def data_table(node, *_args)
59
49
  @result = DataTable.new(node)
60
50
  end
61
51
  end
62
52
  end
63
53
 
64
54
  class None
65
- def append_to(array)
66
- end
55
+ def append_to(array); end
67
56
 
68
- def describe_to(visitor)
69
- end
57
+ def describe_to(visitor); end
70
58
  end
71
59
  end
72
60
  end
73
-
74
- require 'cucumber/ast'
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
- require 'gherkin/formatter/escaping'
3
- require 'cucumber/core/ast/describes_itself'
4
+ require 'cucumber/gherkin/data_table_parser'
5
+ require 'cucumber/gherkin/formatter/escaping'
6
+ require 'cucumber/multiline_argument/data_table/diff_matrices'
4
7
 
5
8
  module Cucumber
6
9
  module MultilineArgument
@@ -24,72 +27,62 @@ module Cucumber
24
27
  # This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
25
28
  #
26
29
  class DataTable
27
- class Different < StandardError
28
- def initialize(table)
29
- super("Tables were not identical:\n#{table}")
30
- end
31
- end
32
-
33
- class Builder
34
- attr_reader :rows
35
-
36
- def initialize
37
- @rows = []
38
- end
39
-
40
- def row(row, line_number)
41
- @rows << row
42
- end
43
-
44
- def eof
45
- end
30
+ def self.default_arg_name #:nodoc:
31
+ 'table'
46
32
  end
47
33
 
48
- include Enumerable
49
- include Core::Ast::DescribesItself
50
- extend Forwardable
51
-
52
- NULL_CONVERSIONS = Hash.new({ :strict => false, :proc => lambda{ |cell_value| cell_value } }).freeze
53
-
54
- attr_accessor :file
55
- def_delegator :@ast_table, :location
56
-
57
- def self.default_arg_name #:nodoc:
58
- "table"
34
+ def describe_to(visitor, *args)
35
+ visitor.legacy_table(self, *args)
59
36
  end
60
37
 
61
38
  class << self
62
- def from(data, location = Core::Ast::Location.of_caller)
39
+ def from(data, location = Core::Test::Location.of_caller)
63
40
  case data
64
41
  when Array
65
42
  from_array(data, location)
66
43
  when String
67
44
  parse(data, location)
68
45
  else
69
- raise ArgumentError, "expected data to be a String or an Array."
46
+ raise ArgumentError, 'expected data to be a String or an Array.'
70
47
  end
71
48
  end
72
49
 
73
50
  private
74
- def parse(text, location = Core::Ast::Location.of_caller)
51
+
52
+ def parse(text, location = Core::Test::Location.of_caller)
75
53
  builder = Builder.new
76
- lexer = Gherkin::Lexer::I18nLexer.new(builder)
77
- lexer.scan(text)
54
+ parser = Cucumber::Gherkin::DataTableParser.new(builder)
55
+ parser.parse(text)
78
56
  from_array(builder.rows, location)
79
57
  end
80
58
 
81
- def from_array(data, location = Core::Ast::Location.of_caller)
82
- new Core::Ast::DataTable.new(data, location)
59
+ def from_array(data, location = Core::Test::Location.of_caller)
60
+ new Core::Test::DataTable.new(data, location)
83
61
  end
84
62
  end
85
63
 
64
+ class Builder
65
+ attr_reader :rows
86
66
 
87
- # @param data [Core::Ast::DataTable] the data for the table
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
79
+
80
+ # @param data [Core::Test::DataTable] the data for the table
88
81
  # @param conversion_procs [Hash] see map_columns!
89
82
  # @param header_mappings [Hash] see map_headers!
90
83
  # @param header_conversion_proc [Proc] see map_headers!
91
84
  def initialize(data, conversion_procs = NULL_CONVERSIONS.dup, header_mappings = {}, header_conversion_proc = nil)
92
- 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
93
86
  ast_table = data
94
87
  # Verify that it's square
95
88
  ast_table.transpose
@@ -108,11 +101,17 @@ module Cucumber
108
101
  dup
109
102
  end
110
103
 
104
+ attr_accessor :file
105
+
106
+ def location
107
+ @ast_table.location
108
+ end
109
+
111
110
  # Creates a copy of this table, inheriting any column and header mappings
112
111
  # registered with #map_column! and #map_headers!.
113
112
  #
114
113
  def dup
115
- 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, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
116
115
  end
117
116
 
118
117
  # Returns a new, transposed table. Example:
@@ -127,7 +126,7 @@ module Cucumber
127
126
  # | 4 | 2 |
128
127
  #
129
128
  def transpose
130
- 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, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
131
130
  end
132
131
 
133
132
  # Converts this table into an Array of Hash where the keys of each
@@ -148,6 +147,24 @@ module Cucumber
148
147
  @hashes ||= build_hashes
149
148
  end
150
149
 
150
+ # Converts this table into an Array of Hashes where the keys are symbols.
151
+ # For example, a Table built from the following plain text:
152
+ #
153
+ # | foo | Bar | Foo Bar |
154
+ # | 2 | 3 | 5 |
155
+ # | 7 | 9 | 16 |
156
+ #
157
+ # Gets converted into the following:
158
+ #
159
+ # [{:foo => '2', :bar => '3', :foo_bar => '5'}, {:foo => '7', :bar => '9', :foo_bar => '16'}]
160
+ #
161
+ def symbolic_hashes
162
+ @symbolic_hashes ||=
163
+ hashes.map do |string_hash|
164
+ Hash[string_hash.map { |a, b| [symbolize_key(a), b] }]
165
+ end
166
+ end
167
+
151
168
  # Converts this table into a Hash where the first column is
152
169
  # used as keys and the second column is used as values
153
170
  #
@@ -163,7 +180,7 @@ module Cucumber
163
180
  def rows_hash
164
181
  return @rows_hash if @rows_hash
165
182
  verify_table_width(2)
166
- @rows_hash = self.transpose.hashes[0]
183
+ @rows_hash = transpose.hashes[0]
167
184
  end
168
185
 
169
186
  # Gets the raw data of this table. For example, a Table built from
@@ -178,14 +195,12 @@ module Cucumber
178
195
  #
179
196
  def raw
180
197
  cell_matrix.map do |row|
181
- row.map do |cell|
182
- cell.value
183
- end
198
+ row.map(&:value)
184
199
  end
185
200
  end
186
201
 
187
202
  def column_names #:nodoc:
188
- @col_names ||= cell_matrix[0].map { |cell| cell.value }
203
+ @column_names ||= cell_matrix[0].map(&:value)
189
204
  end
190
205
 
191
206
  def rows
@@ -245,7 +260,7 @@ module Cucumber
245
260
  # table.hashes.keys
246
261
  # # => ['phone number', 'ADDRESS']
247
262
  #
248
- def map_headers!(mappings={}, &block)
263
+ def map_headers!(mappings = {}, &block)
249
264
  # TODO: Remove this method for 2.0
250
265
  clear_cache!
251
266
  @header_mappings = mappings
@@ -253,8 +268,8 @@ module Cucumber
253
268
  end
254
269
 
255
270
  # Returns a new Table where the headers are redefined. See #map_headers!
256
- def map_headers(mappings={}, &block)
257
- 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, location), @conversion_procs.dup, mappings, block)
258
273
  end
259
274
 
260
275
  # Change how #hashes converts column values. The +column_name+ argument identifies the column
@@ -269,17 +284,17 @@ module Cucumber
269
284
  # end
270
285
  # end
271
286
  #
272
- def map_column!(column_name, strict=true, &conversion_proc)
287
+ def map_column!(column_name, strict = true, &conversion_proc)
273
288
  # TODO: Remove this method for 2.0
274
- @conversion_procs[column_name.to_s] = { :strict => strict, :proc => conversion_proc }
289
+ @conversion_procs[column_name.to_s] = { strict: strict, proc: conversion_proc }
275
290
  self
276
291
  end
277
292
 
278
293
  # Returns a new Table with an additional column mapping. See #map_column!
279
- def map_column(column_name, strict=true, &conversion_proc)
294
+ def map_column(column_name, strict = true, &conversion_proc)
280
295
  conversion_procs = @conversion_procs.dup
281
- conversion_procs[column_name.to_s] = { :strict => strict, :proc => conversion_proc }
282
- 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, location), conversion_procs, @header_mappings.dup, @header_conversion_proc)
283
298
  end
284
299
 
285
300
  # Compares +other_table+ to self. If +other_table+ contains columns
@@ -318,86 +333,28 @@ module Cucumber
318
333
  # Calling this method is particularly useful in <tt>Then</tt> steps that take
319
334
  # a Table argument, if you want to compare that table to some actual values.
320
335
  #
321
- def diff!(other_table, options={})
322
- options = {
323
- :missing_row => true,
324
- :surplus_row => true,
325
- :missing_col => true,
326
- :surplus_col => false,
327
- :misplaced_col => false
328
- }.merge(options)
329
-
336
+ def diff!(other_table, options = {})
330
337
  other_table = ensure_table(other_table)
331
338
  other_table.convert_headers!
332
339
  other_table.convert_columns!
333
- ensure_green!
334
340
 
335
341
  convert_headers!
336
342
  convert_columns!
337
343
 
338
- original_width = cell_matrix[0].length
339
- other_table_cell_matrix = pad!(other_table.cell_matrix)
340
- padded_width = cell_matrix[0].length
341
-
342
- missing_col = cell_matrix[0].detect{|cell| cell.status == :undefined}
343
- surplus_col = padded_width > original_width
344
- misplaced_col = cell_matrix[0] != other_table.cell_matrix[0]
345
-
346
- require_diff_lcs
347
- cell_matrix.extend(Diff::LCS)
348
- changes = cell_matrix.diff(other_table_cell_matrix).flatten
349
-
350
- inserted = 0
351
- missing = 0
352
-
353
- row_indices = Array.new(other_table_cell_matrix.length) {|n| n}
354
-
355
- last_change = nil
356
- missing_row_pos = nil
357
- insert_row_pos = nil
358
-
359
- changes.each do |change|
360
- if(change.action == '-')
361
- missing_row_pos = change.position + inserted
362
- cell_matrix[missing_row_pos].each{|cell| cell.status = :undefined}
363
- row_indices.insert(missing_row_pos, nil)
364
- missing += 1
365
- else # '+'
366
- insert_row_pos = change.position + missing
367
- inserted_row = change.element
368
- inserted_row.each{|cell| cell.status = :comment}
369
- cell_matrix.insert(insert_row_pos, inserted_row)
370
- row_indices[insert_row_pos] = nil
371
- inspect_rows(cell_matrix[missing_row_pos], inserted_row) if last_change && last_change.action == '-'
372
- inserted += 1
373
- end
374
- last_change = change
375
- end
344
+ DiffMatrices.new(cell_matrix, other_table.cell_matrix, options).call
345
+ end
376
346
 
377
- other_table_cell_matrix.each_with_index do |other_row, i|
378
- row_index = row_indices.index(i)
379
- row = cell_matrix[row_index] if row_index
380
- if row
381
- (original_width..padded_width).each do |col_index|
382
- surplus_cell = other_row[col_index]
383
- row[col_index].value = surplus_cell.value if row[col_index]
384
- end
385
- end
347
+ class Different < StandardError
348
+ attr_reader :table
349
+ def initialize(table)
350
+ @table = table
351
+ super("Tables were not identical:\n#{table}")
386
352
  end
387
-
388
- clear_cache!
389
- should_raise =
390
- missing_row_pos && options[:missing_row] ||
391
- insert_row_pos && options[:surplus_row] ||
392
- missing_col && options[:missing_col] ||
393
- surplus_col && options[:surplus_col] ||
394
- misplaced_col && options[:misplaced_col]
395
- raise Different.new(self) if should_raise
396
353
  end
397
354
 
398
355
  def to_hash(cells) #:nodoc:
399
- hash = Hash.new do |hash, key|
400
- hash[key.to_s] if key.is_a?(Symbol)
356
+ hash = Hash.new do |hash_inner, key|
357
+ hash_inner[key.to_s] if key.is_a?(Symbol)
401
358
  end
402
359
  column_names.each_with_index do |column_name, column_index|
403
360
  hash[column_name] = cells.value(column_index)
@@ -410,19 +367,21 @@ module Cucumber
410
367
  end
411
368
 
412
369
  def verify_column(column_name) #:nodoc:
413
- raise %{The column named "#{column_name}" does not exist} unless raw[0].include?(column_name)
370
+ raise %(The column named "#{column_name}" does not exist) unless raw[0].include?(column_name)
414
371
  end
415
372
 
416
373
  def verify_table_width(width) #:nodoc:
417
- raise %{The table must have exactly #{width} columns} unless raw[0].size == width
374
+ raise %(The table must have exactly #{width} columns) unless raw[0].size == width
418
375
  end
419
376
 
420
- def has_text?(text) #:nodoc:
421
- raw.flatten.compact.detect{|cell_value| cell_value.index(text)}
377
+ # TODO: remove the below function if it's not actually being used.
378
+ # Nothing else in this repo calls it.
379
+ def text?(text) #:nodoc:
380
+ raw.flatten.compact.detect { |cell_value| cell_value.index(text) }
422
381
  end
423
382
 
424
383
  def cells_rows #:nodoc:
425
- @rows ||= cell_matrix.map do |cell_row|
384
+ @rows ||= cell_matrix.map do |cell_row| # rubocop:disable Naming/MemoizedInstanceVariableName
426
385
  Cells.new(self, cell_row)
427
386
  end
428
387
  end
@@ -435,34 +394,55 @@ module Cucumber
435
394
  cells_rows[0][col]
436
395
  end
437
396
 
438
- def cell_matrix #:nodoc:
439
- @cell_matrix
440
- end
397
+ attr_reader :cell_matrix
441
398
 
442
399
  def col_width(col) #:nodoc:
443
400
  columns[col].__send__(:width)
444
401
  end
445
402
 
446
403
  def to_s(options = {}) #:nodoc:
447
- # TODO: factor out this code so we don't depend on such a big lump of old cruft
448
- require 'cucumber/formatter/pretty'
449
- require 'cucumber/formatter/legacy_api/adapter'
450
- options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
451
- io = StringIO.new
452
-
453
- c = Cucumber::Term::ANSIColor.coloring?
454
- Cucumber::Term::ANSIColor.coloring = options[:color]
455
- formatter = Formatter::Pretty.new(nil, io, options)
456
- formatter.instance_variable_set('@indent', options[:indent])
457
- Formatter::LegacyApi::Ast::MultilineArg.for(self).accept(Formatter::Fanout.new([formatter]))
458
- Cucumber::Term::ANSIColor.coloring = c
459
- io.rewind
460
- s = "\n" + io.read + (" " * (options[:indent] - 2))
461
- s
404
+ indentation = options.key?(:indent) ? options[:indent] : 2
405
+ prefixes = options.key?(:prefixes) ? options[:prefixes] : TO_S_PREFIXES
406
+ DataTablePrinter.new(self, indentation, prefixes).to_s
462
407
  end
463
408
 
464
- def description_for_visitors
465
- :legacy_table
409
+ class DataTablePrinter #:nodoc:
410
+ include Cucumber::Gherkin::Formatter::Escaping
411
+ attr_reader :data_table, :indentation, :prefixes
412
+ private :data_table, :indentation, :prefixes
413
+
414
+ def initialize(data_table, indentation, prefixes)
415
+ @data_table = data_table
416
+ @indentation = indentation
417
+ @prefixes = prefixes
418
+ end
419
+
420
+ def to_s
421
+ leading_row = "\n"
422
+ end_indentation = indentation - 2
423
+ trailing_row = "\n" + (' ' * end_indentation)
424
+ table_rows = data_table.cell_matrix.map { |row| format_row(row) }
425
+ leading_row + table_rows.join("\n") + trailing_row
426
+ end
427
+
428
+ private
429
+
430
+ def format_row(row)
431
+ row_start = (' ' * indentation) + '| '
432
+ row_end = '|'
433
+ cells = row.map.with_index do |cell, i|
434
+ format_cell(cell, data_table.col_width(i))
435
+ end
436
+ row_start + cells.join('| ') + row_end
437
+ end
438
+
439
+ def format_cell(cell, col_width)
440
+ cell_text = escape_cell(cell.value.to_s)
441
+ cell_text_width = cell_text.unpack('U*').length
442
+ padded_text = cell_text + (' ' * (col_width - cell_text_width))
443
+ prefix = prefixes[cell.status]
444
+ "#{prefix}#{padded_text} "
445
+ end
466
446
  end
467
447
 
468
448
  def columns #:nodoc:
@@ -475,35 +455,26 @@ module Cucumber
475
455
  raw.to_json(*args)
476
456
  end
477
457
 
478
- private
479
-
480
458
  TO_S_PREFIXES = Hash.new(' ')
481
459
  TO_S_PREFIXES[:comment] = '(+) '
482
460
  TO_S_PREFIXES[:undefined] = '(-) '
461
+ private_constant :TO_S_PREFIXES
483
462
 
484
463
  protected
485
464
 
486
465
  def build_hashes
487
466
  convert_headers!
488
467
  convert_columns!
489
- cells_rows[1..-1].map do |row|
490
- row.to_hash
491
- end
492
- end
493
-
494
- def inspect_rows(missing_row, inserted_row) #:nodoc:
495
- missing_row.each_with_index do |missing_cell, col|
496
- inserted_cell = inserted_row[col]
497
- if(missing_cell.value != inserted_cell.value && (missing_cell.value.to_s == inserted_cell.value.to_s))
498
- missing_cell.inspect!
499
- inserted_cell.inspect!
500
- end
501
- end
468
+ cells_rows[1..-1].map(&:to_hash)
502
469
  end
503
470
 
504
471
  def create_cell_matrix(ast_table) #:nodoc:
505
472
  ast_table.raw.map do |raw_row|
506
- line = raw_row.line rescue -1
473
+ line = begin
474
+ raw_row.line
475
+ rescue StandardError
476
+ -1
477
+ end
507
478
  raw_row.map do |raw_cell|
508
479
  Cell.new(raw_cell, self, line)
509
480
  end
@@ -528,111 +499,42 @@ module Cucumber
528
499
  header_cells = cell_matrix[0]
529
500
 
530
501
  if @header_conversion_proc
531
- header_values = header_cells.map { |cell| cell.value } - @header_mappings.keys
502
+ header_values = header_cells.map(&:value) - @header_mappings.keys
532
503
  @header_mappings = @header_mappings.merge(Hash[*header_values.zip(header_values.map(&@header_conversion_proc)).flatten])
533
504
  end
534
505
 
535
506
  @header_mappings.each_pair do |pre, post|
536
- mapped_cells = header_cells.select { |cell| pre === cell.value }
507
+ mapped_cells = header_cells.reject { |cell| cell.value.match(pre).nil? }
537
508
  raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
538
- raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map { |c| c.value }.inspect}" if mapped_cells.length > 1
509
+ raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map(&:value).inspect}" if mapped_cells.length > 1
539
510
  mapped_cells[0].value = post
540
- if @conversion_procs.has_key?(pre)
541
- @conversion_procs[post] = @conversion_procs.delete(pre)
542
- end
543
- end
544
- end
545
-
546
- def require_diff_lcs #:nodoc:
547
- begin
548
- require 'diff/lcs'
549
- rescue LoadError => e
550
- e.message << "\n Please gem install diff-lcs\n"
551
- raise e
511
+ @conversion_procs[post] = @conversion_procs.delete(pre) if @conversion_procs.key?(pre)
552
512
  end
553
513
  end
554
514
 
555
515
  def clear_cache! #:nodoc:
556
- @hashes = @rows_hash = @col_names = @rows = @columns = nil
557
- end
558
-
559
- # Pads our own cell_matrix and returns a cell matrix of same
560
- # column width that can be used for diffing
561
- def pad!(other_cell_matrix) #:nodoc:
562
- clear_cache!
563
- cols = cell_matrix.transpose
564
- unmapped_cols = other_cell_matrix.transpose
565
-
566
- mapped_cols = []
567
-
568
- cols.each_with_index do |col, col_index|
569
- header = col[0]
570
- candidate_cols, unmapped_cols = unmapped_cols.partition do |other_col|
571
- other_col[0] == header
572
- end
573
- raise "More than one column has the header #{header}" if candidate_cols.size > 2
574
-
575
- other_padded_col = if candidate_cols.size == 1
576
- # Found a matching column
577
- candidate_cols[0]
578
- else
579
- mark_as_missing(cols[col_index])
580
- (0...other_cell_matrix.length).map do |row|
581
- val = row == 0 ? header.value : nil
582
- SurplusCell.new(val, self, -1)
583
- end
584
- end
585
- mapped_cols.insert(col_index, other_padded_col)
586
- end
587
-
588
- unmapped_cols.each_with_index do |col, col_index|
589
- empty_col = (0...cell_matrix.length).map do |row|
590
- SurplusCell.new(nil, self, -1)
591
- end
592
- cols << empty_col
593
- end
594
-
595
- @cell_matrix = cols.transpose
596
- (mapped_cols + unmapped_cols).transpose
516
+ @hashes = @rows_hash = @column_names = @rows = @columns = nil
597
517
  end
598
518
 
599
519
  def ensure_table(table_or_array) #:nodoc:
600
- return table_or_array if DataTable === table_or_array
520
+ return table_or_array if DataTable == table_or_array.class
601
521
  DataTable.from(table_or_array)
602
522
  end
603
523
 
604
- def ensure_array_of_array(array)
605
- Hash === array[0] ? hashes_to_array(array) : array
606
- end
607
-
608
- def hashes_to_array(hashes) #:nodoc:
609
- header = hashes[0].keys.sort
610
- [header] + hashes.map{|hash| header.map{|key| hash[key]}}
611
- end
612
-
613
- def ensure_green! #:nodoc:
614
- each_cell{|cell| cell.status = :passed}
615
- end
616
-
617
- def each_cell(&proc) #:nodoc:
618
- cell_matrix.each{|row| row.each(&proc)}
619
- end
620
-
621
- def mark_as_missing(col) #:nodoc:
622
- col.each do |cell|
623
- cell.status = :undefined
624
- end
524
+ def symbolize_key(key)
525
+ key.downcase.tr(' ', '_').to_sym
625
526
  end
626
527
 
627
528
  # Represents a row of cells or columns of cells
628
529
  class Cells #:nodoc:
629
530
  include Enumerable
630
- include Gherkin::Formatter::Escaping
531
+ include Cucumber::Gherkin::Formatter::Escaping
631
532
 
632
533
  attr_reader :exception
633
534
 
634
535
  def initialize(table, cells)
635
- @table, @cells = table, cells
536
+ @table = table
537
+ @cells = cells
636
538
  end
637
539
 
638
540
  def accept(visitor)
@@ -645,7 +547,7 @@ module Cucumber
645
547
 
646
548
  # For testing only
647
549
  def to_sexp #:nodoc:
648
- [:row, line, *@cells.map{|cell| cell.to_sexp}]
550
+ [:row, line, *@cells.map(&:to_sexp)]
649
551
  end
650
552
 
651
553
  def to_hash #:nodoc:
@@ -679,7 +581,7 @@ module Cucumber
679
581
  end
680
582
 
681
583
  def width
682
- map{|cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0}.max
584
+ map { |cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0 }.max
683
585
  end
684
586
  end
685
587
 
@@ -688,19 +590,21 @@ module Cucumber
688
590
  attr_accessor :status, :value
689
591
 
690
592
  def initialize(value, table, line)
691
- @value, @table, @line = value, table, line
593
+ @value = value
594
+ @table = table
595
+ @line = line
692
596
  end
693
597
 
694
598
  def inspect!
695
599
  @value = "(i) #{value.inspect}"
696
600
  end
697
601
 
698
- def ==(o)
699
- SurplusCell === o || value == o.value
602
+ def ==(other)
603
+ SurplusCell == other.class || value == other.value
700
604
  end
701
605
 
702
- def eql?(o)
703
- self == o
606
+ def eql?(other)
607
+ self == other
704
608
  end
705
609
 
706
610
  def hash
@@ -718,7 +622,7 @@ module Cucumber
718
622
  :comment
719
623
  end
720
624
 
721
- def ==(o)
625
+ def ==(_other)
722
626
  true
723
627
  end
724
628