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
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2008-2013 Aslak Hellesøy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,373 @@
1
+ # building the right things with mobiusloop
2
+
3
+ `mobiusloop` provides continuous feedback to people on whether they are **building the right things**, not just **building things right**.
4
+
5
+ Most product development tools focus on **building things right** meaning on time, on budget and with high quality.
6
+ `mobiusloop` is different. It uses a simple language to define the desired business and product goals, such as Increase
7
+ Customer Conversion or Improve App Responsiveness. Then `mobiusloop` uses automation to measure and report on progress
8
+ towards these goals daily, weekly or whenever you want.
9
+
10
+ With `mobiusloop` teams get realtime feedback on whether their new features are delivering the expected value. Leaders get
11
+ clear visibility on whether their investments are delivering the desired return. Everyone gets feedback on whether they are
12
+ **building the right things**.
13
+
14
+ Use `mobiusloop` with methods like [Objectives and Key Results (OKR's)](https://www.amazon.com/Radical-Focus-Achieving-Important-Objectives-ebook/dp/B01BFKJA0Y)
15
+ and [Mobius](http://mobiusloop.com) to define and measure the value of your product or service.
16
+
17
+
18
+ ## how it works
19
+
20
+ Today many teams write automated feature tests using open source tools like [Cucumber](http://cucumber.io). They write these
21
+ tests in a simple, readable format using the [Gherkin](https://cucumber.io/docs/reference) language. Whenever these tests are run, teams get realtime feedback
22
+ on the quality of their product.
23
+
24
+ `mobiusloop` takes this concept and applies it to strategic business and product goals. Instead of tests that report on
25
+ product quality when run, `mobiusloop` reports on progress towards desired goals.
26
+
27
+ Under the covers `mobiusloop` is built on [Cucumber](http://cucumber.io) and consists of three main parts:
28
+ 1. `.goal` files
29
+ 1. step definitions
30
+ 1. custom `Scale`'s
31
+
32
+
33
+ #### 1. `.goal` files
34
+ To start, leaders and teams agree on their objectives and the measurable outcomes that define success.
35
+ Frameworks like [Objectives and Key Results (OKR's)](https://www.amazon.com/Radical-Focus-Achieving-Important-Objectives-ebook/dp/B01BFKJA0Y)
36
+ and [Mobius](http://mobiusloop.com) encourage qualitative statements (problems or objectives) together with quantitative
37
+ measures of success (outcomes or key results).
38
+
39
+ Using `mobiusloop`, leaders and teams collaboratively write these in a `.goal` text file. Here's an example:
40
+
41
+ ```ruby
42
+ Objective: Reach a million paying customers by Q3 2016!
43
+
44
+ Key Result: Increase Journal Readership
45
+ Given a baseline of 500,000 readers on Oct 1, 2015
46
+ And a target of 1,000,000 readers by Oct 1, 2016
47
+ When we measure progress with "Total Readers Scale"
48
+ Then report progress towards target
49
+ ```
50
+ Here's another one:
51
+
52
+ ```ruby
53
+ Problem: Slow app response times are causing us to lose customers
54
+
55
+ Outcome: Improve App Responsiveness
56
+ Given a baseline of 4.5 seconds average response time on May 1, 2016
57
+ And a target of 1.5 seconds average response time by Jun 30, 2016
58
+ When we measure progress with "Peak User Performance Scale"
59
+ Then report progress towards target
60
+ ```
61
+ The syntax is based [Gherkin](https://cucumber.io/docs/reference), the language used to write Cucumber acceptance tests.
62
+ `mobiusloop` introduces a four new keywords to Gherkin: **Objective**, **Problem**, **Outcome** and **Key Result**.
63
+
64
+ Each `.goal` file contains **one** Objective or Problem and **one or more** Outcomes or Key Results.
65
+
66
+ When the `.goal` files are run from a command line, they report progress towards your targets like this:
67
+
68
+ ```ruby
69
+ Objective: Top a million paying customers by Q3 2016!
70
+
71
+ Key Result: Increase Journal Readership to 1,000,000
72
+ Given a baseline of 500000 readers on "Oct 1, 2015"
73
+ And a target of 1000000 readers by "Oct 1, 2016"
74
+ When we measure progress with "Total Readers Scale"
75
+ Success! found 820,000 readers in 1.2 seconds!
76
+ Then report progress towards targets
77
+ Hooray! You are on track!
78
+ 64% progress to target using 61% of the time (222 days)
79
+ 36% remaining to target in 143 days
80
+ ````
81
+
82
+ Progress is reported as text or optionally saved in a [web page](results.html) for sharing.
83
+
84
+ With `mobiusloop` teams can measure progress towards their goals daily, weekly, monthly or whatever cadence makes sense.
85
+ Integrating `mobiusloop` into your continuous delivery pipeline helps measure the impacts of each new release on your outcomes or key results.
86
+
87
+
88
+ #### 2. step definitions
89
+ Under the covers, `mobiusloop` is built on a forked copy of [cucumber-ruby](https://github.com/cucumber/cucumber-ruby).
90
+ It uses Gherkin to parse the `.goal` file and call Cucumber [step definitions](https://github.com/cucumber/cucumber/wiki/Step-Definitions).
91
+ `mobiusloop` ships with one step definition [mobius_steps.rb](lib/mobiusloop/mobius_steps.rb) that can be modified or extended.
92
+
93
+ In `mobius_steps.rb`, the lines beginning with `Given` save the baseline and target values.
94
+ The line beginning with `When` creates an `Outcome` with a custom `Scale`, sets the baselines and targets, then calls
95
+ the `measure` method to perform the measurement. The line beginning with `Then` reports the progress towards targets.
96
+
97
+ This `Given, When, Then` syntax is identical to Gherkin, easing the learning curve for teams already using Cucumber.
98
+ Teams can either use `mobius_steps.rb` or create their own step definitions.
99
+
100
+
101
+ #### 3. custom `Scale`'s
102
+
103
+ At creation time, each outcome (or key result) is associated with a custom `Scale` of measure.
104
+ `Scale`'s are the code that collects your data in your environment to report progress.
105
+ `mobiusloop` ships with a few example scales, however teams are encouraged to create custom scales to meet their needs.
106
+
107
+ To create a Scale, create a new Ruby class that extends `Scale` and then implement the `measure` method. Next, update the `.goal`
108
+ file to reference your new `Scale` class. When `mobiusloop` parses this line:
109
+
110
+ ```we measure progress with "Total Readers Scale"```
111
+
112
+ it creates a new instance of the Ruby class `TotalReadersScale` and calls the `measure` method, which returns a new `Measure`.
113
+
114
+ In this example, you would implement the method `collect_total_readers` with your custom logic.
115
+
116
+ ```Ruby
117
+ require 'mobiusloop/scale'
118
+ require 'mobiusloop/measure'
119
+
120
+ class TotalReadersScale < Scale
121
+
122
+ def measure
123
+ total = collect_total_readers
124
+ Measure.new(total)
125
+ end
126
+ end
127
+ ````
128
+
129
+
130
+ ## getting started
131
+
132
+ Adding `mobiusloop` to your product is easy, but requires some command-line chops.
133
+ If this section looks like Greek, then as nicely as possible ask a developer on your team to help.
134
+
135
+ **Note:** Currently only Linux and OSX are supported platforms. Windows will be added in the future.
136
+
137
+ **TODO:** Simplify the installation steps to `gem install mobiusloop`. For now download the source and build a .gem locally.
138
+
139
+ Download the [source code](https://github.com/ryanshriver/mobiusloop-ruby) into a working directory (e.g. /workspace/mobiusloop-ruby)
140
+
141
+ If [Ruby](https://www.ruby-lang.org/en/), [gem](https://rubygems.org) and [bundle](http://bundler.io) are not installed, install them first.
142
+ Then from the working directory, run these commands:
143
+
144
+ $ gem build mobiusloop.gemspec
145
+ $ gem install mobiusloop-0.1.1.gem
146
+
147
+ Replace `mobiusloop-0.1.1.gem` with whatever version was built.
148
+
149
+ Finally, create a symbolic link for the `mobiusloop` command. First locate your ruby executable path:
150
+
151
+ $ gem env
152
+
153
+ Look for the value of `EXECUTABLE DIRECTORY`, something like `/usr/local/Cellar/ruby/2.2.3/bin/`.
154
+ Then create a symbolic link:
155
+
156
+ $ ln -s </path/to/executable/directory/mobiusloop /usr/local/bin/mobiusloop
157
+
158
+ **TODO:** Find a way to create symbolic link as part of gem install
159
+
160
+
161
+
162
+ ## Adding `mobiusloop` to your app
163
+
164
+ To create and run your own goals, let's start with a working example and modify it.
165
+
166
+ Change to the root directory of your app and run `mobiusloop`:
167
+
168
+ $ cd product_home
169
+ $ mobiusloop
170
+
171
+ You will see that `mobiousloop` is not initialized. So let's do that:
172
+
173
+ $ mobiusloop --init
174
+
175
+ You will see that `mobiusloop` created a `goals/` directory and put some files in there. Let's run our example:
176
+
177
+ $ mobiusloop
178
+
179
+ If all goes well, you will see something like this:
180
+
181
+ ```Ruby
182
+ Objective: Get a million paying customers by Q3 2016
183
+
184
+ Outcome: Increase Journal Readership to 1,000,000
185
+ Given a baseline of 500000 "readers" on "Oct 1, 2015"
186
+ And a target of 1000000 "readers" by "Oct 1, 2016"
187
+ When we measure progress with "Total Readers Scale"
188
+ Success! found 820,000 readers in 0.0 seconds!
189
+ Then report progress towards targets
190
+ Hooray! You are on track!
191
+ 64% progress to target using 63% of the time (231 days)
192
+ 36% remaining to target in 134 days
193
+
194
+ Outcome: Increase Published Articles by 25%
195
+ Given a baseline of 40000 "articles" on "Jan 1, 2016"
196
+ And a target of 50000 "articles" by "Oct 1, 2016"
197
+ When we measure progress with "Total Articles Scale"
198
+ Success! found 420,00 articles in 0.0 seconds!
199
+ Then report progress towards targets
200
+ Sorry, you are not on track
201
+ 20% progress to target using 51% of the time (139 days)
202
+ 80% remaining to target in 134 days
203
+
204
+ 2 scenarios (2 passed)
205
+ 8 steps (8 passed)
206
+ 0m0.025s
207
+ ```
208
+ Congrats `mobiusloop` is running for your product! Now let's customize it for your needs.
209
+
210
+
211
+ ## Create your first `.goal`
212
+
213
+ First, open `goals/increase_readers.goal` in a text editor, change the baseline or target value, save and run the example again.
214
+ Did you notice changes in the progress and status? Change the baseline and target dates and try again. Get the hang of it?
215
+
216
+ Let's pretend you have a product outcome to improve response time from 4.5 seconds to 1.5 seconds for your app.
217
+ We know your product would never be this slow, but let's just pretend. Start by copying our working example:
218
+
219
+ $ cp goals/increase_readers.goal goals/improve_response_time.goal
220
+
221
+
222
+ #### Create Objectives and Outcomes
223
+
224
+ Open the new `improve_response_time.goal` in your text editor and make some changes:
225
+
226
+ - Update `Objective:` to reflect our new goal. Something like <i>improve our digital customer experience</i>.
227
+ - Let's only start with one `Outcome`, so delete from `Outcome: Increase Published Articles` to the end of the file
228
+ - Now update your `Outcome:` keeping it short and sweet. Something like <i>Improve Response Time</i>
229
+
230
+ Now save the file and run again:
231
+
232
+ $ mobiusloop
233
+
234
+ Cool, now we have multiple running goals! As you add more `.goal` files to `goals/` folder, `mobiusloop` runs them.
235
+
236
+ If you only wanted to run one `.goal`, you could do that easily:
237
+
238
+ $ mobiusloop goals/increase_readers.goal
239
+
240
+ We don't need the example anymore, so let's remove it:
241
+
242
+ $ rm goals/increase_readers.goal
243
+
244
+ #### Define baselines and targets
245
+
246
+ Open `improve_response_time.goal` again and let's update the baselines and targets.
247
+ Let's pretend as of last October your app's home page takes 4.5 seconds to load. That's your baseline. Make a change:
248
+
249
+ - In the row starting with `Given`, change 50000 to 4.5
250
+
251
+ Your product owner has said <i>sub-second</i> is how fast it should load. That's your target. Make another change:
252
+
253
+ - In the row starting with `And`, change 1000000 to 1
254
+
255
+ Finally, your unit of measure is not "readers", so let's fix that:
256
+
257
+ - Change "readers" to "seconds" for both target and baseline rows
258
+
259
+ Now save the file and run again:
260
+
261
+ $ mobiusloop
262
+
263
+ This works, but the scale says we have 820,000 seconds! That's not right, so let's fix it.
264
+
265
+
266
+ #### Define scales
267
+
268
+ Open `improve_response_time.goal` again and let's change the scale to record response times, not total readers.
269
+
270
+ - In the row starting with `When`, change "Total Readers Scale" to "Page Response Scale"
271
+
272
+ Now save the file and run again.
273
+
274
+ $ mobiusloop
275
+
276
+ Wow, much better! The "Page Response Scale" requested google.com and compared the response time to your target.
277
+
278
+ How did you do? Depending on your internet speed, hopefully you hit the target.
279
+
280
+
281
+ ## Developing with `mobiusloop`
282
+
283
+ Hopefully by now you're getting the hang of it. When developing with `mobiusloop` there are three basic steps:
284
+
285
+
286
+ #### Step 1: Create a new `.goal` file in the `goals/` directory
287
+
288
+ You can copy an example or start from scratch. When done, do a dry run to ensure your syntax is valid:
289
+
290
+ $ mobiusloop goals/your_objective.goal --dry-run
291
+
292
+ Replacing `your_objective.goal` with your filename. If there's any syntax problems, fix them and run again until you get a clean run.
293
+
294
+
295
+ #### Step 2: Optionally create a step definition
296
+
297
+ `mobiusloop` ships with one step definition `goals/step_definitions/mobius_steps.rb`. If you write your objectives,
298
+ problems, outcomes and key results in the format above there's no need to create one. However if you want to create your own
299
+ format, you will need to create a custom step definition. To verify, run:
300
+
301
+ $ mobiusloop goals/your_objective.goal
302
+
303
+ If `mobiusloop` cannot find a matching step definition for your `.goal` file, it will tell you the step definition to create.
304
+ Copy and paste this into a new file `your_name_steps.rb` and save it to the `goals/step_definitions` folder. For more
305
+ info on step definitions, see [Cucumber's reference](https://cucumber.io/docs/reference#step-definitions).
306
+
307
+
308
+ #### Step 3: Create a new `Scale`
309
+
310
+ Create a new Ruby class to perform the measurement. For example, if your .`goal` file contains "My Custom Scale", the Ruby class would be:
311
+
312
+ ```Ruby
313
+ require 'mobiusloop/scale'
314
+ require 'mobiusloop/measure'
315
+
316
+ class MyCustomScale < Scale
317
+
318
+ def measure
319
+ total = fetch_your_total
320
+ Measure.new(total)
321
+ end
322
+
323
+ end
324
+ ```
325
+ Replace the line `total = fetch_your_total` with your custom logic. The last line should be `Measure.new(total)` to return a new measure.
326
+
327
+ We recommend writing unit tests around any custom scales you create to ensure they work as expected before integrating with `mobiusloop`
328
+
329
+ When done, run:
330
+
331
+ $ mobiusloop goals/your_objective.goal
332
+
333
+ To run a single `.goal`, or:
334
+
335
+ $ mobiusloop
336
+
337
+ To run all the `.goal` files in `/goals` folder.
338
+
339
+
340
+ ## Advanced Features
341
+
342
+ Because `mobiusloop` is an extension of [Cucumber](http://cucumber.io), there are many features in Cucumber that also
343
+ exist in `mobiusloop`. A few examples:
344
+
345
+ **Tags** - Use tags to create logical groups of Objectives, Problems, Outcomes or Key Results that you want run together.
346
+ For example, adding `@mytag` to the line immediately above a definition and running it with:
347
+
348
+ $ mobiusloop --tags @mytag
349
+
350
+ Will only run those Objectives, Problems, Outcomes or Key Results associated with that tag.
351
+
352
+ **Reports** - By default `mobiusloop` outputs the results to the command line. But you can also output reports in HTML,
353
+ JSON or other formats. See [Cucumber reports](https://cucumber.io/docs/reference#reports) for more details.
354
+
355
+
356
+
357
+ ## Testing
358
+
359
+ `mobiusloop` is built using a test-first approach. We're proud of our tests, but we're always looking to add more.
360
+ If you downloaded the source code to `/workspace/mobiusloop-ruby`, you can run the tests using this command from the source code folder:
361
+
362
+ $ rake spec
363
+
364
+
365
+ ## Report Defects
366
+
367
+ See a missing test or found a defect? [Let us know](https://github.com/ryanshriver/mobius/issues) by creating a new issue.
368
+
369
+
370
+ ## Contributing
371
+
372
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/mobius.
373
+
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ $:.unshift(File.dirname(__FILE__) + '/lib')
7
+ Dir['gem_tasks/**/*.rake'].each { |rake| load rake }
8
+
9
+ task :default => [:spec, :cucumber]
10
+
11
+ if ENV['TRAVIS']
12
+ ENV['SIMPLECOV'] = 'ci'
13
+ ENV['JRUBY_OPTS'] = [ENV['JRUBY_OPTS'], '--debug'].compact.join(' ')
14
+
15
+ require 'coveralls/rake/task'
16
+ Coveralls::RakeTask.new
17
+
18
+ task :default => [:spec, :cucumber, 'coveralls:push']
19
+ end
20
+
21
+ require 'rake/clean'
22
+ CLEAN.include %w(**/*.{log,pyc,rbc,tgz} doc)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
3
+
4
+ require 'simplecov_setup'
5
+ require 'cucumber/rspec/disable_option_parser'
6
+ require 'cucumber/cli/main'
7
+ # The dup is to keep ARGV intact, so that tools like ruby-debug can respawn.
8
+ Cucumber::Cli::Main.new(ARGV.dup).execute!
@@ -0,0 +1,47 @@
1
+ # -*- encoding: utf-8 -*-
2
+ Gem::Specification.new do |s|
3
+ s.name = 'cucumber'
4
+ s.version = File.read(File.expand_path("../lib/cucumber/version", __FILE__))
5
+ s.authors = ["Aslak Hellesøy", "Matt Wynne", "Steve Tooke"]
6
+ s.description = 'Behaviour Driven Development with elegance and joy'
7
+ s.summary = "cucumber-#{s.version}"
8
+ s.email = 'cukes@googlegroups.com'
9
+ s.license = 'MIT'
10
+ s.homepage = "http://cukes.info"
11
+ s.platform = Gem::Platform::RUBY
12
+ s.required_ruby_version = ">= 1.9.3"
13
+ s.add_dependency 'cucumber-core', '~> 1.4.0'
14
+ s.add_dependency 'builder', '>= 2.1.2'
15
+ s.add_dependency 'diff-lcs', '>= 1.1.3'
16
+ s.add_dependency 'gherkin', '~> 3.2'
17
+ s.add_dependency 'multi_json', '>= 1.7.5', '< 2.0'
18
+ s.add_dependency 'multi_test', '>= 0.1.2'
19
+ s.add_dependency 'cucumber-wire', '~> 0.0.1'
20
+
21
+ s.add_development_dependency 'aruba', '~> 0.6.1'
22
+ s.add_development_dependency 'json', '~> 1.7'
23
+ s.add_development_dependency 'nokogiri', '~> 1.5'
24
+ s.add_development_dependency 'rake', '>= 0.9.2'
25
+ s.add_development_dependency 'rspec', '>= 3.0'
26
+ s.add_development_dependency 'simplecov', '>= 0.6.2'
27
+ s.add_development_dependency 'coveralls', '~> 0.7'
28
+ s.add_development_dependency 'syntax', '>= 1.0.0'
29
+ s.add_development_dependency 'pry'
30
+
31
+ # For Documentation:
32
+ s.add_development_dependency 'bcat', '~> 0.6.2'
33
+ s.add_development_dependency 'kramdown', '~> 0.14'
34
+ s.add_development_dependency 'yard', '~> 0.8.0'
35
+
36
+ # Needed for examples (rake examples)
37
+ s.add_development_dependency 'capybara', '>= 2.1'
38
+ s.add_development_dependency 'rack-test', '>= 0.6.1'
39
+ s.add_development_dependency 'sinatra', '>= 1.3.2'
40
+
41
+ s.rubygems_version = ">= 1.6.1"
42
+ s.files = `git ls-files`.split("\n").reject {|path| path =~ /\.gitignore$/ }
43
+ s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
44
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
45
+ s.rdoc_options = ["--charset=UTF-8"]
46
+ s.require_path = "lib"
47
+ end