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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Detect the platform we're running on so we can tweak behaviour
|
|
2
|
+
# in various places.
|
|
3
|
+
require 'rbconfig'
|
|
4
|
+
require 'cucumber/core/platform'
|
|
5
|
+
|
|
6
|
+
module Cucumber
|
|
7
|
+
unless defined?(Cucumber::VERSION)
|
|
8
|
+
VERSION = File.read(File.expand_path("../version", __FILE__))
|
|
9
|
+
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/mobiusloop')
|
|
10
|
+
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
|
11
|
+
RAILS = defined?(Rails)
|
|
12
|
+
RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
|
13
|
+
RUBY_2_2 = RUBY_VERSION =~ /^2\.2/
|
|
14
|
+
RUBY_2_1 = RUBY_VERSION =~ /^2\.1/
|
|
15
|
+
RUBY_2_3 = RUBY_VERSION =~ /^2\.3/
|
|
16
|
+
|
|
17
|
+
class << self
|
|
18
|
+
attr_accessor :use_full_backtrace
|
|
19
|
+
|
|
20
|
+
# @private
|
|
21
|
+
def file_mode(m, encoding="UTF-8")
|
|
22
|
+
"#{m}:#{encoding}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
self.use_full_backtrace = false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Cucumber
|
|
2
|
+
|
|
3
|
+
# Generates generic file structure for a cucumber project
|
|
4
|
+
class ProjectInitializer
|
|
5
|
+
def run
|
|
6
|
+
# normal cucumber init, replacing /features for /goals
|
|
7
|
+
create_directory('goals')
|
|
8
|
+
create_directory('goals/step_definitions')
|
|
9
|
+
create_directory('goals/support')
|
|
10
|
+
create_file('goals/support/env.rb')
|
|
11
|
+
|
|
12
|
+
# extra mobiusloop initiialization
|
|
13
|
+
copy_step_defs('mobius_steps.rb', 'goals/step_definitions') # install mobius_steps.rb step definition
|
|
14
|
+
copy_gherkin_languages('gherkin-languages.json') # copy modified gherkin-languages.json file to gherkin gem(s)
|
|
15
|
+
copy_example_file('total_articles_scale.rb', 'goals/step_definitions')
|
|
16
|
+
copy_example_file('total_readers_scale.rb', 'goals/step_definitions')
|
|
17
|
+
copy_example_file('increase_readers.goal', 'goals')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def copy_step_defs(spec_file, target)
|
|
23
|
+
gem_dir = `gem environment gemdir`
|
|
24
|
+
steps_file = gem_dir.gsub("\n","") + "/gems/mobiusloop-?.?.?/lib/mobiusloop/" + spec_file
|
|
25
|
+
report_copying(spec_file, target)
|
|
26
|
+
copy_file(steps_file, target)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def copy_gherkin_languages(gherkin_file)
|
|
30
|
+
gem_dir = `gem environment gemdir`
|
|
31
|
+
source_gherkin = gem_dir.gsub("\n","") + "/gems/mobiusloop-?.?.?/" + gherkin_file
|
|
32
|
+
target_gherkin = gem_dir.gsub("\n","") + "/gems/gherkin-?.?.?/lib/gherkin/"
|
|
33
|
+
report_copying(gherkin_file, target_gherkin)
|
|
34
|
+
copy_file(source_gherkin, target_gherkin)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def copy_example_file(file, target)
|
|
38
|
+
gem_dir = `gem environment gemdir`
|
|
39
|
+
steps_file = gem_dir.gsub("\n","") + "/gems/mobiusloop-?.?.?/examples/mobiusloop/" + file
|
|
40
|
+
report_copying(file, target)
|
|
41
|
+
copy_file(steps_file, target)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# TODO: Fix this to work with Windows. FileUtils does not parse ? in file path like Unix
|
|
45
|
+
def copy_file(source, target)
|
|
46
|
+
`cp -rf #{source} #{target}`
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def create_directory(dir_name)
|
|
50
|
+
create_directory_or_file dir_name, true
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def create_file(file_name)
|
|
54
|
+
create_directory_or_file file_name, false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def create_directory_or_file(file_name, directory)
|
|
58
|
+
file_type = if directory
|
|
59
|
+
:mkdir_p
|
|
60
|
+
else
|
|
61
|
+
:touch
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
report_exists(file_name) || return if File.exists?(file_name)
|
|
65
|
+
|
|
66
|
+
report_creating(file_name)
|
|
67
|
+
FileUtils.send file_type, file_name
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def report_exists(file)
|
|
71
|
+
puts " exist #{file}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def report_creating(file)
|
|
75
|
+
puts " create #{file}"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def report_copying(source, target)
|
|
79
|
+
puts " copy #{source} => #{target}"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
require 'cucumber/platform'
|
|
2
|
+
require 'cucumber/gherkin/formatter/ansi_escapes'
|
|
3
|
+
begin
|
|
4
|
+
# Support Rake > 0.8.7
|
|
5
|
+
require 'rake/dsl_definition'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Cucumber
|
|
10
|
+
module Rake
|
|
11
|
+
# Defines a Rake task for running features.
|
|
12
|
+
#
|
|
13
|
+
# The simplest use of it goes something like:
|
|
14
|
+
#
|
|
15
|
+
# Cucumber::Rake::Task.new
|
|
16
|
+
#
|
|
17
|
+
# This will define a task named <tt>cucumber</tt> described as 'Run Cucumber features'.
|
|
18
|
+
# It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
|
|
19
|
+
#
|
|
20
|
+
# To further configure the task, you can pass a block:
|
|
21
|
+
#
|
|
22
|
+
# Cucumber::Rake::Task.new do |t|
|
|
23
|
+
# t.cucumber_opts = %w{--format progress}
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
# See the attributes for additional configuration possibilities.
|
|
27
|
+
class Task
|
|
28
|
+
include Cucumber::Gherkin::Formatter::AnsiEscapes
|
|
29
|
+
include ::Rake::DSL if defined?(::Rake::DSL)
|
|
30
|
+
|
|
31
|
+
class InProcessCucumberRunner #:nodoc:
|
|
32
|
+
include ::Rake::DSL if defined?(::Rake::DSL)
|
|
33
|
+
|
|
34
|
+
attr_reader :args
|
|
35
|
+
|
|
36
|
+
def initialize(libs, cucumber_opts, feature_files)
|
|
37
|
+
raise "libs must be an Array when running in-process" unless Array === libs
|
|
38
|
+
libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
|
|
39
|
+
@args = (
|
|
40
|
+
cucumber_opts +
|
|
41
|
+
feature_files
|
|
42
|
+
).flatten.compact
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def run
|
|
46
|
+
require 'cucumber/cli/main'
|
|
47
|
+
failure = Cucumber::Cli::Main.execute(args)
|
|
48
|
+
raise "Cucumber failed" if failure
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class ForkedCucumberRunner #:nodoc:
|
|
53
|
+
include ::Rake::DSL if defined?(::Rake::DSL)
|
|
54
|
+
|
|
55
|
+
def initialize(libs, cucumber_bin, cucumber_opts, bundler, feature_files)
|
|
56
|
+
@libs = libs
|
|
57
|
+
@cucumber_bin = cucumber_bin
|
|
58
|
+
@cucumber_opts = cucumber_opts
|
|
59
|
+
@bundler = bundler
|
|
60
|
+
@feature_files = feature_files
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def load_path(libs)
|
|
64
|
+
['"%s"' % @libs.join(File::PATH_SEPARATOR)]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def quoted_binary(cucumber_bin)
|
|
68
|
+
['"%s"' % cucumber_bin]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def use_bundler
|
|
72
|
+
@bundler.nil? ? File.exist?("./Gemfile") && bundler_gem_available? : @bundler
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def bundler_gem_available?
|
|
76
|
+
Gem::Specification.find_by_name('bundler')
|
|
77
|
+
rescue Gem::LoadError
|
|
78
|
+
false
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def cmd
|
|
82
|
+
if use_bundler
|
|
83
|
+
[ Cucumber::RUBY_BINARY, '-S', 'bundle', 'exec', 'cucumber', @cucumber_opts,
|
|
84
|
+
@feature_files ].flatten
|
|
85
|
+
else
|
|
86
|
+
[ Cucumber::RUBY_BINARY, '-I', load_path(@libs), quoted_binary(@cucumber_bin),
|
|
87
|
+
@cucumber_opts, @feature_files ].flatten
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def run
|
|
92
|
+
sh cmd.join(" ") do |ok, res|
|
|
93
|
+
if !ok
|
|
94
|
+
exit res.exitstatus
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Directories to add to the Ruby $LOAD_PATH
|
|
101
|
+
attr_accessor :libs
|
|
102
|
+
|
|
103
|
+
# Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
|
|
104
|
+
attr_accessor :binary
|
|
105
|
+
|
|
106
|
+
# Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
|
|
107
|
+
# It's recommended to pass an Array, but if it's a String it will be #split by ' '.
|
|
108
|
+
attr_accessor :cucumber_opts
|
|
109
|
+
def cucumber_opts=(opts) #:nodoc:
|
|
110
|
+
@cucumber_opts = String === opts ? opts.split(' ') : opts
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
|
|
114
|
+
# some startup speed if you set it to false, but this may also cause issues with
|
|
115
|
+
# your load path and gems.
|
|
116
|
+
attr_accessor :fork
|
|
117
|
+
|
|
118
|
+
# Define what profile to be used. When used with cucumber_opts it is simply appended
|
|
119
|
+
# to it. Will be ignored when CUCUMBER_OPTS is used.
|
|
120
|
+
attr_accessor :profile
|
|
121
|
+
|
|
122
|
+
# Whether or not to run with bundler (bundle exec). Setting this to false may speed
|
|
123
|
+
# up the execution. The default value is true if Bundler is installed and you have
|
|
124
|
+
# a Gemfile, false otherwise.
|
|
125
|
+
#
|
|
126
|
+
# Note that this attribute has no effect if you don't run in forked mode.
|
|
127
|
+
attr_accessor :bundler
|
|
128
|
+
|
|
129
|
+
# Define Cucumber Rake task
|
|
130
|
+
def initialize(task_name = "cucumber", desc = "Run Cucumber features")
|
|
131
|
+
@task_name, @desc = task_name, desc
|
|
132
|
+
@fork = true
|
|
133
|
+
@libs = ['lib']
|
|
134
|
+
@rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
|
|
135
|
+
yield self if block_given?
|
|
136
|
+
@binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
|
|
137
|
+
define_task
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def define_task #:nodoc:
|
|
141
|
+
desc @desc
|
|
142
|
+
task @task_name do
|
|
143
|
+
runner.run
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def runner(task_args = nil) #:nodoc:
|
|
148
|
+
cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
|
|
149
|
+
if(@fork)
|
|
150
|
+
return ForkedCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files)
|
|
151
|
+
end
|
|
152
|
+
InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def cucumber_opts_with_profile #:nodoc:
|
|
156
|
+
Array(cucumber_opts).concat Array(@profile).flat_map {|p| ["--profile", p] }
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def feature_files #:nodoc:
|
|
160
|
+
make_command_line_safe(FileList[ ENV['FEATURE'] || [] ])
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def make_command_line_safe(list)
|
|
164
|
+
list.map{|string| string.gsub(' ', '\ ')}
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
module Cucumber
|
|
2
|
+
module RbSupport
|
|
3
|
+
# This module defines the methods you can use to define pure Ruby
|
|
4
|
+
# Step Definitions and Hooks. This module is mixed into the toplevel
|
|
5
|
+
# object.
|
|
6
|
+
module RbDsl
|
|
7
|
+
class << self
|
|
8
|
+
attr_writer :rb_language
|
|
9
|
+
|
|
10
|
+
def alias_adverb(adverb)
|
|
11
|
+
alias_method adverb, :register_rb_step_definition
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def build_rb_world_factory(world_modules, proc)
|
|
15
|
+
@rb_language.build_rb_world_factory(world_modules, proc)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def register_rb_hook(phase, tag_names, proc)
|
|
19
|
+
@rb_language.register_rb_hook(phase, tag_names, proc)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def register_rb_transform(regexp, proc)
|
|
23
|
+
@rb_language.register_rb_transform(regexp, proc)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def register_rb_step_definition(regexp, proc_or_sym, options = {})
|
|
27
|
+
@rb_language.register_rb_step_definition(regexp, proc_or_sym, options)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
|
|
32
|
+
# The +proc+ will be executed once before each scenario to create an
|
|
33
|
+
# Object that the scenario's steps will run within. Any +world_modules+
|
|
34
|
+
# will be mixed into this Object (via Object#extend).
|
|
35
|
+
#
|
|
36
|
+
# This method is typically called from one or more Ruby scripts under
|
|
37
|
+
# <tt>features/support</tt>. You can call this method as many times as you
|
|
38
|
+
# like (to register more modules), but if you try to register more than
|
|
39
|
+
# one Proc you will get an error.
|
|
40
|
+
#
|
|
41
|
+
# Cucumber will not yield anything to the +proc+. Examples:
|
|
42
|
+
#
|
|
43
|
+
# World do
|
|
44
|
+
# MyClass.new
|
|
45
|
+
# end
|
|
46
|
+
#
|
|
47
|
+
# World(MyModule)
|
|
48
|
+
#
|
|
49
|
+
def World(*world_modules, &proc)
|
|
50
|
+
RbDsl.build_rb_world_factory(world_modules, proc)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Registers a proc that will run before each Scenario. You can register as many
|
|
54
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
|
55
|
+
def Before(*tag_expressions, &proc)
|
|
56
|
+
RbDsl.register_rb_hook('before', tag_expressions, proc)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Registers a proc that will run after each Scenario. You can register as many
|
|
60
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
|
61
|
+
def After(*tag_expressions, &proc)
|
|
62
|
+
RbDsl.register_rb_hook('after', tag_expressions, proc)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Registers a proc that will be wrapped around each scenario. The proc
|
|
66
|
+
# should accept two arguments: two arguments: the scenario and a "block"
|
|
67
|
+
# argument (but passed as a regular argument, since blocks cannot accept
|
|
68
|
+
# blocks in 1.8), on which it should call the .call method. You can register
|
|
69
|
+
# as many as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
|
70
|
+
def Around(*tag_expressions, &proc)
|
|
71
|
+
RbDsl.register_rb_hook('around', tag_expressions, proc)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Registers a proc that will run after each Step. You can register as
|
|
75
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
|
76
|
+
def AfterStep(*tag_expressions, &proc)
|
|
77
|
+
RbDsl.register_rb_hook('after_step', tag_expressions, proc)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Registers a proc that will be called with a step definition argument if it
|
|
81
|
+
# matches the pattern passed as the first argument to Transform. Alternatively, if
|
|
82
|
+
# the pattern contains captures then they will be yielded as arguments to the
|
|
83
|
+
# provided proc. The return value of the proc is consequently yielded to the
|
|
84
|
+
# step definition.
|
|
85
|
+
def Transform(regexp, &proc)
|
|
86
|
+
RbDsl.register_rb_transform(regexp, proc)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Registers a proc that will run after Cucumber is configured. You can register as
|
|
90
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
|
91
|
+
# TODO: Deprecate this
|
|
92
|
+
def AfterConfiguration(&proc)
|
|
93
|
+
RbDsl.register_rb_hook('after_configuration', [], proc)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Registers a new Ruby StepDefinition. This method is aliased
|
|
97
|
+
# to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>, and
|
|
98
|
+
# also to the i18n translations whenever a feature of a
|
|
99
|
+
# new language is loaded.
|
|
100
|
+
#
|
|
101
|
+
# If provided, the +symbol+ is sent to the <tt>World</tt> object
|
|
102
|
+
# as defined by #World. A new <tt>World</tt> object is created
|
|
103
|
+
# for each scenario and is shared across step definitions within
|
|
104
|
+
# that scenario. If the +options+ hash contains an <tt>:on</tt>
|
|
105
|
+
# key, the value for this is assumed to be a proc. This proc
|
|
106
|
+
# will be executed in the context of the <tt>World</tt> object
|
|
107
|
+
# and then sent the +symbol+.
|
|
108
|
+
#
|
|
109
|
+
# If no +symbol+ if provided then the +&proc+ gets executed in
|
|
110
|
+
# the context of the <tt>World</tt> object.
|
|
111
|
+
def register_rb_step_definition(regexp, symbol = nil, options = {}, &proc)
|
|
112
|
+
proc_or_sym = symbol || proc
|
|
113
|
+
RbDsl.register_rb_step_definition(regexp, proc_or_sym, options)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
extend(Cucumber::RbSupport::RbDsl)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Cucumber
|
|
2
|
+
module RbSupport
|
|
3
|
+
# Wrapper for Before, After and AfterStep hooks
|
|
4
|
+
class RbHook
|
|
5
|
+
attr_reader :tag_expressions, :location
|
|
6
|
+
|
|
7
|
+
def initialize(rb_language, tag_expressions, proc)
|
|
8
|
+
@rb_language = rb_language
|
|
9
|
+
@tag_expressions = tag_expressions
|
|
10
|
+
@proc = proc
|
|
11
|
+
@location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def invoke(pseudo_method, arguments, &block)
|
|
15
|
+
@rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].flatten.compact, &@proc)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
require 'cucumber/core_ext/instance_exec'
|
|
2
|
+
require 'cucumber/rb_support/rb_dsl'
|
|
3
|
+
require 'cucumber/rb_support/rb_world'
|
|
4
|
+
require 'cucumber/rb_support/rb_step_definition'
|
|
5
|
+
require 'cucumber/rb_support/rb_hook'
|
|
6
|
+
require 'cucumber/rb_support/rb_transform'
|
|
7
|
+
require 'cucumber/rb_support/snippet'
|
|
8
|
+
require 'cucumber/gherkin/i18n'
|
|
9
|
+
require 'multi_test'
|
|
10
|
+
require 'cucumber/step_match'
|
|
11
|
+
require 'cucumber/step_definition_light'
|
|
12
|
+
|
|
13
|
+
module Cucumber
|
|
14
|
+
module RbSupport
|
|
15
|
+
# Raised if a World block returns Nil.
|
|
16
|
+
class NilWorld < StandardError
|
|
17
|
+
def initialize
|
|
18
|
+
super("World procs should never return nil")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Raised if there are 2 or more World blocks.
|
|
23
|
+
class MultipleWorld < StandardError
|
|
24
|
+
def initialize(first_proc, second_proc)
|
|
25
|
+
message = "You can only pass a proc to #World once, but it's happening\n"
|
|
26
|
+
message << "in 2 places:\n\n"
|
|
27
|
+
message << RbSupport.backtrace_line(first_proc, 'World') << "\n"
|
|
28
|
+
message << RbSupport.backtrace_line(second_proc, 'World') << "\n\n"
|
|
29
|
+
message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
|
|
30
|
+
message << "or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.\n\n"
|
|
31
|
+
super(message)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# The Ruby implementation of the programming language API.
|
|
36
|
+
class RbLanguage
|
|
37
|
+
attr_reader :current_world,
|
|
38
|
+
:step_definitions
|
|
39
|
+
|
|
40
|
+
all_keywords = ::Gherkin::DIALECTS.keys.map do |dialect_name|
|
|
41
|
+
dialect = ::Gherkin::Dialect.for(dialect_name)
|
|
42
|
+
dialect.given_keywords + dialect.when_keywords + dialect.then_keywords + dialect.and_keywords + dialect.but_keywords
|
|
43
|
+
end
|
|
44
|
+
Cucumber::Gherkin::I18n.code_keywords_for(all_keywords.flatten.uniq.sort).each do |adverb|
|
|
45
|
+
RbDsl.alias_adverb(adverb.strip)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def initialize(runtime, configuration)
|
|
49
|
+
@runtime = runtime
|
|
50
|
+
@step_definitions = []
|
|
51
|
+
RbDsl.rb_language = self
|
|
52
|
+
@world_proc = @world_modules = nil
|
|
53
|
+
configuration.register_snippet_generator(Snippet::Generator.new)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def step_matches(name_to_match)
|
|
57
|
+
@step_definitions.reduce([]) { |result, step_definition|
|
|
58
|
+
if (arguments = step_definition.arguments_from(name_to_match))
|
|
59
|
+
result << StepMatch.new(step_definition, name_to_match, arguments)
|
|
60
|
+
end
|
|
61
|
+
result
|
|
62
|
+
}
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def begin_rb_scenario(scenario)
|
|
66
|
+
create_world
|
|
67
|
+
extend_world
|
|
68
|
+
connect_world(scenario)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def register_rb_hook(phase, tag_expressions, proc)
|
|
72
|
+
add_hook(phase, RbHook.new(self, tag_expressions, proc))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def register_rb_transform(regexp, proc)
|
|
76
|
+
add_transform(RbTransform.new(self, regexp, proc))
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def register_rb_step_definition(regexp, proc_or_sym, options)
|
|
80
|
+
step_definition = RbStepDefinition.new(self, regexp, proc_or_sym, options)
|
|
81
|
+
@step_definitions << step_definition
|
|
82
|
+
step_definition
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def build_rb_world_factory(world_modules, proc)
|
|
86
|
+
if(proc)
|
|
87
|
+
raise MultipleWorld.new(@world_proc, proc) if @world_proc
|
|
88
|
+
@world_proc = proc
|
|
89
|
+
end
|
|
90
|
+
@world_modules ||= []
|
|
91
|
+
@world_modules += world_modules
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def load_code_file(code_file)
|
|
95
|
+
return unless File.extname(code_file) == ".rb"
|
|
96
|
+
load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def begin_scenario(scenario)
|
|
100
|
+
begin_rb_scenario(scenario)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def end_scenario
|
|
104
|
+
@current_world = nil
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def after_configuration(configuration)
|
|
108
|
+
hooks[:after_configuration].each do |hook|
|
|
109
|
+
hook.invoke('AfterConfiguration', configuration)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def execute_transforms(args)
|
|
114
|
+
args.map do |arg|
|
|
115
|
+
matching_transform = transforms.detect {|transform| transform.match(arg) }
|
|
116
|
+
matching_transform ? matching_transform.invoke(arg) : arg
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def add_hook(phase, hook)
|
|
121
|
+
hooks[phase.to_sym] << hook
|
|
122
|
+
hook
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def clear_hooks
|
|
126
|
+
@hooks = nil
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def add_transform(transform)
|
|
130
|
+
transforms.unshift transform
|
|
131
|
+
transform
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def hooks_for(phase, scenario) #:nodoc:
|
|
135
|
+
hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def unmatched_step_definitions
|
|
139
|
+
available_step_definition_hash.keys - invoked_step_definition_hash.keys
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def available_step_definition(regexp_source, file_colon_line)
|
|
143
|
+
available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def invoked_step_definition(regexp_source, file_colon_line)
|
|
147
|
+
invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
private
|
|
151
|
+
|
|
152
|
+
def available_step_definition_hash
|
|
153
|
+
@available_step_definition_hash ||= {}
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def invoked_step_definition_hash
|
|
157
|
+
@invoked_step_definition_hash ||= {}
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def hooks
|
|
161
|
+
@hooks ||= Hash.new{|h,k| h[k] = []}
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def transforms
|
|
165
|
+
@transforms ||= []
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def create_world
|
|
169
|
+
if(@world_proc)
|
|
170
|
+
@current_world = @world_proc.call
|
|
171
|
+
check_nil(@current_world, @world_proc)
|
|
172
|
+
else
|
|
173
|
+
@current_world = Object.new
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def extend_world
|
|
178
|
+
@current_world.extend(RbWorld)
|
|
179
|
+
MultiTest.extend_with_best_assertion_library(@current_world)
|
|
180
|
+
(@world_modules || []).each do |mod|
|
|
181
|
+
@current_world.extend(mod)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def connect_world(scenario)
|
|
186
|
+
@current_world.__cucumber_runtime = @runtime
|
|
187
|
+
@current_world.__natural_language = scenario.language
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def check_nil(o, proc)
|
|
191
|
+
if o.nil?
|
|
192
|
+
begin
|
|
193
|
+
raise NilWorld.new
|
|
194
|
+
rescue NilWorld => e
|
|
195
|
+
e.backtrace.clear
|
|
196
|
+
e.backtrace.push(RbSupport.backtrace_line(proc, "World"))
|
|
197
|
+
raise e
|
|
198
|
+
end
|
|
199
|
+
else
|
|
200
|
+
o
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def self.cli_snippet_type_options
|
|
205
|
+
Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
|
|
206
|
+
Snippet::SNIPPET_TYPES[type].cli_option_string(type)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def self.backtrace_line(proc, name)
|
|
212
|
+
location = Cucumber::Core::Ast::Location.from_source_location(*proc.source_location)
|
|
213
|
+
"#{location.to_s}:in `#{name}'"
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|