mobiusloop 0.1.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 (516) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.travis.yml +22 -0
  6. data/.yardopts +1 -0
  7. data/CONTRIBUTING.md +68 -0
  8. data/Gemfile +5 -0
  9. data/History.md +2280 -0
  10. data/LICENSE +22 -0
  11. data/README.md +373 -0
  12. data/Rakefile +22 -0
  13. data/bin/mobiusloop +8 -0
  14. data/cucumber.gemspec +47 -0
  15. data/cucumber.yml +20 -0
  16. data/examples/i18n/README.textile +3 -0
  17. data/examples/i18n/Rakefile +33 -0
  18. data/examples/i18n/ar/Rakefile +6 -0
  19. data/examples/i18n/ar/features/addition.feature +17 -0
  20. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +24 -0
  21. data/examples/i18n/ar/lib/calculator.rb +11 -0
  22. data/examples/i18n/bg/Rakefile +6 -0
  23. data/examples/i18n/bg/features/addition.feature +12 -0
  24. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  25. data/examples/i18n/bg/features/division.feature +17 -0
  26. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +24 -0
  27. data/examples/i18n/bg/features/support/env.rb +5 -0
  28. data/examples/i18n/bg/features/support/world.rb +8 -0
  29. data/examples/i18n/bg/lib/calculator.rb +24 -0
  30. data/examples/i18n/ca/Rakefile +6 -0
  31. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +21 -0
  32. data/examples/i18n/ca/features/suma.feature +17 -0
  33. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  34. data/examples/i18n/cs/Rakefile +6 -0
  35. data/examples/i18n/cs/features/addition.feature +17 -0
  36. data/examples/i18n/cs/features/division.feature +11 -0
  37. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +24 -0
  38. data/examples/i18n/cs/lib/calculator.rb +14 -0
  39. data/examples/i18n/da/Rakefile +6 -0
  40. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  41. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +24 -0
  42. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  43. data/examples/i18n/de/Rakefile +6 -0
  44. data/examples/i18n/de/features/addition.feature +17 -0
  45. data/examples/i18n/de/features/division.feature +10 -0
  46. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +24 -0
  47. data/examples/i18n/de/lib/calculator.rb +14 -0
  48. data/examples/i18n/el/Rakefile +6 -0
  49. data/examples/i18n/el/features/addition.feature +17 -0
  50. data/examples/i18n/el/features/division.feature +10 -0
  51. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
  52. data/examples/i18n/el/lib/calculator.rb +14 -0
  53. data/examples/i18n/en-lol/Rakefile +4 -0
  54. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  55. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  56. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  57. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  58. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  59. data/examples/i18n/en/Rakefile +6 -0
  60. data/examples/i18n/en/features/addition.feature +17 -0
  61. data/examples/i18n/en/features/division.feature +10 -0
  62. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +24 -0
  63. data/examples/i18n/en/lib/calculator.rb +14 -0
  64. data/examples/i18n/eo/Rakefile +6 -0
  65. data/examples/i18n/eo/features/adicio.feature +17 -0
  66. data/examples/i18n/eo/features/divido.feature +10 -0
  67. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +24 -0
  68. data/examples/i18n/eo/lib/calculator.rb +14 -0
  69. data/examples/i18n/es/Rakefile +6 -0
  70. data/examples/i18n/es/features/adicion.feature +17 -0
  71. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +21 -0
  72. data/examples/i18n/es/lib/calculador.rb +14 -0
  73. data/examples/i18n/et/Rakefile +6 -0
  74. data/examples/i18n/et/features/jagamine.feature +10 -0
  75. data/examples/i18n/et/features/liitmine.feature +17 -0
  76. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  77. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  78. data/examples/i18n/fi/Rakefile +6 -0
  79. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  80. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +24 -0
  81. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  82. data/examples/i18n/fi/lib/laskin.rb +14 -0
  83. data/examples/i18n/fr/Rakefile +8 -0
  84. data/examples/i18n/fr/features/addition.feature +18 -0
  85. data/examples/i18n/fr/features/addition2.feature +17 -0
  86. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  87. data/examples/i18n/fr/features/support/env.rb +5 -0
  88. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  89. data/examples/i18n/he/Rakefile +6 -0
  90. data/examples/i18n/he/features/addition.feature +17 -0
  91. data/examples/i18n/he/features/division.feature +10 -0
  92. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +24 -0
  93. data/examples/i18n/he/lib/calculator.rb +15 -0
  94. data/examples/i18n/hi/Rakefile +6 -0
  95. data/examples/i18n/hi/features/addition.feature +16 -0
  96. data/examples/i18n/hi/features/division.feature +10 -0
  97. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +24 -0
  98. data/examples/i18n/hi/lib/calculator.rb +15 -0
  99. data/examples/i18n/ht/Rakefile +6 -0
  100. data/examples/i18n/ht/features/adisyon.feature +17 -0
  101. data/examples/i18n/ht/features/divizyon.feature +10 -0
  102. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
  103. data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
  104. data/examples/i18n/hu/Rakefile +6 -0
  105. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  106. data/examples/i18n/hu/features/osztas.feature +10 -0
  107. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +25 -0
  108. data/examples/i18n/hu/lib/calculator.rb +14 -0
  109. data/examples/i18n/id/Rakefile +6 -0
  110. data/examples/i18n/id/features/addition.feature +17 -0
  111. data/examples/i18n/id/features/division.feature +10 -0
  112. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +24 -0
  113. data/examples/i18n/id/lib/calculator.rb +14 -0
  114. data/examples/i18n/it/Rakefile +6 -0
  115. data/examples/i18n/it/features/somma.feature +11 -0
  116. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +24 -0
  117. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  118. data/examples/i18n/ja/Rakefile +6 -0
  119. data/examples/i18n/ja/features/addition.feature +17 -0
  120. data/examples/i18n/ja/features/division.feature +10 -0
  121. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +19 -0
  122. data/examples/i18n/ja/features/support/env.rb +5 -0
  123. data/examples/i18n/ja/lib/calculator.rb +14 -0
  124. data/examples/i18n/ko/Rakefile +6 -0
  125. data/examples/i18n/ko/features/addition.feature +17 -0
  126. data/examples/i18n/ko/features/division.feature +11 -0
  127. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +24 -0
  128. data/examples/i18n/ko/lib/calculator.rb +14 -0
  129. data/examples/i18n/lt/Rakefile +6 -0
  130. data/examples/i18n/lt/features/addition.feature +17 -0
  131. data/examples/i18n/lt/features/division.feature +10 -0
  132. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +24 -0
  133. data/examples/i18n/lt/lib/calculator.rb +14 -0
  134. data/examples/i18n/lv/Rakefile +6 -0
  135. data/examples/i18n/lv/features/addition.feature +17 -0
  136. data/examples/i18n/lv/features/division.feature +10 -0
  137. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +24 -0
  138. data/examples/i18n/lv/lib/calculator.rb +14 -0
  139. data/examples/i18n/no/Rakefile +6 -0
  140. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +17 -0
  141. data/examples/i18n/no/features/summering.feature +19 -0
  142. data/examples/i18n/no/features/support/env.rb +6 -0
  143. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  144. data/examples/i18n/pl/Rakefile +6 -0
  145. data/examples/i18n/pl/features/addition.feature +17 -0
  146. data/examples/i18n/pl/features/division.feature +10 -0
  147. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +24 -0
  148. data/examples/i18n/pl/features/support/env.rb +5 -0
  149. data/examples/i18n/pl/lib/calculator.rb +14 -0
  150. data/examples/i18n/pt/Rakefile +6 -0
  151. data/examples/i18n/pt/features/adicao.feature +11 -0
  152. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  153. data/examples/i18n/pt/features/support/env.rb +5 -0
  154. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  155. data/examples/i18n/ro/Rakefile +6 -0
  156. data/examples/i18n/ro/features/adunare.feature +12 -0
  157. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +21 -0
  158. data/examples/i18n/ro/lib/calculator.rb +11 -0
  159. data/examples/i18n/ru/Rakefile +6 -0
  160. data/examples/i18n/ru/features/addition.feature +11 -0
  161. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  162. data/examples/i18n/ru/features/division.feature +16 -0
  163. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +19 -0
  164. data/examples/i18n/ru/features/support/env.rb +5 -0
  165. data/examples/i18n/ru/features/support/world.rb +8 -0
  166. data/examples/i18n/ru/lib/calculator.rb +24 -0
  167. data/examples/i18n/sk/Rakefile +6 -0
  168. data/examples/i18n/sk/features/addition.feature +17 -0
  169. data/examples/i18n/sk/features/division.feature +10 -0
  170. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +24 -0
  171. data/examples/i18n/sk/lib/calculator.rb +14 -0
  172. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  173. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  174. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +20 -0
  175. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  176. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  177. data/examples/i18n/sr-Latn/Rakefile +6 -0
  178. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  179. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +24 -0
  180. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  181. data/examples/i18n/sv/Rakefile +6 -0
  182. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +24 -0
  183. data/examples/i18n/sv/features/summering.feature +18 -0
  184. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  185. data/examples/i18n/tr/Rakefile +6 -0
  186. data/examples/i18n/tr/features/bolme.feature +10 -0
  187. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +24 -0
  188. data/examples/i18n/tr/features/toplama.feature +18 -0
  189. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  190. data/examples/i18n/uk/Rakefile +6 -0
  191. data/examples/i18n/uk/features/addition.feature +11 -0
  192. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  193. data/examples/i18n/uk/features/division.feature +16 -0
  194. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +19 -0
  195. data/examples/i18n/uk/features/support/env.rb +5 -0
  196. data/examples/i18n/uk/features/support/world.rb +8 -0
  197. data/examples/i18n/uk/lib/calculator.rb +24 -0
  198. data/examples/i18n/uz/Rakefile +6 -0
  199. data/examples/i18n/uz/features/addition.feature +10 -0
  200. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  201. data/examples/i18n/uz/features/division.feature +17 -0
  202. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +19 -0
  203. data/examples/i18n/uz/features/support/env.rb +5 -0
  204. data/examples/i18n/uz/features/support/world.rb +8 -0
  205. data/examples/i18n/uz/lib/calculator.rb +24 -0
  206. data/examples/i18n/zh-CN/Rakefile +4 -0
  207. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  208. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +26 -0
  209. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  210. data/examples/i18n/zh-TW/Rakefile +4 -0
  211. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  212. data/examples/i18n/zh-TW/features/division.feature +11 -0
  213. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +24 -0
  214. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  215. data/examples/mobiusloop/increase_readers.goal +13 -0
  216. data/examples/mobiusloop/scale_page_response.rb +20 -0
  217. data/examples/mobiusloop/total_articles_scale.rb +10 -0
  218. data/examples/mobiusloop/total_readers_scale.rb +10 -0
  219. data/examples/rspec_doubles/Rakefile +4 -0
  220. data/examples/rspec_doubles/features/mocking.feature +9 -0
  221. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  222. data/examples/rspec_doubles/features/support/env.rb +12 -0
  223. data/examples/sinatra/README.textile +13 -0
  224. data/examples/sinatra/Rakefile +6 -0
  225. data/examples/sinatra/app.rb +14 -0
  226. data/examples/sinatra/features/add.feature +11 -0
  227. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  228. data/examples/sinatra/features/support/env.rb +10 -0
  229. data/examples/sinatra/views/add.erb +7 -0
  230. data/examples/sinatra/views/layout.erb +8 -0
  231. data/examples/tcl/README.textile +11 -0
  232. data/examples/tcl/Rakefile +6 -0
  233. data/examples/tcl/features/fibonnacci.feature +17 -0
  234. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  235. data/examples/tcl/features/support/env.rb +6 -0
  236. data/examples/tcl/src/fib.tcl +3 -0
  237. data/examples/test_unit/Gemfile +4 -0
  238. data/examples/test_unit/Rakefile +6 -0
  239. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +20 -0
  240. data/examples/test_unit/features/test_unit.feature +9 -0
  241. data/examples/watir/README.textile +16 -0
  242. data/examples/watir/Rakefile +12 -0
  243. data/examples/watir/cucumber.yml +1 -0
  244. data/examples/watir/features/search.feature +12 -0
  245. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  246. data/examples/watir/features/support/env.rb +35 -0
  247. data/examples/watir/features/support/screenshots.rb +47 -0
  248. data/features/docs/api/list_step_defs_as_json.feature +50 -0
  249. data/features/docs/api/listen_for_events.feature +58 -0
  250. data/features/docs/api/run_cli_main_with_existing_runtime.feature +26 -0
  251. data/features/docs/cli/backtraces.feature +36 -0
  252. data/features/docs/cli/dry_run.feature +70 -0
  253. data/features/docs/cli/exclude_files.feature +18 -0
  254. data/features/docs/cli/execute_with_tag_filter.feature +117 -0
  255. data/features/docs/cli/fail_fast.feature +46 -0
  256. data/features/docs/cli/finding_steps.feature +28 -0
  257. data/features/docs/cli/randomize.feature +140 -0
  258. data/features/docs/cli/require.feature +27 -0
  259. data/features/docs/cli/retry_failing_tests.feature +32 -0
  260. data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
  261. data/features/docs/cli/run_specific_scenarios.feature +77 -0
  262. data/features/docs/cli/showing_differences.feature +43 -0
  263. data/features/docs/cli/specifying_multiple_formatters.feature +65 -0
  264. data/features/docs/cli/strict_mode.feature +64 -0
  265. data/features/docs/defining_steps/nested_steps.feature +177 -0
  266. data/features/docs/defining_steps/nested_steps_i18n.feature +34 -0
  267. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +54 -0
  268. data/features/docs/defining_steps/one_line_step_definitions.feature +65 -0
  269. data/features/docs/defining_steps/printing_messages.feature +148 -0
  270. data/features/docs/defining_steps/skip_scenario.feature +64 -0
  271. data/features/docs/defining_steps/snippets.feature +56 -0
  272. data/features/docs/defining_steps/table_diffing.feature +50 -0
  273. data/features/docs/exception_in_after_hook.feature +126 -0
  274. data/features/docs/exception_in_after_step_hook.feature +102 -0
  275. data/features/docs/exception_in_around_hook.feature +78 -0
  276. data/features/docs/exception_in_before_hook.feature +96 -0
  277. data/features/docs/extending_cucumber/custom_filter.feature +29 -0
  278. data/features/docs/extending_cucumber/custom_formatter.feature +130 -0
  279. data/features/docs/formatters/api_methods.feature +37 -0
  280. data/features/docs/formatters/debug_formatter.feature +47 -0
  281. data/features/docs/formatters/formatter_step_file_colon_line.feature +44 -0
  282. data/features/docs/formatters/html_formatter.feature +91 -0
  283. data/features/docs/formatters/json_formatter.feature +767 -0
  284. data/features/docs/formatters/junit_formatter.feature +454 -0
  285. data/features/docs/formatters/pretty_formatter.feature +73 -0
  286. data/features/docs/formatters/progress_formatter.feature +31 -0
  287. data/features/docs/formatters/rerun_formatter.feature +188 -0
  288. data/features/docs/formatters/usage_formatter.feature +98 -0
  289. data/features/docs/getting_started.feature +27 -0
  290. data/features/docs/gherkin/background.feature +548 -0
  291. data/features/docs/gherkin/doc_strings.feature +74 -0
  292. data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
  293. data/features/docs/gherkin/language_from_header.feature +32 -0
  294. data/features/docs/gherkin/language_help.feature +42 -0
  295. data/features/docs/gherkin/outlines.feature +156 -0
  296. data/features/docs/gherkin/unicode_table.feature +32 -0
  297. data/features/docs/gherkin/using_descriptions.feature +82 -0
  298. data/features/docs/gherkin/using_star_notation.feature +37 -0
  299. data/features/docs/iso-8859-1.feature +6 -0
  300. data/features/docs/post_configuration_hook.feature +49 -0
  301. data/features/docs/profiles.feature +120 -0
  302. data/features/docs/rake_task.feature +141 -0
  303. data/features/docs/raketask.feature +44 -0
  304. data/features/docs/work_in_progress.feature +154 -0
  305. data/features/docs/writing_support_code/after_hooks.feature +102 -0
  306. data/features/docs/writing_support_code/after_step_hooks.feature +53 -0
  307. data/features/docs/writing_support_code/around_hooks.feature +260 -0
  308. data/features/docs/writing_support_code/before_hook.feature +65 -0
  309. data/features/docs/writing_support_code/hook_order.feature +61 -0
  310. data/features/docs/writing_support_code/load_path.feature +17 -0
  311. data/features/docs/writing_support_code/state.feature +32 -0
  312. data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
  313. data/features/docs/writing_support_code/transforms.feature +98 -0
  314. data/features/lib/step_definitions/aruba_steps.rb +26 -0
  315. data/features/lib/step_definitions/cucumber_steps.rb +78 -0
  316. data/features/lib/step_definitions/iso-8859-1_steps.rb +12 -0
  317. data/features/lib/step_definitions/json_steps.rb +7 -0
  318. data/features/lib/step_definitions/junit_steps.rb +13 -0
  319. data/features/lib/step_definitions/language_steps.rb +8 -0
  320. data/features/lib/step_definitions/profile_steps.rb +15 -0
  321. data/features/lib/step_definitions/retry_steps.rb +35 -0
  322. data/features/lib/step_definitions/ruby_steps.rb +3 -0
  323. data/features/lib/step_definitions/wire_steps.rb +58 -0
  324. data/features/lib/support/env.rb +21 -0
  325. data/features/lib/support/fake_wire_server.rb +80 -0
  326. data/features/lib/support/feature_factory.rb +67 -0
  327. data/features/lib/support/normalise_output.rb +50 -0
  328. data/gem_tasks/contributors.rake +15 -0
  329. data/gem_tasks/cov.rake +5 -0
  330. data/gem_tasks/cucumber.rake +25 -0
  331. data/gem_tasks/downloads.rb +7 -0
  332. data/gem_tasks/environment.rake +7 -0
  333. data/gem_tasks/examples.rake +11 -0
  334. data/gem_tasks/fix_cr_lf.rake +10 -0
  335. data/gem_tasks/flog.rake +4 -0
  336. data/gem_tasks/rspec.rake +6 -0
  337. data/gem_tasks/sass.rake +4 -0
  338. data/gem_tasks/stats +16 -0
  339. data/gem_tasks/versions.txt +74 -0
  340. data/gherkin-languages.json +2972 -0
  341. data/lib/autotest/cucumber.rb +6 -0
  342. data/lib/autotest/cucumber_mixin.rb +135 -0
  343. data/lib/autotest/cucumber_rails.rb +6 -0
  344. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  345. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  346. data/lib/autotest/cucumber_rspec.rb +6 -0
  347. data/lib/autotest/cucumber_rspec2.rb +6 -0
  348. data/lib/autotest/discover.rb +11 -0
  349. data/lib/cucumber.rb +37 -0
  350. data/lib/cucumber/ast.rb +13 -0
  351. data/lib/cucumber/cli/configuration.rb +146 -0
  352. data/lib/cucumber/cli/main.rb +99 -0
  353. data/lib/cucumber/cli/options.rb +465 -0
  354. data/lib/cucumber/cli/profile_loader.rb +91 -0
  355. data/lib/cucumber/cli/rerun_file.rb +29 -0
  356. data/lib/cucumber/configuration.rb +268 -0
  357. data/lib/cucumber/constantize.rb +45 -0
  358. data/lib/cucumber/core_ext/instance_exec.rb +70 -0
  359. data/lib/cucumber/core_ext/string.rb +9 -0
  360. data/lib/cucumber/deprecate.rb +29 -0
  361. data/lib/cucumber/encoding.rb +5 -0
  362. data/lib/cucumber/errors.rb +51 -0
  363. data/lib/cucumber/events.rb +20 -0
  364. data/lib/cucumber/events/after_test_case.rb +25 -0
  365. data/lib/cucumber/events/after_test_step.rb +30 -0
  366. data/lib/cucumber/events/before_test_case.rb +18 -0
  367. data/lib/cucumber/events/before_test_step.rb +23 -0
  368. data/lib/cucumber/events/bus.rb +86 -0
  369. data/lib/cucumber/events/finished_testing.rb +9 -0
  370. data/lib/cucumber/events/step_match.rb +23 -0
  371. data/lib/cucumber/file_specs.rb +37 -0
  372. data/lib/cucumber/filters.rb +9 -0
  373. data/lib/cucumber/filters/activate_steps.rb +67 -0
  374. data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
  375. data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
  376. data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
  377. data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
  378. data/lib/cucumber/filters/gated_receiver.rb +25 -0
  379. data/lib/cucumber/filters/prepare_world.rb +45 -0
  380. data/lib/cucumber/filters/quit.rb +28 -0
  381. data/lib/cucumber/filters/randomizer.rb +45 -0
  382. data/lib/cucumber/filters/retry.rb +32 -0
  383. data/lib/cucumber/filters/tag_limits.rb +45 -0
  384. data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
  385. data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
  386. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  387. data/lib/cucumber/formatter/backtrace_filter.rb +41 -0
  388. data/lib/cucumber/formatter/console.rb +252 -0
  389. data/lib/cucumber/formatter/cucumber.css +286 -0
  390. data/lib/cucumber/formatter/cucumber.sass +247 -0
  391. data/lib/cucumber/formatter/debug.rb +35 -0
  392. data/lib/cucumber/formatter/duration.rb +13 -0
  393. data/lib/cucumber/formatter/duration_extractor.rb +28 -0
  394. data/lib/cucumber/formatter/event_bus_report.rb +38 -0
  395. data/lib/cucumber/formatter/fail_fast.rb +18 -0
  396. data/lib/cucumber/formatter/fanout.rb +27 -0
  397. data/lib/cucumber/formatter/hook_query_visitor.rb +40 -0
  398. data/lib/cucumber/formatter/html.rb +689 -0
  399. data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
  400. data/lib/cucumber/formatter/interceptor.rb +80 -0
  401. data/lib/cucumber/formatter/io.rb +34 -0
  402. data/lib/cucumber/formatter/jquery-min.js +154 -0
  403. data/lib/cucumber/formatter/json.rb +334 -0
  404. data/lib/cucumber/formatter/json_pretty.rb +10 -0
  405. data/lib/cucumber/formatter/junit.rb +238 -0
  406. data/lib/cucumber/formatter/legacy_api/adapter.rb +1016 -0
  407. data/lib/cucumber/formatter/legacy_api/ast.rb +389 -0
  408. data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
  409. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +31 -0
  410. data/lib/cucumber/formatter/pretty.rb +247 -0
  411. data/lib/cucumber/formatter/progress.rb +73 -0
  412. data/lib/cucumber/formatter/rerun.rb +35 -0
  413. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  414. data/lib/cucumber/formatter/steps.rb +49 -0
  415. data/lib/cucumber/formatter/summary.rb +35 -0
  416. data/lib/cucumber/formatter/unicode.rb +53 -0
  417. data/lib/cucumber/formatter/usage.rb +136 -0
  418. data/lib/cucumber/gherkin/data_table_parser.rb +31 -0
  419. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +99 -0
  420. data/lib/cucumber/gherkin/formatter/escaping.rb +17 -0
  421. data/lib/cucumber/gherkin/i18n.rb +15 -0
  422. data/lib/cucumber/gherkin/steps_parser.rb +31 -0
  423. data/lib/cucumber/hooks.rb +99 -0
  424. data/lib/cucumber/load_path.rb +13 -0
  425. data/lib/cucumber/multiline_argument.rb +71 -0
  426. data/lib/cucumber/multiline_argument/data_table.rb +744 -0
  427. data/lib/cucumber/multiline_argument/doc_string.rb +9 -0
  428. data/lib/cucumber/platform.rb +27 -0
  429. data/lib/cucumber/project_initializer.rb +82 -0
  430. data/lib/cucumber/rake/task.rb +168 -0
  431. data/lib/cucumber/rb_support/rb_dsl.rb +119 -0
  432. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  433. data/lib/cucumber/rb_support/rb_language.rb +216 -0
  434. data/lib/cucumber/rb_support/rb_step_definition.rb +131 -0
  435. data/lib/cucumber/rb_support/rb_transform.rb +59 -0
  436. data/lib/cucumber/rb_support/rb_world.rb +149 -0
  437. data/lib/cucumber/rb_support/snippet.rb +170 -0
  438. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  439. data/lib/cucumber/rspec/doubles.rb +19 -0
  440. data/lib/cucumber/running_test_case.rb +134 -0
  441. data/lib/cucumber/runtime.rb +266 -0
  442. data/lib/cucumber/runtime/after_hooks.rb +25 -0
  443. data/lib/cucumber/runtime/before_hooks.rb +27 -0
  444. data/lib/cucumber/runtime/for_programming_languages.rb +66 -0
  445. data/lib/cucumber/runtime/step_hooks.rb +23 -0
  446. data/lib/cucumber/runtime/support_code.rb +151 -0
  447. data/lib/cucumber/runtime/user_interface.rb +85 -0
  448. data/lib/cucumber/step_argument.rb +25 -0
  449. data/lib/cucumber/step_definition_light.rb +20 -0
  450. data/lib/cucumber/step_definitions.rb +13 -0
  451. data/lib/cucumber/step_match.rb +141 -0
  452. data/lib/cucumber/step_match_search.rb +67 -0
  453. data/lib/cucumber/term/ansicolor.rb +110 -0
  454. data/lib/cucumber/unit.rb +11 -0
  455. data/lib/cucumber/version +1 -0
  456. data/lib/mobiusloop/measure.rb +19 -0
  457. data/lib/mobiusloop/mobius_steps.rb +36 -0
  458. data/lib/mobiusloop/objective.rb +10 -0
  459. data/lib/mobiusloop/outcome.rb +99 -0
  460. data/lib/mobiusloop/scale.rb +32 -0
  461. data/lib/simplecov_setup.rb +18 -0
  462. data/major_changes_to_cucumber.md +45 -0
  463. data/mobiusloop.gemspec +47 -0
  464. data/spec/cucumber/cli/configuration_spec.rb +435 -0
  465. data/spec/cucumber/cli/main_spec.rb +83 -0
  466. data/spec/cucumber/cli/options_spec.rb +410 -0
  467. data/spec/cucumber/cli/profile_loader_spec.rb +46 -0
  468. data/spec/cucumber/cli/rerun_spec.rb +85 -0
  469. data/spec/cucumber/configuration_spec.rb +147 -0
  470. data/spec/cucumber/constantize_spec.rb +19 -0
  471. data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
  472. data/spec/cucumber/events/bus_spec.rb +94 -0
  473. data/spec/cucumber/file_specs_spec.rb +60 -0
  474. data/spec/cucumber/filters/activate_steps_spec.rb +149 -0
  475. data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
  476. data/spec/cucumber/filters/retry_spec.rb +79 -0
  477. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
  478. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
  479. data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
  480. data/spec/cucumber/formatter/ansicolor_spec.rb +32 -0
  481. data/spec/cucumber/formatter/debug_spec.rb +64 -0
  482. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  483. data/spec/cucumber/formatter/event_bus_report_spec.rb +88 -0
  484. data/spec/cucumber/formatter/fail_fast_spec.rb +88 -0
  485. data/spec/cucumber/formatter/html_spec.rb +538 -0
  486. data/spec/cucumber/formatter/interceptor_spec.rb +136 -0
  487. data/spec/cucumber/formatter/json_spec.rb +841 -0
  488. data/spec/cucumber/formatter/junit_spec.rb +252 -0
  489. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2182 -0
  490. data/spec/cucumber/formatter/pretty_spec.rb +919 -0
  491. data/spec/cucumber/formatter/progress_spec.rb +169 -0
  492. data/spec/cucumber/formatter/rerun_spec.rb +91 -0
  493. data/spec/cucumber/formatter/spec_helper.rb +82 -0
  494. data/spec/cucumber/hooks_spec.rb +30 -0
  495. data/spec/cucumber/multiline_argument/data_table_spec.rb +603 -0
  496. data/spec/cucumber/project_initializer_spec.rb +87 -0
  497. data/spec/cucumber/rake/forked_spec.rb +53 -0
  498. data/spec/cucumber/rake/task_spec.rb +85 -0
  499. data/spec/cucumber/rb_support/rb_language_spec.rb +243 -0
  500. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +199 -0
  501. data/spec/cucumber/rb_support/rb_transform_spec.rb +46 -0
  502. data/spec/cucumber/rb_support/rb_world_spec.rb +47 -0
  503. data/spec/cucumber/rb_support/snippet_spec.rb +137 -0
  504. data/spec/cucumber/running_test_case_spec.rb +139 -0
  505. data/spec/cucumber/runtime/for_programming_languages_spec.rb +36 -0
  506. data/spec/cucumber/runtime/support_code_spec.rb +16 -0
  507. data/spec/cucumber/runtime_spec.rb +20 -0
  508. data/spec/cucumber/sell_cucumbers.feature +19 -0
  509. data/spec/cucumber/step_argument_spec.rb +18 -0
  510. data/spec/cucumber/step_match_search_spec.rb +122 -0
  511. data/spec/cucumber/step_match_spec.rb +85 -0
  512. data/spec/cucumber/world/pending_spec.rb +47 -0
  513. data/spec/cucumber_spec.rb +39 -0
  514. data/spec/spec_helper.rb +29 -0
  515. data/spec/support/standard_step_actions.rb +18 -0
  516. metadata +1007 -0
@@ -0,0 +1,9 @@
1
+ module Cucumber
2
+ module MultilineArgument
3
+ class DocString < SimpleDelegator
4
+ def append_to(array)
5
+ array << self.to_s
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ # Detect the platform we're running on so we can tweak behaviour
2
+ # in various places.
3
+ require 'rbconfig'
4
+ require 'cucumber/core/platform'
5
+
6
+ module Cucumber
7
+ unless defined?(Cucumber::VERSION)
8
+ VERSION = File.read(File.expand_path("../version", __FILE__))
9
+ BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/mobiusloop')
10
+ LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
11
+ RAILS = defined?(Rails)
12
+ RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
13
+ RUBY_2_2 = RUBY_VERSION =~ /^2\.2/
14
+ RUBY_2_1 = RUBY_VERSION =~ /^2\.1/
15
+ RUBY_2_3 = RUBY_VERSION =~ /^2\.3/
16
+
17
+ class << self
18
+ attr_accessor :use_full_backtrace
19
+
20
+ # @private
21
+ def file_mode(m, encoding="UTF-8")
22
+ "#{m}:#{encoding}"
23
+ end
24
+ end
25
+ self.use_full_backtrace = false
26
+ end
27
+ end
@@ -0,0 +1,82 @@
1
+ module Cucumber
2
+
3
+ # Generates generic file structure for a cucumber project
4
+ class ProjectInitializer
5
+ def run
6
+ # normal cucumber init, replacing /features for /goals
7
+ create_directory('goals')
8
+ create_directory('goals/step_definitions')
9
+ create_directory('goals/support')
10
+ create_file('goals/support/env.rb')
11
+
12
+ # extra mobiusloop initiialization
13
+ copy_step_defs('mobius_steps.rb', 'goals/step_definitions') # install mobius_steps.rb step definition
14
+ copy_gherkin_languages('gherkin-languages.json') # copy modified gherkin-languages.json file to gherkin gem(s)
15
+ copy_example_file('total_articles_scale.rb', 'goals/step_definitions')
16
+ copy_example_file('total_readers_scale.rb', 'goals/step_definitions')
17
+ copy_example_file('increase_readers.goal', 'goals')
18
+ end
19
+
20
+ private
21
+
22
+ def copy_step_defs(spec_file, target)
23
+ gem_dir = `gem environment gemdir`
24
+ steps_file = gem_dir.gsub("\n","") + "/gems/mobiusloop-?.?.?/lib/mobiusloop/" + spec_file
25
+ report_copying(spec_file, target)
26
+ copy_file(steps_file, target)
27
+ end
28
+
29
+ def copy_gherkin_languages(gherkin_file)
30
+ gem_dir = `gem environment gemdir`
31
+ source_gherkin = gem_dir.gsub("\n","") + "/gems/mobiusloop-?.?.?/" + gherkin_file
32
+ target_gherkin = gem_dir.gsub("\n","") + "/gems/gherkin-?.?.?/lib/gherkin/"
33
+ report_copying(gherkin_file, target_gherkin)
34
+ copy_file(source_gherkin, target_gherkin)
35
+ end
36
+
37
+ def copy_example_file(file, target)
38
+ gem_dir = `gem environment gemdir`
39
+ steps_file = gem_dir.gsub("\n","") + "/gems/mobiusloop-?.?.?/examples/mobiusloop/" + file
40
+ report_copying(file, target)
41
+ copy_file(steps_file, target)
42
+ end
43
+
44
+ # TODO: Fix this to work with Windows. FileUtils does not parse ? in file path like Unix
45
+ def copy_file(source, target)
46
+ `cp -rf #{source} #{target}`
47
+ end
48
+
49
+ def create_directory(dir_name)
50
+ create_directory_or_file dir_name, true
51
+ end
52
+
53
+ def create_file(file_name)
54
+ create_directory_or_file file_name, false
55
+ end
56
+
57
+ def create_directory_or_file(file_name, directory)
58
+ file_type = if directory
59
+ :mkdir_p
60
+ else
61
+ :touch
62
+ end
63
+
64
+ report_exists(file_name) || return if File.exists?(file_name)
65
+
66
+ report_creating(file_name)
67
+ FileUtils.send file_type, file_name
68
+ end
69
+
70
+ def report_exists(file)
71
+ puts " exist #{file}"
72
+ end
73
+
74
+ def report_creating(file)
75
+ puts " create #{file}"
76
+ end
77
+
78
+ def report_copying(source, target)
79
+ puts " copy #{source} => #{target}"
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,168 @@
1
+ require 'cucumber/platform'
2
+ require 'cucumber/gherkin/formatter/ansi_escapes'
3
+ begin
4
+ # Support Rake > 0.8.7
5
+ require 'rake/dsl_definition'
6
+ rescue LoadError
7
+ end
8
+
9
+ module Cucumber
10
+ module Rake
11
+ # Defines a Rake task for running features.
12
+ #
13
+ # The simplest use of it goes something like:
14
+ #
15
+ # Cucumber::Rake::Task.new
16
+ #
17
+ # This will define a task named <tt>cucumber</tt> described as 'Run Cucumber features'.
18
+ # It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
19
+ #
20
+ # To further configure the task, you can pass a block:
21
+ #
22
+ # Cucumber::Rake::Task.new do |t|
23
+ # t.cucumber_opts = %w{--format progress}
24
+ # end
25
+ #
26
+ # See the attributes for additional configuration possibilities.
27
+ class Task
28
+ include Cucumber::Gherkin::Formatter::AnsiEscapes
29
+ include ::Rake::DSL if defined?(::Rake::DSL)
30
+
31
+ class InProcessCucumberRunner #:nodoc:
32
+ include ::Rake::DSL if defined?(::Rake::DSL)
33
+
34
+ attr_reader :args
35
+
36
+ def initialize(libs, cucumber_opts, feature_files)
37
+ raise "libs must be an Array when running in-process" unless Array === libs
38
+ libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
39
+ @args = (
40
+ cucumber_opts +
41
+ feature_files
42
+ ).flatten.compact
43
+ end
44
+
45
+ def run
46
+ require 'cucumber/cli/main'
47
+ failure = Cucumber::Cli::Main.execute(args)
48
+ raise "Cucumber failed" if failure
49
+ end
50
+ end
51
+
52
+ class ForkedCucumberRunner #:nodoc:
53
+ include ::Rake::DSL if defined?(::Rake::DSL)
54
+
55
+ def initialize(libs, cucumber_bin, cucumber_opts, bundler, feature_files)
56
+ @libs = libs
57
+ @cucumber_bin = cucumber_bin
58
+ @cucumber_opts = cucumber_opts
59
+ @bundler = bundler
60
+ @feature_files = feature_files
61
+ end
62
+
63
+ def load_path(libs)
64
+ ['"%s"' % @libs.join(File::PATH_SEPARATOR)]
65
+ end
66
+
67
+ def quoted_binary(cucumber_bin)
68
+ ['"%s"' % cucumber_bin]
69
+ end
70
+
71
+ def use_bundler
72
+ @bundler.nil? ? File.exist?("./Gemfile") && bundler_gem_available? : @bundler
73
+ end
74
+
75
+ def bundler_gem_available?
76
+ Gem::Specification.find_by_name('bundler')
77
+ rescue Gem::LoadError
78
+ false
79
+ end
80
+
81
+ def cmd
82
+ if use_bundler
83
+ [ Cucumber::RUBY_BINARY, '-S', 'bundle', 'exec', 'cucumber', @cucumber_opts,
84
+ @feature_files ].flatten
85
+ else
86
+ [ Cucumber::RUBY_BINARY, '-I', load_path(@libs), quoted_binary(@cucumber_bin),
87
+ @cucumber_opts, @feature_files ].flatten
88
+ end
89
+ end
90
+
91
+ def run
92
+ sh cmd.join(" ") do |ok, res|
93
+ if !ok
94
+ exit res.exitstatus
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ # Directories to add to the Ruby $LOAD_PATH
101
+ attr_accessor :libs
102
+
103
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
104
+ attr_accessor :binary
105
+
106
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
107
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
108
+ attr_accessor :cucumber_opts
109
+ def cucumber_opts=(opts) #:nodoc:
110
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
111
+ end
112
+
113
+ # Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
114
+ # some startup speed if you set it to false, but this may also cause issues with
115
+ # your load path and gems.
116
+ attr_accessor :fork
117
+
118
+ # Define what profile to be used. When used with cucumber_opts it is simply appended
119
+ # to it. Will be ignored when CUCUMBER_OPTS is used.
120
+ attr_accessor :profile
121
+
122
+ # Whether or not to run with bundler (bundle exec). Setting this to false may speed
123
+ # up the execution. The default value is true if Bundler is installed and you have
124
+ # a Gemfile, false otherwise.
125
+ #
126
+ # Note that this attribute has no effect if you don't run in forked mode.
127
+ attr_accessor :bundler
128
+
129
+ # Define Cucumber Rake task
130
+ def initialize(task_name = "cucumber", desc = "Run Cucumber features")
131
+ @task_name, @desc = task_name, desc
132
+ @fork = true
133
+ @libs = ['lib']
134
+ @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
135
+ yield self if block_given?
136
+ @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
137
+ define_task
138
+ end
139
+
140
+ def define_task #:nodoc:
141
+ desc @desc
142
+ task @task_name do
143
+ runner.run
144
+ end
145
+ end
146
+
147
+ def runner(task_args = nil) #:nodoc:
148
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
149
+ if(@fork)
150
+ return ForkedCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files)
151
+ end
152
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
153
+ end
154
+
155
+ def cucumber_opts_with_profile #:nodoc:
156
+ Array(cucumber_opts).concat Array(@profile).flat_map {|p| ["--profile", p] }
157
+ end
158
+
159
+ def feature_files #:nodoc:
160
+ make_command_line_safe(FileList[ ENV['FEATURE'] || [] ])
161
+ end
162
+
163
+ def make_command_line_safe(list)
164
+ list.map{|string| string.gsub(' ', '\ ')}
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,119 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ # This module defines the methods you can use to define pure Ruby
4
+ # Step Definitions and Hooks. This module is mixed into the toplevel
5
+ # object.
6
+ module RbDsl
7
+ class << self
8
+ attr_writer :rb_language
9
+
10
+ def alias_adverb(adverb)
11
+ alias_method adverb, :register_rb_step_definition
12
+ end
13
+
14
+ def build_rb_world_factory(world_modules, proc)
15
+ @rb_language.build_rb_world_factory(world_modules, proc)
16
+ end
17
+
18
+ def register_rb_hook(phase, tag_names, proc)
19
+ @rb_language.register_rb_hook(phase, tag_names, proc)
20
+ end
21
+
22
+ def register_rb_transform(regexp, proc)
23
+ @rb_language.register_rb_transform(regexp, proc)
24
+ end
25
+
26
+ def register_rb_step_definition(regexp, proc_or_sym, options = {})
27
+ @rb_language.register_rb_step_definition(regexp, proc_or_sym, options)
28
+ end
29
+ end
30
+
31
+ # Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
32
+ # The +proc+ will be executed once before each scenario to create an
33
+ # Object that the scenario's steps will run within. Any +world_modules+
34
+ # will be mixed into this Object (via Object#extend).
35
+ #
36
+ # This method is typically called from one or more Ruby scripts under
37
+ # <tt>features/support</tt>. You can call this method as many times as you
38
+ # like (to register more modules), but if you try to register more than
39
+ # one Proc you will get an error.
40
+ #
41
+ # Cucumber will not yield anything to the +proc+. Examples:
42
+ #
43
+ # World do
44
+ # MyClass.new
45
+ # end
46
+ #
47
+ # World(MyModule)
48
+ #
49
+ def World(*world_modules, &proc)
50
+ RbDsl.build_rb_world_factory(world_modules, proc)
51
+ end
52
+
53
+ # Registers a proc that will run before each Scenario. You can register as many
54
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
55
+ def Before(*tag_expressions, &proc)
56
+ RbDsl.register_rb_hook('before', tag_expressions, proc)
57
+ end
58
+
59
+ # Registers a proc that will run after each Scenario. You can register as many
60
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
61
+ def After(*tag_expressions, &proc)
62
+ RbDsl.register_rb_hook('after', tag_expressions, proc)
63
+ end
64
+
65
+ # Registers a proc that will be wrapped around each scenario. The proc
66
+ # should accept two arguments: two arguments: the scenario and a "block"
67
+ # argument (but passed as a regular argument, since blocks cannot accept
68
+ # blocks in 1.8), on which it should call the .call method. You can register
69
+ # as many as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
70
+ def Around(*tag_expressions, &proc)
71
+ RbDsl.register_rb_hook('around', tag_expressions, proc)
72
+ end
73
+
74
+ # Registers a proc that will run after each Step. You can register as
75
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
76
+ def AfterStep(*tag_expressions, &proc)
77
+ RbDsl.register_rb_hook('after_step', tag_expressions, proc)
78
+ end
79
+
80
+ # Registers a proc that will be called with a step definition argument if it
81
+ # matches the pattern passed as the first argument to Transform. Alternatively, if
82
+ # the pattern contains captures then they will be yielded as arguments to the
83
+ # provided proc. The return value of the proc is consequently yielded to the
84
+ # step definition.
85
+ def Transform(regexp, &proc)
86
+ RbDsl.register_rb_transform(regexp, proc)
87
+ end
88
+
89
+ # Registers a proc that will run after Cucumber is configured. You can register as
90
+ # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
91
+ # TODO: Deprecate this
92
+ def AfterConfiguration(&proc)
93
+ RbDsl.register_rb_hook('after_configuration', [], proc)
94
+ end
95
+
96
+ # Registers a new Ruby StepDefinition. This method is aliased
97
+ # to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>, and
98
+ # also to the i18n translations whenever a feature of a
99
+ # new language is loaded.
100
+ #
101
+ # If provided, the +symbol+ is sent to the <tt>World</tt> object
102
+ # as defined by #World. A new <tt>World</tt> object is created
103
+ # for each scenario and is shared across step definitions within
104
+ # that scenario. If the +options+ hash contains an <tt>:on</tt>
105
+ # key, the value for this is assumed to be a proc. This proc
106
+ # will be executed in the context of the <tt>World</tt> object
107
+ # and then sent the +symbol+.
108
+ #
109
+ # If no +symbol+ if provided then the +&proc+ gets executed in
110
+ # the context of the <tt>World</tt> object.
111
+ def register_rb_step_definition(regexp, symbol = nil, options = {}, &proc)
112
+ proc_or_sym = symbol || proc
113
+ RbDsl.register_rb_step_definition(regexp, proc_or_sym, options)
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ extend(Cucumber::RbSupport::RbDsl)
@@ -0,0 +1,19 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ # Wrapper for Before, After and AfterStep hooks
4
+ class RbHook
5
+ attr_reader :tag_expressions, :location
6
+
7
+ def initialize(rb_language, tag_expressions, proc)
8
+ @rb_language = rb_language
9
+ @tag_expressions = tag_expressions
10
+ @proc = proc
11
+ @location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
12
+ end
13
+
14
+ def invoke(pseudo_method, arguments, &block)
15
+ @rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].flatten.compact, &@proc)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,216 @@
1
+ require 'cucumber/core_ext/instance_exec'
2
+ require 'cucumber/rb_support/rb_dsl'
3
+ require 'cucumber/rb_support/rb_world'
4
+ require 'cucumber/rb_support/rb_step_definition'
5
+ require 'cucumber/rb_support/rb_hook'
6
+ require 'cucumber/rb_support/rb_transform'
7
+ require 'cucumber/rb_support/snippet'
8
+ require 'cucumber/gherkin/i18n'
9
+ require 'multi_test'
10
+ require 'cucumber/step_match'
11
+ require 'cucumber/step_definition_light'
12
+
13
+ module Cucumber
14
+ module RbSupport
15
+ # Raised if a World block returns Nil.
16
+ class NilWorld < StandardError
17
+ def initialize
18
+ super("World procs should never return nil")
19
+ end
20
+ end
21
+
22
+ # Raised if there are 2 or more World blocks.
23
+ class MultipleWorld < StandardError
24
+ def initialize(first_proc, second_proc)
25
+ message = "You can only pass a proc to #World once, but it's happening\n"
26
+ message << "in 2 places:\n\n"
27
+ message << RbSupport.backtrace_line(first_proc, 'World') << "\n"
28
+ message << RbSupport.backtrace_line(second_proc, 'World') << "\n\n"
29
+ message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
30
+ message << "or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.\n\n"
31
+ super(message)
32
+ end
33
+ end
34
+
35
+ # The Ruby implementation of the programming language API.
36
+ class RbLanguage
37
+ attr_reader :current_world,
38
+ :step_definitions
39
+
40
+ all_keywords = ::Gherkin::DIALECTS.keys.map do |dialect_name|
41
+ dialect = ::Gherkin::Dialect.for(dialect_name)
42
+ dialect.given_keywords + dialect.when_keywords + dialect.then_keywords + dialect.and_keywords + dialect.but_keywords
43
+ end
44
+ Cucumber::Gherkin::I18n.code_keywords_for(all_keywords.flatten.uniq.sort).each do |adverb|
45
+ RbDsl.alias_adverb(adverb.strip)
46
+ end
47
+
48
+ def initialize(runtime, configuration)
49
+ @runtime = runtime
50
+ @step_definitions = []
51
+ RbDsl.rb_language = self
52
+ @world_proc = @world_modules = nil
53
+ configuration.register_snippet_generator(Snippet::Generator.new)
54
+ end
55
+
56
+ def step_matches(name_to_match)
57
+ @step_definitions.reduce([]) { |result, step_definition|
58
+ if (arguments = step_definition.arguments_from(name_to_match))
59
+ result << StepMatch.new(step_definition, name_to_match, arguments)
60
+ end
61
+ result
62
+ }
63
+ end
64
+
65
+ def begin_rb_scenario(scenario)
66
+ create_world
67
+ extend_world
68
+ connect_world(scenario)
69
+ end
70
+
71
+ def register_rb_hook(phase, tag_expressions, proc)
72
+ add_hook(phase, RbHook.new(self, tag_expressions, proc))
73
+ end
74
+
75
+ def register_rb_transform(regexp, proc)
76
+ add_transform(RbTransform.new(self, regexp, proc))
77
+ end
78
+
79
+ def register_rb_step_definition(regexp, proc_or_sym, options)
80
+ step_definition = RbStepDefinition.new(self, regexp, proc_or_sym, options)
81
+ @step_definitions << step_definition
82
+ step_definition
83
+ end
84
+
85
+ def build_rb_world_factory(world_modules, proc)
86
+ if(proc)
87
+ raise MultipleWorld.new(@world_proc, proc) if @world_proc
88
+ @world_proc = proc
89
+ end
90
+ @world_modules ||= []
91
+ @world_modules += world_modules
92
+ end
93
+
94
+ def load_code_file(code_file)
95
+ return unless File.extname(code_file) == ".rb"
96
+ load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
97
+ end
98
+
99
+ def begin_scenario(scenario)
100
+ begin_rb_scenario(scenario)
101
+ end
102
+
103
+ def end_scenario
104
+ @current_world = nil
105
+ end
106
+
107
+ def after_configuration(configuration)
108
+ hooks[:after_configuration].each do |hook|
109
+ hook.invoke('AfterConfiguration', configuration)
110
+ end
111
+ end
112
+
113
+ def execute_transforms(args)
114
+ args.map do |arg|
115
+ matching_transform = transforms.detect {|transform| transform.match(arg) }
116
+ matching_transform ? matching_transform.invoke(arg) : arg
117
+ end
118
+ end
119
+
120
+ def add_hook(phase, hook)
121
+ hooks[phase.to_sym] << hook
122
+ hook
123
+ end
124
+
125
+ def clear_hooks
126
+ @hooks = nil
127
+ end
128
+
129
+ def add_transform(transform)
130
+ transforms.unshift transform
131
+ transform
132
+ end
133
+
134
+ def hooks_for(phase, scenario) #:nodoc:
135
+ hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
136
+ end
137
+
138
+ def unmatched_step_definitions
139
+ available_step_definition_hash.keys - invoked_step_definition_hash.keys
140
+ end
141
+
142
+ def available_step_definition(regexp_source, file_colon_line)
143
+ available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
144
+ end
145
+
146
+ def invoked_step_definition(regexp_source, file_colon_line)
147
+ invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
148
+ end
149
+
150
+ private
151
+
152
+ def available_step_definition_hash
153
+ @available_step_definition_hash ||= {}
154
+ end
155
+
156
+ def invoked_step_definition_hash
157
+ @invoked_step_definition_hash ||= {}
158
+ end
159
+
160
+ def hooks
161
+ @hooks ||= Hash.new{|h,k| h[k] = []}
162
+ end
163
+
164
+ def transforms
165
+ @transforms ||= []
166
+ end
167
+
168
+ def create_world
169
+ if(@world_proc)
170
+ @current_world = @world_proc.call
171
+ check_nil(@current_world, @world_proc)
172
+ else
173
+ @current_world = Object.new
174
+ end
175
+ end
176
+
177
+ def extend_world
178
+ @current_world.extend(RbWorld)
179
+ MultiTest.extend_with_best_assertion_library(@current_world)
180
+ (@world_modules || []).each do |mod|
181
+ @current_world.extend(mod)
182
+ end
183
+ end
184
+
185
+ def connect_world(scenario)
186
+ @current_world.__cucumber_runtime = @runtime
187
+ @current_world.__natural_language = scenario.language
188
+ end
189
+
190
+ def check_nil(o, proc)
191
+ if o.nil?
192
+ begin
193
+ raise NilWorld.new
194
+ rescue NilWorld => e
195
+ e.backtrace.clear
196
+ e.backtrace.push(RbSupport.backtrace_line(proc, "World"))
197
+ raise e
198
+ end
199
+ else
200
+ o
201
+ end
202
+ end
203
+
204
+ def self.cli_snippet_type_options
205
+ Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
206
+ Snippet::SNIPPET_TYPES[type].cli_option_string(type)
207
+ end
208
+ end
209
+ end
210
+
211
+ def self.backtrace_line(proc, name)
212
+ location = Cucumber::Core::Ast::Location.from_source_location(*proc.source_location)
213
+ "#{location.to_s}:in `#{name}'"
214
+ end
215
+ end
216
+ end