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,27 @@
1
+ require 'cucumber/hooks'
2
+
3
+ module Cucumber
4
+ class Runtime
5
+ class BeforeHooks
6
+ def initialize(hooks, scenario)
7
+ @hooks = hooks
8
+ @scenario = scenario
9
+ end
10
+
11
+ def apply_to(test_case)
12
+ test_case.with_steps(
13
+ before_hooks(test_case.source) + test_case.test_steps
14
+ )
15
+ end
16
+
17
+ private
18
+
19
+ def before_hooks(source)
20
+ @hooks.map do |hook|
21
+ action_block = ->(result) { hook.invoke('Before', @scenario.with_result(result)) }
22
+ Hooks.before_hook(source, hook.location, &action_block)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,66 @@
1
+ require 'forwardable'
2
+ require 'cucumber/core/ast/doc_string'
3
+ require 'cucumber/core/ast/data_table'
4
+
5
+ module Cucumber
6
+ class Runtime
7
+ # This is what a programming language will consider to be a runtime.
8
+ #
9
+ # It's a thin class that directs the handul of methods needed by the
10
+ # programming languages to the right place.
11
+ class ForProgrammingLanguages
12
+ extend Forwardable
13
+
14
+ attr_reader :support_code
15
+
16
+ def initialize(support_code, user_interface)
17
+ @support_code, @user_interface = support_code, user_interface
18
+ end
19
+
20
+ def_delegators :@user_interface,
21
+ :embed,
22
+ :ask,
23
+ :puts,
24
+ :features_paths,
25
+ :step_match
26
+
27
+ def_delegators :@support_code,
28
+ :invoke_dynamic_steps,
29
+ :invoke_dynamic_step,
30
+ :load_programming_language
31
+
32
+ # Returns a Cucumber::MultilineArgument::DataTable for +text_or_table+, which can either
33
+ # be a String:
34
+ #
35
+ # table(%{
36
+ # | account | description | amount |
37
+ # | INT-100 | Taxi | 114 |
38
+ # | CUC-101 | Peeler | 22 |
39
+ # })
40
+ #
41
+ # or a 2D Array:
42
+ #
43
+ # table([
44
+ # %w{ account description amount },
45
+ # %w{ INT-100 Taxi 114 },
46
+ # %w{ CUC-101 Peeler 22 }
47
+ # ])
48
+ #
49
+ def table(text_or_table, file=nil, line=0)
50
+ if !file
51
+ location = Core::Ast::Location.of_caller
52
+ else
53
+ location = Core::Ast::Location.new(file, line)
54
+ end
55
+ MultilineArgument::DataTable.from(text_or_table, location)
56
+ end
57
+
58
+ # Returns a Cucumber::MultilineArgument::DocString for +body+.
59
+ #
60
+ def doc_string(body, content_type='', line_offset=0)
61
+ location = Core::Ast::Location.of_caller
62
+ MultilineArgument.doc_string(body, content_type, location)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,23 @@
1
+ module Cucumber
2
+ class Runtime
3
+ class StepHooks
4
+ def initialize(hooks)
5
+ @hooks = hooks
6
+ end
7
+
8
+ def apply(test_steps)
9
+ test_steps.flat_map do |test_step|
10
+ [test_step] + after_step_hooks(test_step)
11
+ end
12
+ end
13
+
14
+ private
15
+ def after_step_hooks(test_step)
16
+ @hooks.map do |hook|
17
+ action = ->(*args) { hook.invoke('AfterStep', [args, test_step]) }
18
+ Hooks.after_step_hook(test_step.source, hook.location, &action)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,151 @@
1
+ require 'cucumber/constantize'
2
+ require 'cucumber/runtime/for_programming_languages'
3
+ require 'cucumber/runtime/step_hooks'
4
+ require 'cucumber/runtime/before_hooks'
5
+ require 'cucumber/runtime/after_hooks'
6
+ require 'cucumber/events/step_match'
7
+ require 'cucumber/gherkin/steps_parser'
8
+ require 'cucumber/step_match_search'
9
+
10
+ module Cucumber
11
+
12
+ class Runtime
13
+
14
+ class SupportCode
15
+
16
+ require 'forwardable'
17
+ class StepInvoker
18
+
19
+ def initialize(support_code)
20
+ @support_code = support_code
21
+ end
22
+
23
+ def steps(steps)
24
+ steps.each { |step| step(step) }
25
+ end
26
+
27
+ def step(step)
28
+ location = Core::Ast::Location.of_caller
29
+ @support_code.invoke_dynamic_step(step[:text], multiline_arg(step, location))
30
+ end
31
+
32
+ def multiline_arg(step, location)
33
+ if argument = step[:argument]
34
+ if argument[:type] == :DocString
35
+ MultilineArgument.doc_string(argument[:content], argument[:content_type], location)
36
+ else
37
+ MultilineArgument::DataTable.from(argument[:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
38
+ end
39
+ else
40
+ MultilineArgument.from(nil)
41
+ end
42
+ end
43
+ end
44
+
45
+ include Constantize
46
+
47
+ attr_reader :ruby
48
+ def initialize(user_interface, configuration=Configuration.default)
49
+ @configuration = configuration
50
+ @runtime_facade = Runtime::ForProgrammingLanguages.new(self, user_interface)
51
+ @ruby = Cucumber::RbSupport::RbLanguage.new(@runtime_facade, @configuration)
52
+ end
53
+
54
+ def configure(new_configuration)
55
+ @configuration = Configuration.new(new_configuration)
56
+ end
57
+
58
+ # Invokes a series of steps +steps_text+. Example:
59
+ #
60
+ # invoke(%Q{
61
+ # Given I have 8 cukes in my belly
62
+ # Then I should not be thirsty
63
+ # })
64
+ def invoke_dynamic_steps(steps_text, i18n, location)
65
+ parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), i18n.iso_code)
66
+ parser.parse(steps_text)
67
+ end
68
+
69
+ # @api private
70
+ # This allows users to attempt to find, match and execute steps
71
+ # from code as the features are running, as opposed to regular
72
+ # steps which are compiled into test steps before execution.
73
+ #
74
+ # These are commonly called nested steps.
75
+ def invoke_dynamic_step(step_name, multiline_argument, location=nil)
76
+ matches = step_matches(step_name)
77
+ raise UndefinedDynamicStep, step_name if matches.empty?
78
+ matches.first.invoke(multiline_argument)
79
+ end
80
+
81
+ def load_files!(files)
82
+ log.debug("Code:\n")
83
+ files.each do |file|
84
+ load_file(file)
85
+ end
86
+ log.debug("\n")
87
+ end
88
+
89
+ def load_files_from_paths(paths)
90
+ files = paths.map { |path| Dir["#{path}/**/*.rb"] }.flatten
91
+ load_files! files
92
+ end
93
+
94
+ def unmatched_step_definitions
95
+ @ruby.unmatched_step_definitions
96
+ end
97
+
98
+ def fire_hook(name, *args)
99
+ @ruby.send(name, *args)
100
+ end
101
+
102
+ def step_definitions
103
+ @ruby.step_definitions
104
+ end
105
+
106
+ def find_after_step_hooks(test_case)
107
+ scenario = RunningTestCase.new(test_case)
108
+ hooks = @ruby.hooks_for(:after_step, scenario)
109
+ StepHooks.new hooks
110
+ end
111
+
112
+ def apply_before_hooks(test_case)
113
+ scenario = RunningTestCase.new(test_case)
114
+ hooks = @ruby.hooks_for(:before, scenario)
115
+ BeforeHooks.new(hooks, scenario).apply_to(test_case)
116
+ end
117
+
118
+ def apply_after_hooks(test_case)
119
+ scenario = RunningTestCase.new(test_case)
120
+ hooks = @ruby.hooks_for(:after, scenario)
121
+ AfterHooks.new(hooks, scenario).apply_to(test_case)
122
+ end
123
+
124
+ def find_around_hooks(test_case)
125
+ scenario = RunningTestCase.new(test_case)
126
+
127
+ @ruby.hooks_for(:around, scenario).map do |hook|
128
+ Hooks.around_hook(test_case.source) do |run_scenario|
129
+ hook.invoke('Around', scenario, &run_scenario)
130
+ end
131
+ end
132
+ end
133
+
134
+ private
135
+
136
+ def step_matches(step_name)
137
+ StepMatchSearch.new(@ruby.method(:step_matches), @configuration).call(step_name)
138
+ end
139
+
140
+ def load_file(file)
141
+ log.debug(" * #{file}\n")
142
+ @ruby.load_code_file(file)
143
+ end
144
+
145
+ def log
146
+ Cucumber.logger
147
+ end
148
+
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,85 @@
1
+ require 'timeout'
2
+
3
+ module Cucumber
4
+ class Runtime
5
+
6
+ module UserInterface
7
+ attr_writer :visitor
8
+
9
+ def visitor=(visitor)
10
+ @visitor = visitor
11
+ end
12
+
13
+ # Output +messages+ alongside the formatted output.
14
+ # This is an alternative to using Kernel#puts - it will display
15
+ # nicer, and in all outputs (in case you use several formatters)
16
+ #
17
+ def puts(*messages)
18
+ @visitor.puts(*messages)
19
+ end
20
+
21
+ # Suspends execution and prompts +question+ to the console (STDOUT).
22
+ # An operator (manual tester) can then enter a line of text and hit
23
+ # <ENTER>. The entered text is returned, and both +question+ and
24
+ # the result is added to the output using #puts.
25
+ #
26
+ # If you want a beep to happen (to grab the manual tester's attention),
27
+ # just prepend ASCII character 7 to the question:
28
+ #
29
+ # ask("#{7.chr}How many cukes are in the external system?")
30
+ #
31
+ # If that doesn't issue a beep, you can shell out to something else
32
+ # that makes a sound before invoking #ask.
33
+ #
34
+ def ask(question, timeout_seconds)
35
+ STDOUT.puts(question)
36
+ STDOUT.flush
37
+ puts(question)
38
+
39
+ if(Cucumber::JRUBY)
40
+ answer = jruby_gets(timeout_seconds)
41
+ else
42
+ answer = mri_gets(timeout_seconds)
43
+ end
44
+
45
+ if(answer)
46
+ puts(answer)
47
+ answer
48
+ else
49
+ raise("Waited for input for #{timeout_seconds} seconds, then timed out.")
50
+ end
51
+ end
52
+
53
+ # Embed +src+ of MIME type +mime_type+ into the output. The +src+ argument may
54
+ # be a path to a file, or if it's an image it may also be a Base64 encoded image.
55
+ # The embedded data may or may not be ignored, depending on what kind of formatter(s) are active.
56
+ #
57
+ def embed(src, mime_type, label)
58
+ @visitor.embed(src, mime_type, label)
59
+ end
60
+
61
+ private
62
+
63
+ def mri_gets(timeout_seconds)
64
+ begin
65
+ Timeout.timeout(timeout_seconds) do
66
+ STDIN.gets
67
+ end
68
+ rescue Timeout::Error
69
+ nil
70
+ end
71
+ end
72
+
73
+ def jruby_gets(timeout_seconds)
74
+ answer = nil
75
+ t = java.lang.Thread.new do
76
+ answer = STDIN.gets
77
+ end
78
+ t.start
79
+ t.join(timeout_seconds * 1000)
80
+ answer
81
+ end
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,25 @@
1
+ module Cucumber
2
+ # Defines the location and value of a captured argument from the step
3
+ # text
4
+ class StepArgument
5
+ def self.arguments_from(regexp, step_name)
6
+ match = regexp.match(step_name)
7
+ if match
8
+ n = 0
9
+ match.captures.map do |val|
10
+ n += 1
11
+ offset = match.offset(n)[0]
12
+ new(offset, val)
13
+ end
14
+ else
15
+ nil
16
+ end
17
+ end
18
+
19
+ attr_reader :offset, :val
20
+
21
+ def initialize(offset, val)
22
+ @offset, @val = offset, val
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module Cucumber
2
+ # Only used for keeping track of available and invoked step definitions
3
+ # in a way that also works for other programming languages (i.e. cuke4duke)
4
+ # Used for reporting purposes only (usage formatter).
5
+ class StepDefinitionLight
6
+ attr_reader :regexp_source, :location
7
+
8
+ def initialize(regexp_source, location)
9
+ @regexp_source, @location = regexp_source, location
10
+ end
11
+
12
+ def eql?(o)
13
+ regexp_source == o.regexp_source && location == o.location
14
+ end
15
+
16
+ def hash
17
+ regexp_source.hash + 31*location.to_s.hash
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module Cucumber
2
+ class StepDefinitions
3
+ def initialize(configuration = Configuration.default)
4
+ configuration = Configuration.new(configuration)
5
+ @support_code = Runtime::SupportCode.new(nil, configuration)
6
+ @support_code.load_files_from_paths(configuration.autoload_code_paths)
7
+ end
8
+
9
+ def to_json
10
+ @support_code.step_definitions.map{|stepdef| stepdef.to_hash}.to_json
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,141 @@
1
+ require 'cucumber/multiline_argument'
2
+
3
+ module Cucumber
4
+
5
+ # Represents the match found between a Test Step and its activation
6
+ class StepMatch #:nodoc:
7
+ attr_reader :step_definition, :step_arguments
8
+
9
+ def initialize(step_definition, step_name, step_arguments)
10
+ raise "step_arguments can't be nil (but it can be an empty array)" if step_arguments.nil?
11
+ @step_definition, @name_to_match, @step_arguments = step_definition, step_name, step_arguments
12
+ end
13
+
14
+ def args
15
+ @step_arguments.map{|g| g.val }
16
+ end
17
+
18
+ def activate(test_step)
19
+ test_step.with_action(@step_definition.location) do
20
+ invoke(MultilineArgument.from_core(test_step.source.last.multiline_arg))
21
+ end
22
+ end
23
+
24
+ def invoke(multiline_arg)
25
+ all_args = deep_clone_args
26
+ multiline_arg.append_to(all_args)
27
+ @step_definition.invoke(all_args)
28
+ end
29
+
30
+ # Formats the matched arguments of the associated Step. This method
31
+ # is usually called from visitors, which render output.
32
+ #
33
+ # The +format+ can either be a String or a Proc.
34
+ #
35
+ # If it is a String it should be a format string according to
36
+ # <tt>Kernel#sprinf</tt>, for example:
37
+ #
38
+ # '<span class="param">%s</span></tt>'
39
+ #
40
+ # If it is a Proc, it should take one argument and return the formatted
41
+ # argument, for example:
42
+ #
43
+ # lambda { |param| "[#{param}]" }
44
+ #
45
+ def format_args(format = lambda{|a| a}, &proc)
46
+ replace_arguments(@name_to_match, @step_arguments, format, &proc)
47
+ end
48
+
49
+ def location
50
+ @step_definition.location
51
+ end
52
+
53
+ def file_colon_line
54
+ location.to_s
55
+ end
56
+
57
+ def backtrace_line
58
+ "#{file_colon_line}:in `#{@step_definition.regexp_source}'"
59
+ end
60
+
61
+ def text_length
62
+ @step_definition.regexp_source.unpack('U*').length
63
+ end
64
+
65
+ def replace_arguments(string, step_arguments, format, &proc)
66
+ s = string.dup
67
+ offset = past_offset = 0
68
+ step_arguments.each do |step_argument|
69
+ next if step_argument.offset.nil? || step_argument.offset < past_offset
70
+
71
+ replacement = if block_given?
72
+ proc.call(step_argument.val)
73
+ elsif Proc === format
74
+ format.call(step_argument.val)
75
+ else
76
+ format % step_argument.val
77
+ end
78
+
79
+ s[step_argument.offset + offset, step_argument.val.length] = replacement
80
+ offset += replacement.unpack('U*').length - step_argument.val.unpack('U*').length
81
+ past_offset = step_argument.offset + step_argument.val.length
82
+ end
83
+ s
84
+ end
85
+
86
+ def inspect #:nodoc:
87
+ "#<#{self.class}: #{location}>"
88
+ end
89
+
90
+ private
91
+ def deep_clone_args
92
+ Marshal.load( Marshal.dump( args ) )
93
+ end
94
+ end
95
+
96
+ class SkippingStepMatch
97
+ def activate(test_step)
98
+ return test_step.with_action { raise Core::Test::Result::Skipped.new }
99
+ end
100
+ end
101
+
102
+ class NoStepMatch #:nodoc:
103
+ attr_reader :step_definition, :name
104
+
105
+ def initialize(step, name)
106
+ @step = step
107
+ @name = name
108
+ end
109
+
110
+ def format_args(*args)
111
+ @name
112
+ end
113
+
114
+ def location
115
+ raise "No location for #{@step}" unless @step.location
116
+ @step.location
117
+ end
118
+
119
+ def file_colon_line
120
+ raise "No file:line for #{@step}" unless @step.file_colon_line
121
+ @step.file_colon_line
122
+ end
123
+
124
+ def backtrace_line
125
+ @step.backtrace_line
126
+ end
127
+
128
+ def text_length
129
+ @step.text_length
130
+ end
131
+
132
+ def step_arguments
133
+ []
134
+ end
135
+
136
+ def activate(test_step)
137
+ # noop
138
+ return test_step
139
+ end
140
+ end
141
+ end