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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.travis.yml +22 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +68 -0
- data/Gemfile +5 -0
- data/History.md +2280 -0
- data/LICENSE +22 -0
- data/README.md +373 -0
- data/Rakefile +22 -0
- data/bin/mobiusloop +8 -0
- data/cucumber.gemspec +47 -0
- data/cucumber.yml +20 -0
- data/examples/i18n/README.textile +3 -0
- data/examples/i18n/Rakefile +33 -0
- data/examples/i18n/ar/Rakefile +6 -0
- data/examples/i18n/ar/features/addition.feature +17 -0
- data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/ar/lib/calculator.rb +11 -0
- data/examples/i18n/bg/Rakefile +6 -0
- data/examples/i18n/bg/features/addition.feature +12 -0
- data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
- data/examples/i18n/bg/features/division.feature +17 -0
- data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/bg/features/support/env.rb +5 -0
- data/examples/i18n/bg/features/support/world.rb +8 -0
- data/examples/i18n/bg/lib/calculator.rb +24 -0
- data/examples/i18n/ca/Rakefile +6 -0
- data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +21 -0
- data/examples/i18n/ca/features/suma.feature +17 -0
- data/examples/i18n/ca/lib/calculadora.rb +16 -0
- data/examples/i18n/cs/Rakefile +6 -0
- data/examples/i18n/cs/features/addition.feature +17 -0
- data/examples/i18n/cs/features/division.feature +11 -0
- data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/cs/lib/calculator.rb +14 -0
- data/examples/i18n/da/Rakefile +6 -0
- data/examples/i18n/da/features/sammenlaegning.feature +18 -0
- data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +24 -0
- data/examples/i18n/da/lib/lommeregner.rb +11 -0
- data/examples/i18n/de/Rakefile +6 -0
- data/examples/i18n/de/features/addition.feature +17 -0
- data/examples/i18n/de/features/division.feature +10 -0
- data/examples/i18n/de/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/de/lib/calculator.rb +14 -0
- data/examples/i18n/el/Rakefile +6 -0
- data/examples/i18n/el/features/addition.feature +17 -0
- data/examples/i18n/el/features/division.feature +10 -0
- data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/el/lib/calculator.rb +14 -0
- data/examples/i18n/en-lol/Rakefile +4 -0
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
- data/examples/i18n/en-lol/features/stuffing.feature +8 -0
- data/examples/i18n/en-lol/features/support/env.rb +7 -0
- data/examples/i18n/en-lol/lib/basket.rb +12 -0
- data/examples/i18n/en-lol/lib/belly.rb +11 -0
- data/examples/i18n/en/Rakefile +6 -0
- data/examples/i18n/en/features/addition.feature +17 -0
- data/examples/i18n/en/features/division.feature +10 -0
- data/examples/i18n/en/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/en/lib/calculator.rb +14 -0
- data/examples/i18n/eo/Rakefile +6 -0
- data/examples/i18n/eo/features/adicio.feature +17 -0
- data/examples/i18n/eo/features/divido.feature +10 -0
- data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/eo/lib/calculator.rb +14 -0
- data/examples/i18n/es/Rakefile +6 -0
- data/examples/i18n/es/features/adicion.feature +17 -0
- data/examples/i18n/es/features/step_definitions/calculador_steps.rb +21 -0
- data/examples/i18n/es/lib/calculador.rb +14 -0
- data/examples/i18n/et/Rakefile +6 -0
- data/examples/i18n/et/features/jagamine.feature +10 -0
- data/examples/i18n/et/features/liitmine.feature +17 -0
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
- data/examples/i18n/et/lib/kalkulaator.rb +14 -0
- data/examples/i18n/fi/Rakefile +6 -0
- data/examples/i18n/fi/features/jakolasku.feature +10 -0
- data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +24 -0
- data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
- data/examples/i18n/fi/lib/laskin.rb +14 -0
- data/examples/i18n/fr/Rakefile +8 -0
- data/examples/i18n/fr/features/addition.feature +18 -0
- data/examples/i18n/fr/features/addition2.feature +17 -0
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
- data/examples/i18n/fr/features/support/env.rb +5 -0
- data/examples/i18n/fr/lib/calculatrice.rb +10 -0
- data/examples/i18n/he/Rakefile +6 -0
- data/examples/i18n/he/features/addition.feature +17 -0
- data/examples/i18n/he/features/division.feature +10 -0
- data/examples/i18n/he/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/he/lib/calculator.rb +15 -0
- data/examples/i18n/hi/Rakefile +6 -0
- data/examples/i18n/hi/features/addition.feature +16 -0
- data/examples/i18n/hi/features/division.feature +10 -0
- data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/hi/lib/calculator.rb +15 -0
- data/examples/i18n/ht/Rakefile +6 -0
- data/examples/i18n/ht/features/adisyon.feature +17 -0
- data/examples/i18n/ht/features/divizyon.feature +10 -0
- data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
- data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
- data/examples/i18n/hu/Rakefile +6 -0
- data/examples/i18n/hu/features/osszeadas.feature +17 -0
- data/examples/i18n/hu/features/osztas.feature +10 -0
- data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +25 -0
- data/examples/i18n/hu/lib/calculator.rb +14 -0
- data/examples/i18n/id/Rakefile +6 -0
- data/examples/i18n/id/features/addition.feature +17 -0
- data/examples/i18n/id/features/division.feature +10 -0
- data/examples/i18n/id/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/id/lib/calculator.rb +14 -0
- data/examples/i18n/it/Rakefile +6 -0
- data/examples/i18n/it/features/somma.feature +11 -0
- data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +24 -0
- data/examples/i18n/it/lib/calcolatrice.rb +11 -0
- data/examples/i18n/ja/Rakefile +6 -0
- data/examples/i18n/ja/features/addition.feature +17 -0
- data/examples/i18n/ja/features/division.feature +10 -0
- data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +19 -0
- data/examples/i18n/ja/features/support/env.rb +5 -0
- data/examples/i18n/ja/lib/calculator.rb +14 -0
- data/examples/i18n/ko/Rakefile +6 -0
- data/examples/i18n/ko/features/addition.feature +17 -0
- data/examples/i18n/ko/features/division.feature +11 -0
- data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/ko/lib/calculator.rb +14 -0
- data/examples/i18n/lt/Rakefile +6 -0
- data/examples/i18n/lt/features/addition.feature +17 -0
- data/examples/i18n/lt/features/division.feature +10 -0
- data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/lt/lib/calculator.rb +14 -0
- data/examples/i18n/lv/Rakefile +6 -0
- data/examples/i18n/lv/features/addition.feature +17 -0
- data/examples/i18n/lv/features/division.feature +10 -0
- data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/lv/lib/calculator.rb +14 -0
- data/examples/i18n/no/Rakefile +6 -0
- data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +17 -0
- data/examples/i18n/no/features/summering.feature +19 -0
- data/examples/i18n/no/features/support/env.rb +6 -0
- data/examples/i18n/no/lib/kalkulator.rb +11 -0
- data/examples/i18n/pl/Rakefile +6 -0
- data/examples/i18n/pl/features/addition.feature +17 -0
- data/examples/i18n/pl/features/division.feature +10 -0
- data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/pl/features/support/env.rb +5 -0
- data/examples/i18n/pl/lib/calculator.rb +14 -0
- data/examples/i18n/pt/Rakefile +6 -0
- data/examples/i18n/pt/features/adicao.feature +11 -0
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
- data/examples/i18n/pt/features/support/env.rb +5 -0
- data/examples/i18n/pt/lib/calculadora.rb +10 -0
- data/examples/i18n/ro/Rakefile +6 -0
- data/examples/i18n/ro/features/adunare.feature +12 -0
- data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +21 -0
- data/examples/i18n/ro/lib/calculator.rb +11 -0
- data/examples/i18n/ru/Rakefile +6 -0
- data/examples/i18n/ru/features/addition.feature +11 -0
- data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
- data/examples/i18n/ru/features/division.feature +16 -0
- data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +19 -0
- data/examples/i18n/ru/features/support/env.rb +5 -0
- data/examples/i18n/ru/features/support/world.rb +8 -0
- data/examples/i18n/ru/lib/calculator.rb +24 -0
- data/examples/i18n/sk/Rakefile +6 -0
- data/examples/i18n/sk/features/addition.feature +17 -0
- data/examples/i18n/sk/features/division.feature +10 -0
- data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/sk/lib/calculator.rb +14 -0
- data/examples/i18n/sr-Cyrl/Rakefile +6 -0
- data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
- data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +20 -0
- data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
- data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
- data/examples/i18n/sr-Latn/Rakefile +6 -0
- data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
- data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
- data/examples/i18n/sv/Rakefile +6 -0
- data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +24 -0
- data/examples/i18n/sv/features/summering.feature +18 -0
- data/examples/i18n/sv/lib/kalkulator.rb +11 -0
- data/examples/i18n/tr/Rakefile +6 -0
- data/examples/i18n/tr/features/bolme.feature +10 -0
- data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +24 -0
- data/examples/i18n/tr/features/toplama.feature +18 -0
- data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
- data/examples/i18n/uk/Rakefile +6 -0
- data/examples/i18n/uk/features/addition.feature +11 -0
- data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
- data/examples/i18n/uk/features/division.feature +16 -0
- data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +19 -0
- data/examples/i18n/uk/features/support/env.rb +5 -0
- data/examples/i18n/uk/features/support/world.rb +8 -0
- data/examples/i18n/uk/lib/calculator.rb +24 -0
- data/examples/i18n/uz/Rakefile +6 -0
- data/examples/i18n/uz/features/addition.feature +10 -0
- data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
- data/examples/i18n/uz/features/division.feature +17 -0
- data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +19 -0
- data/examples/i18n/uz/features/support/env.rb +5 -0
- data/examples/i18n/uz/features/support/world.rb +8 -0
- data/examples/i18n/uz/lib/calculator.rb +24 -0
- data/examples/i18n/zh-CN/Rakefile +4 -0
- data/examples/i18n/zh-CN/features/addition.feature +18 -0
- data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +26 -0
- data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
- data/examples/i18n/zh-TW/Rakefile +4 -0
- data/examples/i18n/zh-TW/features/addition.feature +17 -0
- data/examples/i18n/zh-TW/features/division.feature +11 -0
- data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +24 -0
- data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
- data/examples/mobiusloop/increase_readers.goal +13 -0
- data/examples/mobiusloop/scale_page_response.rb +20 -0
- data/examples/mobiusloop/total_articles_scale.rb +10 -0
- data/examples/mobiusloop/total_readers_scale.rb +10 -0
- data/examples/rspec_doubles/Rakefile +4 -0
- data/examples/rspec_doubles/features/mocking.feature +9 -0
- data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
- data/examples/rspec_doubles/features/support/env.rb +12 -0
- data/examples/sinatra/README.textile +13 -0
- data/examples/sinatra/Rakefile +6 -0
- data/examples/sinatra/app.rb +14 -0
- data/examples/sinatra/features/add.feature +11 -0
- data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
- data/examples/sinatra/features/support/env.rb +10 -0
- data/examples/sinatra/views/add.erb +7 -0
- data/examples/sinatra/views/layout.erb +8 -0
- data/examples/tcl/README.textile +11 -0
- data/examples/tcl/Rakefile +6 -0
- data/examples/tcl/features/fibonnacci.feature +17 -0
- data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
- data/examples/tcl/features/support/env.rb +6 -0
- data/examples/tcl/src/fib.tcl +3 -0
- data/examples/test_unit/Gemfile +4 -0
- data/examples/test_unit/Rakefile +6 -0
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +20 -0
- data/examples/test_unit/features/test_unit.feature +9 -0
- data/examples/watir/README.textile +16 -0
- data/examples/watir/Rakefile +12 -0
- data/examples/watir/cucumber.yml +1 -0
- data/examples/watir/features/search.feature +12 -0
- data/examples/watir/features/step_definitions/search_steps.rb +26 -0
- data/examples/watir/features/support/env.rb +35 -0
- data/examples/watir/features/support/screenshots.rb +47 -0
- data/features/docs/api/list_step_defs_as_json.feature +50 -0
- data/features/docs/api/listen_for_events.feature +58 -0
- data/features/docs/api/run_cli_main_with_existing_runtime.feature +26 -0
- data/features/docs/cli/backtraces.feature +36 -0
- data/features/docs/cli/dry_run.feature +70 -0
- data/features/docs/cli/exclude_files.feature +18 -0
- data/features/docs/cli/execute_with_tag_filter.feature +117 -0
- data/features/docs/cli/fail_fast.feature +46 -0
- data/features/docs/cli/finding_steps.feature +28 -0
- data/features/docs/cli/randomize.feature +140 -0
- data/features/docs/cli/require.feature +27 -0
- data/features/docs/cli/retry_failing_tests.feature +32 -0
- data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
- data/features/docs/cli/run_specific_scenarios.feature +77 -0
- data/features/docs/cli/showing_differences.feature +43 -0
- data/features/docs/cli/specifying_multiple_formatters.feature +65 -0
- data/features/docs/cli/strict_mode.feature +64 -0
- data/features/docs/defining_steps/nested_steps.feature +177 -0
- data/features/docs/defining_steps/nested_steps_i18n.feature +34 -0
- data/features/docs/defining_steps/nested_steps_with_second_arg.feature +54 -0
- data/features/docs/defining_steps/one_line_step_definitions.feature +65 -0
- data/features/docs/defining_steps/printing_messages.feature +148 -0
- data/features/docs/defining_steps/skip_scenario.feature +64 -0
- data/features/docs/defining_steps/snippets.feature +56 -0
- data/features/docs/defining_steps/table_diffing.feature +50 -0
- data/features/docs/exception_in_after_hook.feature +126 -0
- data/features/docs/exception_in_after_step_hook.feature +102 -0
- data/features/docs/exception_in_around_hook.feature +78 -0
- data/features/docs/exception_in_before_hook.feature +96 -0
- data/features/docs/extending_cucumber/custom_filter.feature +29 -0
- data/features/docs/extending_cucumber/custom_formatter.feature +130 -0
- data/features/docs/formatters/api_methods.feature +37 -0
- data/features/docs/formatters/debug_formatter.feature +47 -0
- data/features/docs/formatters/formatter_step_file_colon_line.feature +44 -0
- data/features/docs/formatters/html_formatter.feature +91 -0
- data/features/docs/formatters/json_formatter.feature +767 -0
- data/features/docs/formatters/junit_formatter.feature +454 -0
- data/features/docs/formatters/pretty_formatter.feature +73 -0
- data/features/docs/formatters/progress_formatter.feature +31 -0
- data/features/docs/formatters/rerun_formatter.feature +188 -0
- data/features/docs/formatters/usage_formatter.feature +98 -0
- data/features/docs/getting_started.feature +27 -0
- data/features/docs/gherkin/background.feature +548 -0
- data/features/docs/gherkin/doc_strings.feature +74 -0
- data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
- data/features/docs/gherkin/language_from_header.feature +32 -0
- data/features/docs/gherkin/language_help.feature +42 -0
- data/features/docs/gherkin/outlines.feature +156 -0
- data/features/docs/gherkin/unicode_table.feature +32 -0
- data/features/docs/gherkin/using_descriptions.feature +82 -0
- data/features/docs/gherkin/using_star_notation.feature +37 -0
- data/features/docs/iso-8859-1.feature +6 -0
- data/features/docs/post_configuration_hook.feature +49 -0
- data/features/docs/profiles.feature +120 -0
- data/features/docs/rake_task.feature +141 -0
- data/features/docs/raketask.feature +44 -0
- data/features/docs/work_in_progress.feature +154 -0
- data/features/docs/writing_support_code/after_hooks.feature +102 -0
- data/features/docs/writing_support_code/after_step_hooks.feature +53 -0
- data/features/docs/writing_support_code/around_hooks.feature +260 -0
- data/features/docs/writing_support_code/before_hook.feature +65 -0
- data/features/docs/writing_support_code/hook_order.feature +61 -0
- data/features/docs/writing_support_code/load_path.feature +17 -0
- data/features/docs/writing_support_code/state.feature +32 -0
- data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
- data/features/docs/writing_support_code/transforms.feature +98 -0
- data/features/lib/step_definitions/aruba_steps.rb +26 -0
- data/features/lib/step_definitions/cucumber_steps.rb +78 -0
- data/features/lib/step_definitions/iso-8859-1_steps.rb +12 -0
- data/features/lib/step_definitions/json_steps.rb +7 -0
- data/features/lib/step_definitions/junit_steps.rb +13 -0
- data/features/lib/step_definitions/language_steps.rb +8 -0
- data/features/lib/step_definitions/profile_steps.rb +15 -0
- data/features/lib/step_definitions/retry_steps.rb +35 -0
- data/features/lib/step_definitions/ruby_steps.rb +3 -0
- data/features/lib/step_definitions/wire_steps.rb +58 -0
- data/features/lib/support/env.rb +21 -0
- data/features/lib/support/fake_wire_server.rb +80 -0
- data/features/lib/support/feature_factory.rb +67 -0
- data/features/lib/support/normalise_output.rb +50 -0
- data/gem_tasks/contributors.rake +15 -0
- data/gem_tasks/cov.rake +5 -0
- data/gem_tasks/cucumber.rake +25 -0
- data/gem_tasks/downloads.rb +7 -0
- data/gem_tasks/environment.rake +7 -0
- data/gem_tasks/examples.rake +11 -0
- data/gem_tasks/fix_cr_lf.rake +10 -0
- data/gem_tasks/flog.rake +4 -0
- data/gem_tasks/rspec.rake +6 -0
- data/gem_tasks/sass.rake +4 -0
- data/gem_tasks/stats +16 -0
- data/gem_tasks/versions.txt +74 -0
- data/gherkin-languages.json +2972 -0
- data/lib/autotest/cucumber.rb +6 -0
- data/lib/autotest/cucumber_mixin.rb +135 -0
- data/lib/autotest/cucumber_rails.rb +6 -0
- data/lib/autotest/cucumber_rails_rspec.rb +6 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
- data/lib/autotest/cucumber_rspec.rb +6 -0
- data/lib/autotest/cucumber_rspec2.rb +6 -0
- data/lib/autotest/discover.rb +11 -0
- data/lib/cucumber.rb +37 -0
- data/lib/cucumber/ast.rb +13 -0
- data/lib/cucumber/cli/configuration.rb +146 -0
- data/lib/cucumber/cli/main.rb +99 -0
- data/lib/cucumber/cli/options.rb +465 -0
- data/lib/cucumber/cli/profile_loader.rb +91 -0
- data/lib/cucumber/cli/rerun_file.rb +29 -0
- data/lib/cucumber/configuration.rb +268 -0
- data/lib/cucumber/constantize.rb +45 -0
- data/lib/cucumber/core_ext/instance_exec.rb +70 -0
- data/lib/cucumber/core_ext/string.rb +9 -0
- data/lib/cucumber/deprecate.rb +29 -0
- data/lib/cucumber/encoding.rb +5 -0
- data/lib/cucumber/errors.rb +51 -0
- data/lib/cucumber/events.rb +20 -0
- data/lib/cucumber/events/after_test_case.rb +25 -0
- data/lib/cucumber/events/after_test_step.rb +30 -0
- data/lib/cucumber/events/before_test_case.rb +18 -0
- data/lib/cucumber/events/before_test_step.rb +23 -0
- data/lib/cucumber/events/bus.rb +86 -0
- data/lib/cucumber/events/finished_testing.rb +9 -0
- data/lib/cucumber/events/step_match.rb +23 -0
- data/lib/cucumber/file_specs.rb +37 -0
- data/lib/cucumber/filters.rb +9 -0
- data/lib/cucumber/filters/activate_steps.rb +67 -0
- data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
- data/lib/cucumber/filters/gated_receiver.rb +25 -0
- data/lib/cucumber/filters/prepare_world.rb +45 -0
- data/lib/cucumber/filters/quit.rb +28 -0
- data/lib/cucumber/filters/randomizer.rb +45 -0
- data/lib/cucumber/filters/retry.rb +32 -0
- data/lib/cucumber/filters/tag_limits.rb +45 -0
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
- data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
- data/lib/cucumber/formatter/ansicolor.rb +160 -0
- data/lib/cucumber/formatter/backtrace_filter.rb +41 -0
- data/lib/cucumber/formatter/console.rb +252 -0
- data/lib/cucumber/formatter/cucumber.css +286 -0
- data/lib/cucumber/formatter/cucumber.sass +247 -0
- data/lib/cucumber/formatter/debug.rb +35 -0
- data/lib/cucumber/formatter/duration.rb +13 -0
- data/lib/cucumber/formatter/duration_extractor.rb +28 -0
- data/lib/cucumber/formatter/event_bus_report.rb +38 -0
- data/lib/cucumber/formatter/fail_fast.rb +18 -0
- data/lib/cucumber/formatter/fanout.rb +27 -0
- data/lib/cucumber/formatter/hook_query_visitor.rb +40 -0
- data/lib/cucumber/formatter/html.rb +689 -0
- data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
- data/lib/cucumber/formatter/interceptor.rb +80 -0
- data/lib/cucumber/formatter/io.rb +34 -0
- data/lib/cucumber/formatter/jquery-min.js +154 -0
- data/lib/cucumber/formatter/json.rb +334 -0
- data/lib/cucumber/formatter/json_pretty.rb +10 -0
- data/lib/cucumber/formatter/junit.rb +238 -0
- data/lib/cucumber/formatter/legacy_api/adapter.rb +1016 -0
- data/lib/cucumber/formatter/legacy_api/ast.rb +389 -0
- data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +31 -0
- data/lib/cucumber/formatter/pretty.rb +247 -0
- data/lib/cucumber/formatter/progress.rb +73 -0
- data/lib/cucumber/formatter/rerun.rb +35 -0
- data/lib/cucumber/formatter/stepdefs.rb +14 -0
- data/lib/cucumber/formatter/steps.rb +49 -0
- data/lib/cucumber/formatter/summary.rb +35 -0
- data/lib/cucumber/formatter/unicode.rb +53 -0
- data/lib/cucumber/formatter/usage.rb +136 -0
- data/lib/cucumber/gherkin/data_table_parser.rb +31 -0
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +99 -0
- data/lib/cucumber/gherkin/formatter/escaping.rb +17 -0
- data/lib/cucumber/gherkin/i18n.rb +15 -0
- data/lib/cucumber/gherkin/steps_parser.rb +31 -0
- data/lib/cucumber/hooks.rb +99 -0
- data/lib/cucumber/load_path.rb +13 -0
- data/lib/cucumber/multiline_argument.rb +71 -0
- data/lib/cucumber/multiline_argument/data_table.rb +744 -0
- data/lib/cucumber/multiline_argument/doc_string.rb +9 -0
- data/lib/cucumber/platform.rb +27 -0
- data/lib/cucumber/project_initializer.rb +82 -0
- data/lib/cucumber/rake/task.rb +168 -0
- data/lib/cucumber/rb_support/rb_dsl.rb +119 -0
- data/lib/cucumber/rb_support/rb_hook.rb +19 -0
- data/lib/cucumber/rb_support/rb_language.rb +216 -0
- data/lib/cucumber/rb_support/rb_step_definition.rb +131 -0
- data/lib/cucumber/rb_support/rb_transform.rb +59 -0
- data/lib/cucumber/rb_support/rb_world.rb +149 -0
- data/lib/cucumber/rb_support/snippet.rb +170 -0
- data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
- data/lib/cucumber/rspec/doubles.rb +19 -0
- data/lib/cucumber/running_test_case.rb +134 -0
- data/lib/cucumber/runtime.rb +266 -0
- data/lib/cucumber/runtime/after_hooks.rb +25 -0
- data/lib/cucumber/runtime/before_hooks.rb +27 -0
- data/lib/cucumber/runtime/for_programming_languages.rb +66 -0
- data/lib/cucumber/runtime/step_hooks.rb +23 -0
- data/lib/cucumber/runtime/support_code.rb +151 -0
- data/lib/cucumber/runtime/user_interface.rb +85 -0
- data/lib/cucumber/step_argument.rb +25 -0
- data/lib/cucumber/step_definition_light.rb +20 -0
- data/lib/cucumber/step_definitions.rb +13 -0
- data/lib/cucumber/step_match.rb +141 -0
- data/lib/cucumber/step_match_search.rb +67 -0
- data/lib/cucumber/term/ansicolor.rb +110 -0
- data/lib/cucumber/unit.rb +11 -0
- data/lib/cucumber/version +1 -0
- data/lib/mobiusloop/measure.rb +19 -0
- data/lib/mobiusloop/mobius_steps.rb +36 -0
- data/lib/mobiusloop/objective.rb +10 -0
- data/lib/mobiusloop/outcome.rb +99 -0
- data/lib/mobiusloop/scale.rb +32 -0
- data/lib/simplecov_setup.rb +18 -0
- data/major_changes_to_cucumber.md +45 -0
- data/mobiusloop.gemspec +47 -0
- data/spec/cucumber/cli/configuration_spec.rb +435 -0
- data/spec/cucumber/cli/main_spec.rb +83 -0
- data/spec/cucumber/cli/options_spec.rb +410 -0
- data/spec/cucumber/cli/profile_loader_spec.rb +46 -0
- data/spec/cucumber/cli/rerun_spec.rb +85 -0
- data/spec/cucumber/configuration_spec.rb +147 -0
- data/spec/cucumber/constantize_spec.rb +19 -0
- data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
- data/spec/cucumber/events/bus_spec.rb +94 -0
- data/spec/cucumber/file_specs_spec.rb +60 -0
- data/spec/cucumber/filters/activate_steps_spec.rb +149 -0
- data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
- data/spec/cucumber/filters/retry_spec.rb +79 -0
- data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
- data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
- data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
- data/spec/cucumber/formatter/ansicolor_spec.rb +32 -0
- data/spec/cucumber/formatter/debug_spec.rb +64 -0
- data/spec/cucumber/formatter/duration_spec.rb +22 -0
- data/spec/cucumber/formatter/event_bus_report_spec.rb +88 -0
- data/spec/cucumber/formatter/fail_fast_spec.rb +88 -0
- data/spec/cucumber/formatter/html_spec.rb +538 -0
- data/spec/cucumber/formatter/interceptor_spec.rb +136 -0
- data/spec/cucumber/formatter/json_spec.rb +841 -0
- data/spec/cucumber/formatter/junit_spec.rb +252 -0
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2182 -0
- data/spec/cucumber/formatter/pretty_spec.rb +919 -0
- data/spec/cucumber/formatter/progress_spec.rb +169 -0
- data/spec/cucumber/formatter/rerun_spec.rb +91 -0
- data/spec/cucumber/formatter/spec_helper.rb +82 -0
- data/spec/cucumber/hooks_spec.rb +30 -0
- data/spec/cucumber/multiline_argument/data_table_spec.rb +603 -0
- data/spec/cucumber/project_initializer_spec.rb +87 -0
- data/spec/cucumber/rake/forked_spec.rb +53 -0
- data/spec/cucumber/rake/task_spec.rb +85 -0
- data/spec/cucumber/rb_support/rb_language_spec.rb +243 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +199 -0
- data/spec/cucumber/rb_support/rb_transform_spec.rb +46 -0
- data/spec/cucumber/rb_support/rb_world_spec.rb +47 -0
- data/spec/cucumber/rb_support/snippet_spec.rb +137 -0
- data/spec/cucumber/running_test_case_spec.rb +139 -0
- data/spec/cucumber/runtime/for_programming_languages_spec.rb +36 -0
- data/spec/cucumber/runtime/support_code_spec.rb +16 -0
- data/spec/cucumber/runtime_spec.rb +20 -0
- data/spec/cucumber/sell_cucumbers.feature +19 -0
- data/spec/cucumber/step_argument_spec.rb +18 -0
- data/spec/cucumber/step_match_search_spec.rb +122 -0
- data/spec/cucumber/step_match_spec.rb +85 -0
- data/spec/cucumber/world/pending_spec.rb +47 -0
- data/spec/cucumber_spec.rb +39 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/standard_step_actions.rb +18 -0
- 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.
|
data/README.md
ADDED
|
@@ -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
|
+
|
data/Rakefile
ADDED
|
@@ -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)
|
data/bin/mobiusloop
ADDED
|
@@ -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!
|
data/cucumber.gemspec
ADDED
|
@@ -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
|