cucumber 3.0.0 → 3.1.0

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 (429) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +53 -3
  3. data/CONTRIBUTING.md +2 -4
  4. data/README.md +6 -5
  5. data/lib/cucumber/cli/options.rb +3 -1
  6. data/lib/cucumber/errors.rb +1 -1
  7. data/lib/cucumber/events/test_step_finished.rb +0 -2
  8. data/lib/cucumber/events/test_step_started.rb +0 -2
  9. data/lib/cucumber/events.rb +0 -1
  10. data/lib/cucumber/filters/quit.rb +0 -1
  11. data/lib/cucumber/formatter/html.rb +1 -1
  12. data/lib/cucumber/formatter/html_builder.rb +1 -1
  13. data/lib/cucumber/formatter/ignore_missing_messages.rb +0 -1
  14. data/lib/cucumber/formatter/json.rb +1 -1
  15. data/lib/cucumber/formatter/json_pretty.rb +0 -1
  16. data/lib/cucumber/formatter/junit.rb +6 -2
  17. data/lib/cucumber/formatter/rerun.rb +1 -1
  18. data/lib/cucumber/formatter/summary.rb +0 -1
  19. data/lib/cucumber/glue/dsl.rb +6 -2
  20. data/lib/cucumber/glue/proto_world.rb +2 -0
  21. data/lib/cucumber/glue/step_definition.rb +1 -1
  22. data/lib/cucumber/glue/world_factory.rb +1 -1
  23. data/lib/cucumber/hooks.rb +12 -0
  24. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +0 -1
  25. data/lib/cucumber/multiline_argument/data_table.rb +6 -10
  26. data/lib/cucumber/multiline_argument.rb +1 -1
  27. data/lib/cucumber/step_definitions.rb +1 -1
  28. data/lib/cucumber/step_match.rb +4 -1
  29. data/lib/cucumber/step_match_search.rb +1 -1
  30. data/lib/cucumber/version +1 -1
  31. metadata +32 -571
  32. data/.coveralls.yml +0 -1
  33. data/.cucumberproignore +0 -6
  34. data/.gitattributes +0 -32
  35. data/.github/ISSUE_TEMPLATE.md +0 -48
  36. data/.github/PULL_REQUEST_TEMPLATE.md +0 -40
  37. data/.rspec +0 -1
  38. data/.rubocop.yml +0 -13
  39. data/.rubocop_todo.yml +0 -991
  40. data/.ruby-gemset +0 -1
  41. data/.travis.yml +0 -69
  42. data/.yardopts +0 -1
  43. data/Gemfile +0 -28
  44. data/Rakefile +0 -32
  45. data/appveyor.yml +0 -27
  46. data/cucumber.gemspec +0 -52
  47. data/cucumber.yml +0 -19
  48. data/examples/i18n/README.textile +0 -3
  49. data/examples/i18n/Rakefile +0 -33
  50. data/examples/i18n/ar/Rakefile +0 -6
  51. data/examples/i18n/ar/features/addition.feature +0 -17
  52. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -29
  53. data/examples/i18n/ar/lib/calculator.rb +0 -11
  54. data/examples/i18n/bg/Rakefile +0 -6
  55. data/examples/i18n/bg/features/addition.feature +0 -12
  56. data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
  57. data/examples/i18n/bg/features/division.feature +0 -17
  58. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
  59. data/examples/i18n/bg/features/support/env.rb +0 -10
  60. data/examples/i18n/bg/features/support/world.rb +0 -8
  61. data/examples/i18n/bg/lib/calculator.rb +0 -25
  62. data/examples/i18n/ca/Rakefile +0 -6
  63. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -26
  64. data/examples/i18n/ca/features/suma.feature +0 -17
  65. data/examples/i18n/ca/lib/calculadora.rb +0 -16
  66. data/examples/i18n/cs/Rakefile +0 -6
  67. data/examples/i18n/cs/features/addition.feature +0 -17
  68. data/examples/i18n/cs/features/division.feature +0 -11
  69. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -29
  70. data/examples/i18n/cs/lib/calculator.rb +0 -14
  71. data/examples/i18n/da/Rakefile +0 -6
  72. data/examples/i18n/da/features/sammenlaegning.feature +0 -18
  73. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -29
  74. data/examples/i18n/da/lib/lommeregner.rb +0 -11
  75. data/examples/i18n/de/Rakefile +0 -6
  76. data/examples/i18n/de/features/addition.feature +0 -17
  77. data/examples/i18n/de/features/division.feature +0 -10
  78. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -29
  79. data/examples/i18n/de/lib/calculator.rb +0 -14
  80. data/examples/i18n/el/Rakefile +0 -6
  81. data/examples/i18n/el/features/addition.feature +0 -17
  82. data/examples/i18n/el/features/division.feature +0 -10
  83. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -29
  84. data/examples/i18n/el/lib/calculator.rb +0 -14
  85. data/examples/i18n/en/Rakefile +0 -6
  86. data/examples/i18n/en/features/addition.feature +0 -17
  87. data/examples/i18n/en/features/division.feature +0 -10
  88. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -29
  89. data/examples/i18n/en/lib/calculator.rb +0 -14
  90. data/examples/i18n/en-lol/Rakefile +0 -4
  91. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
  92. data/examples/i18n/en-lol/features/stuffing.feature +0 -8
  93. data/examples/i18n/en-lol/features/support/env.rb +0 -11
  94. data/examples/i18n/en-lol/lib/basket.rb +0 -12
  95. data/examples/i18n/en-lol/lib/belly.rb +0 -11
  96. data/examples/i18n/eo/Rakefile +0 -6
  97. data/examples/i18n/eo/features/adicio.feature +0 -17
  98. data/examples/i18n/eo/features/divido.feature +0 -10
  99. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -29
  100. data/examples/i18n/eo/lib/calculator.rb +0 -14
  101. data/examples/i18n/es/Rakefile +0 -6
  102. data/examples/i18n/es/features/adicion.feature +0 -17
  103. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -26
  104. data/examples/i18n/es/lib/calculador.rb +0 -14
  105. data/examples/i18n/et/Rakefile +0 -6
  106. data/examples/i18n/et/features/jagamine.feature +0 -10
  107. data/examples/i18n/et/features/liitmine.feature +0 -17
  108. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -29
  109. data/examples/i18n/et/lib/kalkulaator.rb +0 -14
  110. data/examples/i18n/fi/Rakefile +0 -6
  111. data/examples/i18n/fi/features/jakolasku.feature +0 -10
  112. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -29
  113. data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
  114. data/examples/i18n/fi/lib/laskin.rb +0 -14
  115. data/examples/i18n/fr/Rakefile +0 -8
  116. data/examples/i18n/fr/features/addition.feature +0 -18
  117. data/examples/i18n/fr/features/addition2.feature +0 -17
  118. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
  119. data/examples/i18n/fr/features/support/env.rb +0 -10
  120. data/examples/i18n/fr/lib/calculatrice.rb +0 -10
  121. data/examples/i18n/he/Rakefile +0 -6
  122. data/examples/i18n/he/features/addition.feature +0 -17
  123. data/examples/i18n/he/features/division.feature +0 -10
  124. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -29
  125. data/examples/i18n/he/lib/calculator.rb +0 -15
  126. data/examples/i18n/hi/Rakefile +0 -6
  127. data/examples/i18n/hi/features/addition.feature +0 -16
  128. data/examples/i18n/hi/features/division.feature +0 -10
  129. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -29
  130. data/examples/i18n/hi/lib/calculator.rb +0 -15
  131. data/examples/i18n/ht/Rakefile +0 -6
  132. data/examples/i18n/ht/features/adisyon.feature +0 -17
  133. data/examples/i18n/ht/features/divizyon.feature +0 -10
  134. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +0 -29
  135. data/examples/i18n/ht/lib/kalkilatris.rb +0 -14
  136. data/examples/i18n/hu/Rakefile +0 -6
  137. data/examples/i18n/hu/features/osszeadas.feature +0 -17
  138. data/examples/i18n/hu/features/osztas.feature +0 -10
  139. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -30
  140. data/examples/i18n/hu/lib/calculator.rb +0 -14
  141. data/examples/i18n/id/Rakefile +0 -6
  142. data/examples/i18n/id/features/addition.feature +0 -17
  143. data/examples/i18n/id/features/division.feature +0 -10
  144. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -29
  145. data/examples/i18n/id/lib/calculator.rb +0 -14
  146. data/examples/i18n/it/Rakefile +0 -6
  147. data/examples/i18n/it/features/somma.feature +0 -11
  148. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -29
  149. data/examples/i18n/it/lib/calcolatrice.rb +0 -11
  150. data/examples/i18n/ja/Rakefile +0 -6
  151. data/examples/i18n/ja/features/addition.feature +0 -17
  152. data/examples/i18n/ja/features/division.feature +0 -10
  153. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
  154. data/examples/i18n/ja/features/support/env.rb +0 -10
  155. data/examples/i18n/ja/lib/calculator.rb +0 -14
  156. data/examples/i18n/ko/Rakefile +0 -6
  157. data/examples/i18n/ko/features/addition.feature +0 -17
  158. data/examples/i18n/ko/features/division.feature +0 -11
  159. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -29
  160. data/examples/i18n/ko/lib/calculator.rb +0 -14
  161. data/examples/i18n/lt/Rakefile +0 -6
  162. data/examples/i18n/lt/features/addition.feature +0 -17
  163. data/examples/i18n/lt/features/division.feature +0 -10
  164. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -29
  165. data/examples/i18n/lt/lib/calculator.rb +0 -14
  166. data/examples/i18n/lv/Rakefile +0 -6
  167. data/examples/i18n/lv/features/addition.feature +0 -17
  168. data/examples/i18n/lv/features/division.feature +0 -10
  169. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -29
  170. data/examples/i18n/lv/lib/calculator.rb +0 -14
  171. data/examples/i18n/no/Rakefile +0 -6
  172. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
  173. data/examples/i18n/no/features/summering.feature +0 -19
  174. data/examples/i18n/no/features/support/env.rb +0 -11
  175. data/examples/i18n/no/lib/kalkulator.rb +0 -11
  176. data/examples/i18n/pl/Rakefile +0 -6
  177. data/examples/i18n/pl/features/addition.feature +0 -17
  178. data/examples/i18n/pl/features/division.feature +0 -10
  179. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -29
  180. data/examples/i18n/pl/features/support/env.rb +0 -10
  181. data/examples/i18n/pl/lib/calculator.rb +0 -14
  182. data/examples/i18n/pt/Rakefile +0 -6
  183. data/examples/i18n/pt/features/adicao.feature +0 -11
  184. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
  185. data/examples/i18n/pt/features/support/env.rb +0 -10
  186. data/examples/i18n/pt/lib/calculadora.rb +0 -10
  187. data/examples/i18n/ro/Rakefile +0 -6
  188. data/examples/i18n/ro/features/adunare.feature +0 -12
  189. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -26
  190. data/examples/i18n/ro/lib/calculator.rb +0 -11
  191. data/examples/i18n/ru/Rakefile +0 -6
  192. data/examples/i18n/ru/features/addition.feature +0 -11
  193. data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
  194. data/examples/i18n/ru/features/division.feature +0 -16
  195. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
  196. data/examples/i18n/ru/features/support/env.rb +0 -10
  197. data/examples/i18n/ru/features/support/world.rb +0 -8
  198. data/examples/i18n/ru/lib/calculator.rb +0 -25
  199. data/examples/i18n/sk/Rakefile +0 -6
  200. data/examples/i18n/sk/features/addition.feature +0 -17
  201. data/examples/i18n/sk/features/division.feature +0 -10
  202. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -29
  203. data/examples/i18n/sk/lib/calculator.rb +0 -14
  204. data/examples/i18n/sr-Cyrl/Rakefile +0 -6
  205. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
  206. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
  207. data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -10
  208. data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
  209. data/examples/i18n/sr-Latn/Rakefile +0 -6
  210. data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
  211. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -29
  212. data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
  213. data/examples/i18n/sv/Rakefile +0 -6
  214. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -29
  215. data/examples/i18n/sv/features/summering.feature +0 -18
  216. data/examples/i18n/sv/lib/kalkulator.rb +0 -11
  217. data/examples/i18n/tr/Rakefile +0 -6
  218. data/examples/i18n/tr/features/bolme.feature +0 -10
  219. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -29
  220. data/examples/i18n/tr/features/toplama.feature +0 -18
  221. data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
  222. data/examples/i18n/uk/Rakefile +0 -6
  223. data/examples/i18n/uk/features/addition.feature +0 -11
  224. data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
  225. data/examples/i18n/uk/features/division.feature +0 -16
  226. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
  227. data/examples/i18n/uk/features/support/env.rb +0 -10
  228. data/examples/i18n/uk/features/support/world.rb +0 -8
  229. data/examples/i18n/uk/lib/calculator.rb +0 -25
  230. data/examples/i18n/uz/Rakefile +0 -6
  231. data/examples/i18n/uz/features/addition.feature +0 -10
  232. data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
  233. data/examples/i18n/uz/features/division.feature +0 -17
  234. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
  235. data/examples/i18n/uz/features/support/env.rb +0 -10
  236. data/examples/i18n/uz/features/support/world.rb +0 -8
  237. data/examples/i18n/uz/lib/calculator.rb +0 -25
  238. data/examples/i18n/zh-CN/Rakefile +0 -4
  239. data/examples/i18n/zh-CN/features/addition.feature +0 -18
  240. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -31
  241. data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
  242. data/examples/i18n/zh-TW/Rakefile +0 -4
  243. data/examples/i18n/zh-TW/features/addition.feature +0 -17
  244. data/examples/i18n/zh-TW/features/division.feature +0 -11
  245. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -29
  246. data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
  247. data/examples/rspec_doubles/Rakefile +0 -4
  248. data/examples/rspec_doubles/features/mocking.feature +0 -9
  249. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
  250. data/examples/rspec_doubles/features/support/env.rb +0 -12
  251. data/examples/sinatra/README.textile +0 -13
  252. data/examples/sinatra/Rakefile +0 -6
  253. data/examples/sinatra/app.rb +0 -14
  254. data/examples/sinatra/features/add.feature +0 -11
  255. data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
  256. data/examples/sinatra/features/support/env.rb +0 -15
  257. data/examples/sinatra/views/add.erb +0 -7
  258. data/examples/sinatra/views/layout.erb +0 -8
  259. data/examples/tcl/README.textile +0 -11
  260. data/examples/tcl/Rakefile +0 -6
  261. data/examples/tcl/features/fibonnacci.feature +0 -17
  262. data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
  263. data/examples/tcl/features/support/env.rb +0 -7
  264. data/examples/tcl/src/fib.tcl +0 -3
  265. data/examples/test_unit/Gemfile +0 -4
  266. data/examples/test_unit/Rakefile +0 -6
  267. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
  268. data/examples/test_unit/features/test_unit.feature +0 -9
  269. data/examples/watir/README.textile +0 -16
  270. data/examples/watir/Rakefile +0 -12
  271. data/examples/watir/cucumber.yml +0 -1
  272. data/examples/watir/features/search.feature +0 -12
  273. data/examples/watir/features/step_definitions/search_steps.rb +0 -27
  274. data/examples/watir/features/support/env.rb +0 -39
  275. data/examples/watir/features/support/screenshots.rb +0 -47
  276. data/features/docs/api/list_step_defs_as_json.feature +0 -64
  277. data/features/docs/api/listen_for_events.feature +0 -59
  278. data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -27
  279. data/features/docs/cli/backtraces.feature +0 -36
  280. data/features/docs/cli/dry_run.feature +0 -73
  281. data/features/docs/cli/exclude_files.feature +0 -18
  282. data/features/docs/cli/execute_with_tag_filter.feature +0 -119
  283. data/features/docs/cli/fail_fast.feature +0 -48
  284. data/features/docs/cli/finding_steps.feature +0 -28
  285. data/features/docs/cli/help.feature +0 -8
  286. data/features/docs/cli/i18n.feature +0 -42
  287. data/features/docs/cli/randomize.feature +0 -140
  288. data/features/docs/cli/require.feature +0 -27
  289. data/features/docs/cli/retry_failing_tests.feature +0 -92
  290. data/features/docs/cli/run_scenarios_matching_name.feature +0 -105
  291. data/features/docs/cli/run_specific_scenarios.feature +0 -77
  292. data/features/docs/cli/showing_differences.feature +0 -43
  293. data/features/docs/cli/specifying_multiple_formatters.feature +0 -68
  294. data/features/docs/cli/strict_mode.feature +0 -70
  295. data/features/docs/defining_steps/ambiguous_steps.feature +0 -89
  296. data/features/docs/defining_steps/nested_steps.feature +0 -181
  297. data/features/docs/defining_steps/nested_steps_i18n.feature +0 -37
  298. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -56
  299. data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
  300. data/features/docs/defining_steps/printing_messages.feature +0 -147
  301. data/features/docs/defining_steps/skip_scenario.feature +0 -31
  302. data/features/docs/defining_steps/snippets.feature +0 -56
  303. data/features/docs/defining_steps/table_diffing.feature +0 -50
  304. data/features/docs/events/gherkin_source_read_event.feature +0 -43
  305. data/features/docs/events/step_activated_event.feature +0 -36
  306. data/features/docs/events/step_definition_registered_event.feature +0 -29
  307. data/features/docs/events/test_case_finished_event.feature +0 -35
  308. data/features/docs/events/test_case_started_event.feature +0 -54
  309. data/features/docs/events/test_run_finished_event.feature +0 -40
  310. data/features/docs/events/test_run_started_event.feature +0 -41
  311. data/features/docs/events/test_step_finished_event.feature +0 -47
  312. data/features/docs/events/test_step_started_event.feature +0 -43
  313. data/features/docs/exception_in_after_hook.feature +0 -127
  314. data/features/docs/exception_in_after_step_hook.feature +0 -104
  315. data/features/docs/exception_in_around_hook.feature +0 -80
  316. data/features/docs/exception_in_before_hook.feature +0 -98
  317. data/features/docs/extending_cucumber/custom_filter.feature +0 -29
  318. data/features/docs/extending_cucumber/custom_formatter.feature +0 -94
  319. data/features/docs/formatters/api_methods.feature +0 -37
  320. data/features/docs/formatters/html_formatter.feature +0 -91
  321. data/features/docs/formatters/json_formatter.feature +0 -767
  322. data/features/docs/formatters/junit_formatter.feature +0 -455
  323. data/features/docs/formatters/pretty_formatter.feature +0 -74
  324. data/features/docs/formatters/progress_formatter.feature +0 -32
  325. data/features/docs/formatters/rerun_formatter.feature +0 -190
  326. data/features/docs/formatters/summary_formatter.feature +0 -35
  327. data/features/docs/formatters/usage_formatter.feature +0 -101
  328. data/features/docs/getting_started.feature +0 -28
  329. data/features/docs/gherkin/background.feature +0 -548
  330. data/features/docs/gherkin/doc_strings.feature +0 -76
  331. data/features/docs/gherkin/expand_option_for_outlines.feature +0 -47
  332. data/features/docs/gherkin/language_from_header.feature +0 -32
  333. data/features/docs/gherkin/outlines.feature +0 -158
  334. data/features/docs/gherkin/unicode_table.feature +0 -33
  335. data/features/docs/gherkin/using_descriptions.feature +0 -83
  336. data/features/docs/gherkin/using_star_notation.feature +0 -37
  337. data/features/docs/iso-8859-1.feature +0 -6
  338. data/features/docs/post_configuration_hook.feature +0 -33
  339. data/features/docs/profiles.feature +0 -120
  340. data/features/docs/rake_task.feature +0 -146
  341. data/features/docs/raketask.feature +0 -46
  342. data/features/docs/work_in_progress.feature +0 -157
  343. data/features/docs/writing_support_code/after_hooks.feature +0 -102
  344. data/features/docs/writing_support_code/after_step_hooks.feature +0 -55
  345. data/features/docs/writing_support_code/around_hooks.feature +0 -266
  346. data/features/docs/writing_support_code/before_hook.feature +0 -66
  347. data/features/docs/writing_support_code/hook_order.feature +0 -63
  348. data/features/docs/writing_support_code/load_path.feature +0 -17
  349. data/features/docs/writing_support_code/parameter_types.feature +0 -53
  350. data/features/docs/writing_support_code/state.feature +0 -32
  351. data/features/docs/writing_support_code/tagged_hooks.feature +0 -95
  352. data/features/docs/writing_support_code/world.feature +0 -129
  353. data/features/lib/step_definitions/aruba_steps.rb +0 -21
  354. data/features/lib/step_definitions/cli_steps.rb +0 -4
  355. data/features/lib/step_definitions/cucumber_steps.rb +0 -75
  356. data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -16
  357. data/features/lib/step_definitions/json_steps.rb +0 -8
  358. data/features/lib/step_definitions/junit_steps.rb +0 -14
  359. data/features/lib/step_definitions/language_steps.rb +0 -9
  360. data/features/lib/step_definitions/profile_steps.rb +0 -16
  361. data/features/lib/step_definitions/retry_steps.rb +0 -55
  362. data/features/lib/step_definitions/ruby_steps.rb +0 -4
  363. data/features/lib/support/env.rb +0 -22
  364. data/features/lib/support/fake_wire_server.rb +0 -94
  365. data/features/lib/support/feature_factory.rb +0 -68
  366. data/features/lib/support/normalise_output.rb +0 -52
  367. data/features/lib/support/parameter_types.rb +0 -5
  368. data/gem_tasks/contributors.rake +0 -19
  369. data/gem_tasks/cov.rake +0 -6
  370. data/gem_tasks/downloads.rb +0 -8
  371. data/gem_tasks/environment.rake +0 -4
  372. data/gem_tasks/examples.rake +0 -12
  373. data/gem_tasks/fix_cr_lf.rake +0 -22
  374. data/gem_tasks/flog.rake +0 -5
  375. data/gem_tasks/rspec.rake +0 -7
  376. data/gem_tasks/sass.rake +0 -5
  377. data/gem_tasks/stats +0 -16
  378. data/gem_tasks/versions.txt +0 -74
  379. data/scripts/invite-collaborator +0 -40
  380. data/scripts/update-changelog +0 -86
  381. data/spec/cucumber/cli/configuration_spec.rb +0 -446
  382. data/spec/cucumber/cli/main_spec.rb +0 -84
  383. data/spec/cucumber/cli/options_spec.rb +0 -445
  384. data/spec/cucumber/cli/profile_loader_spec.rb +0 -66
  385. data/spec/cucumber/cli/rerun_spec.rb +0 -86
  386. data/spec/cucumber/configuration_spec.rb +0 -148
  387. data/spec/cucumber/constantize_spec.rb +0 -20
  388. data/spec/cucumber/events_spec.rb +0 -9
  389. data/spec/cucumber/file_specs_spec.rb +0 -61
  390. data/spec/cucumber/filters/activate_steps_spec.rb +0 -152
  391. data/spec/cucumber/filters/gated_receiver_spec.rb +0 -48
  392. data/spec/cucumber/filters/retry_spec.rb +0 -98
  393. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -39
  394. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -58
  395. data/spec/cucumber/filters/tag_limits_spec.rb +0 -60
  396. data/spec/cucumber/formatter/ansicolor_spec.rb +0 -33
  397. data/spec/cucumber/formatter/backtrace_filter_spec.rb +0 -32
  398. data/spec/cucumber/formatter/console_counts_spec.rb +0 -14
  399. data/spec/cucumber/formatter/duration_spec.rb +0 -23
  400. data/spec/cucumber/formatter/fail_fast_spec.rb +0 -88
  401. data/spec/cucumber/formatter/html_spec.rb +0 -543
  402. data/spec/cucumber/formatter/interceptor_spec.rb +0 -137
  403. data/spec/cucumber/formatter/json_spec.rb +0 -815
  404. data/spec/cucumber/formatter/junit_spec.rb +0 -251
  405. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2175
  406. data/spec/cucumber/formatter/pretty_spec.rb +0 -907
  407. data/spec/cucumber/formatter/progress_spec.rb +0 -170
  408. data/spec/cucumber/formatter/rerun_spec.rb +0 -97
  409. data/spec/cucumber/formatter/spec_helper.rb +0 -84
  410. data/spec/cucumber/glue/proto_world_spec.rb +0 -63
  411. data/spec/cucumber/glue/registry_and_more_spec.rb +0 -213
  412. data/spec/cucumber/glue/snippet_spec.rb +0 -174
  413. data/spec/cucumber/glue/step_definition_spec.rb +0 -207
  414. data/spec/cucumber/hooks_spec.rb +0 -31
  415. data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -653
  416. data/spec/cucumber/project_initializer_spec.rb +0 -88
  417. data/spec/cucumber/rake/forked_spec.rb +0 -58
  418. data/spec/cucumber/rake/task_spec.rb +0 -86
  419. data/spec/cucumber/running_test_case_spec.rb +0 -140
  420. data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -8
  421. data/spec/cucumber/runtime/support_code_spec.rb +0 -17
  422. data/spec/cucumber/runtime_spec.rb +0 -21
  423. data/spec/cucumber/sell_cucumbers.feature +0 -19
  424. data/spec/cucumber/step_argument_spec.rb +0 -19
  425. data/spec/cucumber/step_match_search_spec.rb +0 -113
  426. data/spec/cucumber/step_match_spec.rb +0 -86
  427. data/spec/cucumber/world/pending_spec.rb +0 -48
  428. data/spec/spec_helper.rb +0 -30
  429. data/spec/support/standard_step_actions.rb +0 -19
@@ -1,17 +0,0 @@
1
- Feature: Set up a default load path
2
-
3
- When you're developing a gem, it's convenient if your project's `lib` directory
4
- is already in the load path. Cucumber does this for you.
5
-
6
- Scenario: ./lib is included in the $LOAD_PATH
7
- Given a file named "features/support/env.rb" with:
8
- """
9
- require 'something'
10
- """
11
- And a file named "lib/something.rb" with:
12
- """
13
- class Something
14
- end
15
- """
16
- When I run `cucumber`
17
- Then it should pass
@@ -1,53 +0,0 @@
1
- Feature: Parameter Types
2
-
3
- Parameter Types allow you to convert primitive string arguments captured in step definitions
4
- into more meaningful data types.
5
-
6
- Background:
7
- Let's just create a simple feature for testing out parameter types.
8
- We also have a Person class that we need to be able to build.
9
-
10
- Given a file named "features/foo.feature" with:
11
- """
12
- Feature:
13
- Scenario:
14
- Given Joe has gone home
15
- When Sally contacts Joe
16
- """
17
- And a file named "features/step_definitions/steps.rb" with:
18
- """
19
- # It works with Regular Expressions
20
- Given /([A-Z]\w+) has gone home/ do |person|
21
- expect(person.name).to eq 'Joe'
22
- end
23
-
24
- # It works with Cucumber Expressions too
25
- When "{person} contacts {person}" do |contacter, contactee|
26
- expect(contacter.name).to eq 'Sally'
27
- expect(contactee.name).to eq 'Joe'
28
- end
29
- """
30
- And a file named "features/support/env.rb" with:
31
- """
32
- class Person
33
- attr_reader :name
34
-
35
- def initialize(name)
36
- @name = name
37
- end
38
- end
39
- """
40
-
41
- Scenario: Parameter type defined with ParameterType method
42
- This is the most basic way to use a parameter type.
43
-
44
- Given a file named "features/support/parameter_types.rb" with:
45
- """
46
- ParameterType(
47
- name: 'person',
48
- regexp: /[A-Z]\w+/,
49
- transformer: -> (name) { Person.new(name) }
50
- )
51
- """
52
- When I run `cucumber features/foo.feature`
53
- Then it should pass
@@ -1,32 +0,0 @@
1
- Feature: State
2
-
3
- You can pass state between step by setting instance variables,
4
- but those instance variables will be gone when the next scenario runs.
5
-
6
- Scenario: Set an ivar in one scenario, use it in the next step
7
- Given a file named "features/test.feature" with:
8
- """
9
- Feature:
10
- Scenario:
11
- Given I have set @flag = true
12
- Then @flag should be true
13
-
14
- Scenario:
15
- Then @flag should be nil
16
- """
17
- And a file named "features/step_definitions/steps.rb" with:
18
- """
19
- Given /set @flag/ do
20
- @flag = true
21
- end
22
- Then /flag should be true/ do
23
- expect(@flag).to be_truthy
24
- end
25
- Then /flag should be nil/ do
26
- expect(@flag).to be_nil
27
- end
28
- """
29
- When I run `cucumber`
30
- Then it should pass
31
-
32
-
@@ -1,95 +0,0 @@
1
- Feature: Tagged hooks
2
-
3
- Background:
4
- Given the standard step definitions
5
- And a file named "features/support/hooks.rb" with:
6
- """
7
- Before('not @no-boom') do
8
- raise 'boom'
9
- end
10
- """
11
- And a file named "features/f.feature" with:
12
- """
13
- Feature: With and without hooks
14
- Scenario: using hook
15
- Given this step passes
16
-
17
- @no-boom
18
- Scenario: omitting hook
19
- Given this step passes
20
-
21
- Scenario Outline: omitting hook on specified examples
22
- Given this step passes
23
-
24
- Examples:
25
- | Value |
26
- | Irrelevant |
27
-
28
- @no-boom
29
- Examples:
30
- | Value |
31
- | Also Irrelevant |
32
- """
33
-
34
- Scenario: omit tagged hook
35
- When I run `cucumber features/f.feature:2`
36
- Then it should fail with exactly:
37
- """
38
- Feature: With and without hooks
39
-
40
- Scenario: using hook # features/f.feature:2
41
- boom (RuntimeError)
42
- ./features/support/hooks.rb:2:in `Before'
43
- Given this step passes # features/step_definitions/steps.rb:1
44
-
45
- Failing Scenarios:
46
- cucumber features/f.feature:2 # Scenario: using hook
47
-
48
- 1 scenario (1 failed)
49
- 1 step (1 skipped)
50
- 0m0.012s
51
-
52
- """
53
-
54
- Scenario: omit tagged hook
55
- When I run `cucumber features/f.feature:6`
56
- Then it should pass with exactly:
57
- """
58
- Feature: With and without hooks
59
-
60
- @no-boom
61
- Scenario: omitting hook # features/f.feature:6
62
- Given this step passes # features/step_definitions/steps.rb:1
63
-
64
- 1 scenario (1 passed)
65
- 1 step (1 passed)
66
- 0m0.012s
67
-
68
- """
69
- Scenario: Omit example hook
70
- When I run `cucumber features/f.feature:12`
71
- Then it should fail with exactly:
72
- """
73
- Feature: With and without hooks
74
-
75
- Scenario Outline: omitting hook on specified examples # features/f.feature:9
76
- Given this step passes # features/f.feature:10
77
-
78
- Examples:
79
- | Value |
80
- boom (RuntimeError)
81
- ./features/support/hooks.rb:2:in `Before'
82
- | Irrelevant |
83
-
84
- Failing Scenarios:
85
- cucumber features/f.feature:14 # Scenario Outline: omitting hook on specified examples, Examples (#1)
86
-
87
- 1 scenario (1 failed)
88
- 1 step (1 skipped)
89
- 0m0.012s
90
-
91
- """
92
- Scenario:
93
- When I run `cucumber features/f.feature:17`
94
- Then it should pass
95
-
@@ -1,129 +0,0 @@
1
- Feature: World
2
-
3
- In order to isolate each test scenario, the steps definitions belonging to the
4
- same scenario will run in a isolated context, called 'world'. A world also
5
- contains the helpers methods that will be used in the step definitions.
6
-
7
- It is possible to add helpers methods to a world in three different ways:
8
-
9
- 1. Passing a module. In this case its methods will be added directly to the
10
- world and be usable in the step definitions.
11
-
12
- 2. Passing a block, where the return value is the world object.
13
-
14
- 3. Passing a hash, where the keys are namespaces and the values are
15
- modules. In this case, the methods of each module will be accessible using
16
- the key as prefix.
17
-
18
- Scenario: A world is extended using a module
19
- Given a file named "features/support/helpers.rb" with:
20
- """
21
- module Helpers
22
- def helper_method
23
- 42
24
- end
25
- end
26
-
27
- World(Helpers)
28
- """
29
- And a file named "features/step_definitions/step.rb" with:
30
- """
31
- Then /^the helper method is called$/ do
32
- expect(helper_method).to eql(42)
33
- end
34
- """
35
- And a file named "features/f.feature" with:
36
- """
37
- Feature: Calling a method
38
- Scenario: I call a method without namespaces
39
- Then the helper method is called
40
- """
41
- When I run `cucumber features/f.feature`
42
- Then it should pass
43
-
44
- Scenario: A world is created using a block
45
- Given a file named "features/support/helpers.rb" with:
46
- """
47
- class Helper
48
- def helper_method
49
- 42
50
- end
51
- end
52
-
53
- World do
54
- Helper.new
55
- end
56
- """
57
- And a file named "features/step_definitions/step.rb" with:
58
- """
59
- Then /^the helper method is called$/ do
60
- expect(helper_method).to eql(42)
61
- end
62
- """
63
- And a file named "features/f.feature" with:
64
- """
65
- Feature: Calling a method
66
- Scenario: I call a method from a namespace
67
- Then the helper method is called
68
- """
69
- When I run `cucumber features/f.feature`
70
- Then it should pass
71
-
72
- Scenario: A world is extended using a module with namespace
73
- Given a file named "features/support/helpers.rb" with:
74
- """
75
- module Helpers
76
- def helper_method
77
- 42
78
- end
79
- end
80
-
81
- World(my_namespace: Helpers)
82
- """
83
- And a file named "features/step_definitions/step.rb" with:
84
- """
85
- Then /^the helper method is called$/ do
86
- expect(my_namespace.helper_method).to eql(42)
87
- end
88
- """
89
- And a file named "features/f.feature" with:
90
- """
91
- Feature: Calling a method
92
- Scenario: I call a method from a namespace
93
- Then the helper method is called
94
- """
95
- When I run `cucumber features/f.feature`
96
- Then it should pass
97
-
98
- Scenario: A world is extended using multiple modules with different namespaces
99
- Given a file named "features/support/helpers.rb" with:
100
- """
101
- module ModuleOne
102
- def forty_one
103
- 41
104
- end
105
- end
106
-
107
- module ModuleTwo
108
- def forty_two
109
- 42
110
- end
111
- end
112
-
113
- World(module_one: ModuleOne, module_two: ModuleTwo)
114
- """
115
- And a file named "features/step_definitions/step.rb" with:
116
- """
117
- Then /^the helper method is called$/ do
118
- expect(module_one.forty_one).to eql(41)
119
- expect(module_two.forty_two).to eql(42)
120
- end
121
- """
122
- And a file named "features/f.feature" with:
123
- """
124
- Feature: Calling a method
125
- Scenario: I call a method from two namespaces
126
- Then the helper method is called
127
- """
128
- When I run `cucumber features/f.feature`
129
- Then it should pass
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
- Then(/^it should (pass|fail)$/) do |result|
3
- assert_success result == 'pass'
4
- end
5
-
6
- Then('{string} should not be required') do |file_name|
7
- expect(all_output).not_to include("* #{file_name}")
8
- end
9
-
10
- Then('{string} should be required') do |file_name|
11
- expect(all_output).to include("* #{file_name}")
12
- end
13
-
14
- Then('it fails before running features with:') do |expected|
15
- assert_matching_output("\\A#{expected}", all_output)
16
- assert_success(false)
17
- end
18
-
19
- Then('the output includes the message {string}') do |message|
20
- expect(all_output).to include(message)
21
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
- Then('I should see the CLI help') do
3
- expect(all_output).to include('Usage:')
4
- end
@@ -1,75 +0,0 @@
1
- # frozen_string_literal: true
2
- Given('a directory without standard Cucumber project directory structure') do
3
- in_current_dir do
4
- FileUtils.rm_rf 'features' if File.directory?('features')
5
- end
6
- end
7
-
8
- Given('a scenario with a step that looks like this:') do |string|
9
- create_feature do
10
- create_scenario { string }
11
- end
12
- end
13
-
14
- Given('a scenario with a step that looks like this in japanese:') do |string|
15
- create_feature_ja do
16
- create_scenario_ja { string }
17
- end
18
- end
19
-
20
- Given('the standard step definitions') do
21
- write_file 'features/step_definitions/steps.rb',
22
-
23
- <<-STEPS
24
- Given(/^this step passes$/) { }
25
- Given(/^this step raises an error$/) { raise 'error' }
26
- Given(/^this step is pending$/) { pending }
27
- Given(/^this step fails$/) { fail }
28
- Given(/^this step is a table step$/) {|t| }
29
- STEPS
30
- end
31
-
32
- Given('a step definition that looks like this:') do |string|
33
- create_step_definition { string }
34
- end
35
-
36
- Given('a scenario {string} that passes') do |name|
37
- write_file "features/#{name}.feature",
38
- <<-FEATURE
39
- Feature: #{name}
40
- Scenario: #{name}
41
- Given it passes
42
- FEATURE
43
-
44
- write_file "features/step_definitions/#{name}_steps.rb",
45
- <<-STEPS
46
- Given(/^it passes$/) { expect(true).to be true }
47
- STEPS
48
- end
49
-
50
- Given('a scenario {string} that fails') do |name|
51
- write_file "features/#{name}.feature",
52
- <<-FEATURE
53
- Feature: #{name}
54
- Scenario: #{name}
55
- Given it fails
56
- FEATURE
57
-
58
- write_file "features/step_definitions/#{name}_steps.rb",
59
- <<-STEPS
60
- Given(/^it fails$/) { expect(false).to be true }
61
- STEPS
62
- end
63
-
64
- When(/^I run the feature with the (\w+) formatter$/) do |formatter|
65
- expect(features.length).to eq 1
66
- run_feature features.first, formatter
67
- end
68
-
69
- module CucumberHelper
70
- def run_feature(filename = 'features/a_feature.feature', formatter = 'progress')
71
- run_simple "#{Cucumber::BINARY} #{filename} --format #{formatter}", false
72
- end
73
- end
74
-
75
- World(CucumberHelper)
@@ -1,16 +0,0 @@
1
- # encoding: iso-8859-1
2
- # frozen_string_literal: true
3
- # Ideally we would use Norwegian keywords here, but that won't work unless this
4
- # file is UTF-8 encoded.
5
- # Alternatively, it would be possible to use Norwegian keywords and encode the
6
- # file as UTF-8.
7
- #
8
- # In both cases, stepdef arguments will be sent in as UTF-8, regardless of what
9
- # encoding is used.
10
- Given(/^jeg drikker en "([^"]*)"$/) do |drink|
11
- expect(drink).to eq '�l'.encode('UTF-8')
12
- end
13
-
14
- When(/^skal de andre si "([^"]*)"$/) do |greeting|
15
- expect(greeting).to eq 'sk�l'.encode('UTF-8')
16
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
- Then(/^it should (pass|fail) with JSON:$/) do |pass_fail, json|
3
- actual = normalise_json(MultiJson.load(all_stdout))
4
- expected = MultiJson.load(json)
5
-
6
- expect(actual).to eq expected
7
- assert_success(pass_fail == 'pass')
8
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
- Then('the junit output file {string} should contain:') do |actual_file, text|
3
- actual = IO.read(current_dir + '/' + actual_file)
4
- actual = replace_junit_time(actual)
5
- expect(actual).to eq text
6
- end
7
-
8
- module JUnitHelper
9
- def replace_junit_time(s)
10
- s.gsub(/\d+\.\d\d+/m, '0.05')
11
- end
12
- end
13
-
14
- World(JUnitHelper)
@@ -1,9 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
-
4
- Then('cucumber lists all the supported languages') do
5
- sample_languages = %w(Arabic български Pirate English 日本語)
6
- sample_languages.each do |language|
7
- expect(all_output.force_encoding('utf-8')).to include(language)
8
- end
9
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
- Given('the following profile(s) are/is defined:') do |profiles|
3
- write_file 'cucumber.yml', profiles
4
- end
5
-
6
- Then('the {word} profile should be used') do |profile|
7
- step 'the stdout should contain:', profile
8
- end
9
-
10
- Then('exactly these files should be loaded: {list}') do |files|
11
- expect(all_stdout.scan(/^ \* (.*\.rb)$/).flatten).to eq files
12
- end
13
-
14
- Then('exactly these features should be run: {list}') do |files|
15
- expect(all_stdout.scan(/^ \* (.*\.feature)$/).flatten).to eq files
16
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
- Given('a scenario {string} that fails once, then passes') do |full_name|
3
- name = snake_case(full_name)
4
- write_file "features/#{name}.feature",
5
- <<-FEATURE
6
- Feature: #{full_name} feature
7
- Scenario: #{full_name}
8
- Given it fails once, then passes
9
- FEATURE
10
-
11
- write_file "features/step_definitions/#{name}_steps.rb",
12
- <<-STEPS
13
- Given(/^it fails once, then passes$/) do
14
- $#{name} += 1
15
- expect($#{name}).to be > 1
16
- end
17
- STEPS
18
-
19
- write_file "features/support/#{name}_init.rb",
20
- <<-INIT
21
- $#{name} = 0
22
- INIT
23
- end
24
-
25
- Given('a scenario {string} that fails twice, then passes') do |full_name|
26
- name = snake_case(full_name)
27
- write_file "features/#{name}.feature",
28
- <<-FEATURE
29
- Feature: #{full_name} feature
30
- Scenario: #{full_name}
31
- Given it fails twice, then passes
32
- FEATURE
33
-
34
- write_file "features/step_definitions/#{name}_steps.rb",
35
- <<-STEPS
36
- Given(/^it fails twice, then passes$/) do
37
- $#{name} ||= 0
38
- $#{name} += 1
39
- expect($#{name}).to be > 2
40
- end
41
- STEPS
42
-
43
- write_file "features/support/#{name}_init.rb",
44
- <<-INIT
45
- $#{name} = 0
46
- INIT
47
- end
48
-
49
- module SnakeCase
50
- def snake_case(name)
51
- name.downcase.gsub(/\W/, '_')
52
- end
53
- end
54
-
55
- World(SnakeCase)
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
- When('I run the following Ruby code:') do |code|
3
- run_simple %{ruby -e "#{code}"}
4
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'aruba/cucumber'
3
- require 'aruba/in_process'
4
- require 'aruba/spawn_process'
5
- require 'cucumber/cli/main'
6
-
7
- Before('@spawn') do
8
- Aruba.process = Aruba::SpawnProcess
9
- end
10
-
11
- Before('not @spawn') do
12
- Aruba::InProcess.main_class = Cucumber::Cli::Main
13
- Aruba.process = Aruba::InProcess
14
- end
15
-
16
- Before do
17
- # Make sure bin/cucumber runs with SimpleCov enabled
18
- # set_env('SIMPLECOV', 'true')
19
-
20
- # Set a longer timeout for aruba, and a really long one if running on JRuby
21
- @aruba_timeout_seconds = Cucumber::JRUBY ? 60 : 15
22
- end
@@ -1,94 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'multi_json'
3
- require 'socket'
4
-
5
- class FakeWireServer
6
- def initialize(port, protocol_table)
7
- @port, @protocol_table = port, protocol_table
8
- @delays = {}
9
- end
10
-
11
- def run(io)
12
- @server = TCPServer.open(@port)
13
- loop { handle_connections(io) }
14
- end
15
-
16
- def delay_response(message, delay)
17
- @delays[message] = delay
18
- end
19
-
20
- private
21
-
22
- def handle_connections(io)
23
- Thread.start(@server.accept) { |socket| open_session_on socket, io }
24
- end
25
-
26
- def open_session_on(socket, io)
27
- begin
28
- on_message = lambda { |message| io.puts message }
29
- SocketSession.new(socket, @protocol_table, @delays, on_message).start
30
- rescue Exception => e
31
- raise e
32
- ensure
33
- socket.close
34
- end
35
- end
36
-
37
- class SocketSession
38
- def initialize(socket, protocol, delays, on_message)
39
- @socket = socket
40
- @protocol = protocol
41
- @delays = delays
42
- @on_message = on_message
43
- end
44
-
45
- def start
46
- message = @socket.gets
47
-
48
- while message
49
- handle(message)
50
- message = @socket.gets
51
- end
52
- end
53
-
54
- private
55
-
56
- def handle(data)
57
- protocol_entry = response_to(data.strip)
58
-
59
- if protocol_entry
60
- sleep delay(data)
61
- @on_message.call(MultiJson.load(protocol_entry['request'])[0])
62
- send_response(protocol_entry['response'])
63
- else
64
- serialized_exception = { :message => "Not understood: #{data}", :backtrace => [] }
65
- send_response(['fail', serialized_exception ].to_json)
66
- end
67
- rescue => e
68
- response = [
69
- 'fail',
70
- {
71
- :message => e.message,
72
- :backtrace => e.backtrace,
73
- :exception => e.class
74
- }
75
- ].to_json
76
- send_response(response)
77
- end
78
-
79
- def response_to(data)
80
- @protocol.detect do |entry|
81
- MultiJson.load(entry['request']) == MultiJson.load(data)
82
- end
83
- end
84
-
85
- def send_response(response)
86
- @socket.puts response + "\n"
87
- end
88
-
89
- def delay(data)
90
- message = MultiJson.load(data.strip)[0]
91
- @delays[message.to_sym] || 0
92
- end
93
- end
94
- end