cucumber 3.0.0.pre.1 → 4.0.0.rc.4
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 +5 -5
- data/{History.md → CHANGELOG.md} +339 -37
- data/CONTRIBUTING.md +11 -21
- data/README.md +20 -12
- data/bin/cucumber +2 -1
- data/lib/autotest/cucumber.rb +1 -0
- data/lib/autotest/cucumber_mixin.rb +44 -48
- data/lib/autotest/cucumber_rails.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
- data/lib/autotest/cucumber_rspec.rb +1 -0
- data/lib/autotest/cucumber_rspec2.rb +1 -0
- data/lib/autotest/discover.rb +3 -2
- data/lib/cucumber.rb +2 -1
- data/lib/cucumber/cli/configuration.rb +15 -20
- data/lib/cucumber/cli/main.rb +15 -15
- data/lib/cucumber/cli/options.rb +249 -197
- data/lib/cucumber/cli/profile_loader.rb +63 -38
- data/lib/cucumber/cli/rerun_file.rb +1 -0
- data/lib/cucumber/configuration.rb +49 -44
- data/lib/cucumber/constantize.rb +8 -10
- data/lib/cucumber/core_ext/string.rb +2 -1
- data/lib/cucumber/deprecate.rb +34 -10
- data/lib/cucumber/encoding.rb +2 -1
- data/lib/cucumber/errors.rb +10 -8
- data/lib/cucumber/events.rb +18 -3
- data/lib/cucumber/events/envelope.rb +9 -0
- data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
- data/lib/cucumber/events/gherkin_source_read.rb +14 -0
- data/lib/cucumber/events/hook_test_step_created.rb +13 -0
- data/lib/cucumber/events/{step_match.rb → step_activated.rb} +8 -8
- data/lib/cucumber/events/step_definition_registered.rb +5 -9
- data/lib/cucumber/events/test_case_created.rb +13 -0
- data/lib/cucumber/events/test_case_finished.rb +14 -0
- data/lib/cucumber/events/test_case_ready.rb +12 -0
- data/lib/cucumber/events/test_case_started.rb +11 -0
- data/lib/cucumber/events/test_run_finished.rb +2 -3
- data/lib/cucumber/events/test_run_started.rb +14 -0
- data/lib/cucumber/events/test_step_created.rb +13 -0
- data/lib/cucumber/events/test_step_finished.rb +14 -0
- data/lib/cucumber/events/test_step_started.rb +11 -0
- data/lib/cucumber/file_specs.rb +7 -6
- data/lib/cucumber/filters.rb +3 -0
- data/lib/cucumber/filters/activate_steps.rb +12 -6
- data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
- data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
- data/lib/cucumber/filters/broadcast_test_run_started_event.rb +28 -0
- data/lib/cucumber/filters/gated_receiver.rb +1 -2
- data/lib/cucumber/filters/prepare_world.rb +6 -13
- data/lib/cucumber/filters/quit.rb +3 -7
- data/lib/cucumber/filters/randomizer.rb +6 -7
- data/lib/cucumber/filters/retry.rb +3 -3
- data/lib/cucumber/filters/tag_limits.rb +5 -5
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
- data/lib/cucumber/filters/tag_limits/verifier.rb +4 -7
- data/lib/cucumber/formatter/ansicolor.rb +38 -45
- data/lib/cucumber/formatter/ast_lookup.rb +165 -0
- data/lib/cucumber/formatter/backtrace_filter.rb +24 -12
- data/lib/cucumber/formatter/console.rb +48 -88
- data/lib/cucumber/formatter/console_counts.rb +11 -29
- data/lib/cucumber/formatter/console_issues.rb +34 -10
- data/lib/cucumber/formatter/duration.rb +2 -1
- data/lib/cucumber/formatter/duration_extractor.rb +4 -2
- data/lib/cucumber/formatter/errors.rb +6 -0
- data/lib/cucumber/formatter/fail_fast.rb +8 -5
- data/lib/cucumber/formatter/fanout.rb +3 -3
- data/lib/cucumber/formatter/ignore_missing_messages.rb +2 -4
- data/lib/cucumber/formatter/interceptor.rb +12 -14
- data/lib/cucumber/formatter/io.rb +5 -4
- data/lib/cucumber/formatter/json.rb +109 -115
- data/lib/cucumber/formatter/junit.rb +85 -80
- data/lib/cucumber/formatter/message.rb +246 -0
- data/lib/cucumber/formatter/pretty.rb +353 -153
- data/lib/cucumber/formatter/progress.rb +34 -38
- data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
- data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
- data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
- data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
- data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
- data/lib/cucumber/formatter/rerun.rb +24 -5
- data/lib/cucumber/formatter/stepdefs.rb +2 -2
- data/lib/cucumber/formatter/steps.rb +5 -6
- data/lib/cucumber/formatter/summary.rb +18 -11
- data/lib/cucumber/formatter/unicode.rb +16 -18
- data/lib/cucumber/formatter/usage.rb +37 -33
- data/lib/cucumber/gherkin/data_table_parser.rb +18 -6
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +83 -86
- data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
- data/lib/cucumber/gherkin/i18n.rb +1 -0
- data/lib/cucumber/gherkin/steps_parser.rb +18 -8
- data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +37 -23
- data/lib/cucumber/glue/hook.rb +67 -0
- data/lib/cucumber/glue/invoke_in_world.rb +65 -0
- data/lib/cucumber/glue/proto_world.rb +231 -0
- data/lib/cucumber/glue/registry_and_more.rb +221 -0
- data/lib/cucumber/glue/snippet.rb +205 -0
- data/lib/cucumber/glue/step_definition.rb +166 -0
- data/lib/cucumber/glue/world_factory.rb +21 -0
- data/lib/cucumber/hooks.rb +30 -20
- data/lib/cucumber/load_path.rb +1 -0
- data/lib/cucumber/multiline_argument.rb +9 -19
- data/lib/cucumber/multiline_argument/data_table.rb +143 -250
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +154 -0
- data/lib/cucumber/multiline_argument/doc_string.rb +2 -1
- data/lib/cucumber/platform.rb +5 -6
- data/lib/cucumber/project_initializer.rb +2 -2
- data/lib/cucumber/rake/task.rb +34 -27
- data/lib/cucumber/rspec/disable_option_parser.rb +10 -8
- data/lib/cucumber/rspec/doubles.rb +2 -1
- data/lib/cucumber/running_test_case.rb +4 -54
- data/lib/cucumber/runtime.rb +54 -72
- data/lib/cucumber/runtime/after_hooks.rb +10 -5
- data/lib/cucumber/runtime/before_hooks.rb +9 -4
- data/lib/cucumber/runtime/for_programming_languages.rb +12 -44
- data/lib/cucumber/runtime/step_hooks.rb +5 -2
- data/lib/cucumber/runtime/support_code.rb +30 -32
- data/lib/cucumber/runtime/user_interface.rb +16 -34
- data/lib/cucumber/step_definition_light.rb +7 -4
- data/lib/cucumber/step_definitions.rb +3 -2
- data/lib/cucumber/step_match.rb +42 -26
- data/lib/cucumber/step_match_search.rb +11 -12
- data/lib/cucumber/term/ansicolor.rb +39 -39
- data/lib/cucumber/unit.rb +1 -0
- data/lib/cucumber/version +1 -1
- data/lib/simplecov_setup.rb +2 -1
- metadata +238 -623
- data/.coveralls.yml +0 -1
- data/.github/ISSUE_TEMPLATE.md +0 -48
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -39
- data/.rspec +0 -1
- data/.ruby-gemset +0 -1
- data/.travis.yml +0 -35
- data/.yardopts +0 -1
- data/Gemfile +0 -22
- data/Rakefile +0 -22
- data/cucumber.gemspec +0 -47
- data/cucumber.yml +0 -20
- data/examples/i18n/README.textile +0 -3
- data/examples/i18n/Rakefile +0 -33
- data/examples/i18n/ar/Rakefile +0 -6
- data/examples/i18n/ar/features/addition.feature +0 -17
- data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/ar/lib/calculator.rb +0 -11
- data/examples/i18n/bg/Rakefile +0 -6
- data/examples/i18n/bg/features/addition.feature +0 -12
- data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
- data/examples/i18n/bg/features/division.feature +0 -17
- data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/bg/features/support/env.rb +0 -5
- data/examples/i18n/bg/features/support/world.rb +0 -8
- data/examples/i18n/bg/lib/calculator.rb +0 -24
- data/examples/i18n/ca/Rakefile +0 -6
- data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -21
- data/examples/i18n/ca/features/suma.feature +0 -17
- data/examples/i18n/ca/lib/calculadora.rb +0 -16
- data/examples/i18n/cs/Rakefile +0 -6
- data/examples/i18n/cs/features/addition.feature +0 -17
- data/examples/i18n/cs/features/division.feature +0 -11
- data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/cs/lib/calculator.rb +0 -14
- data/examples/i18n/da/Rakefile +0 -6
- data/examples/i18n/da/features/sammenlaegning.feature +0 -18
- data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -24
- data/examples/i18n/da/lib/lommeregner.rb +0 -11
- data/examples/i18n/de/Rakefile +0 -6
- data/examples/i18n/de/features/addition.feature +0 -17
- data/examples/i18n/de/features/division.feature +0 -10
- data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/de/lib/calculator.rb +0 -14
- data/examples/i18n/el/Rakefile +0 -6
- data/examples/i18n/el/features/addition.feature +0 -17
- data/examples/i18n/el/features/division.feature +0 -10
- data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/el/lib/calculator.rb +0 -14
- data/examples/i18n/en-lol/Rakefile +0 -4
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
- data/examples/i18n/en-lol/features/stuffing.feature +0 -8
- data/examples/i18n/en-lol/features/support/env.rb +0 -7
- data/examples/i18n/en-lol/lib/basket.rb +0 -12
- data/examples/i18n/en-lol/lib/belly.rb +0 -11
- data/examples/i18n/en/Rakefile +0 -6
- data/examples/i18n/en/features/addition.feature +0 -17
- data/examples/i18n/en/features/division.feature +0 -10
- data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/en/lib/calculator.rb +0 -14
- data/examples/i18n/eo/Rakefile +0 -6
- data/examples/i18n/eo/features/adicio.feature +0 -17
- data/examples/i18n/eo/features/divido.feature +0 -10
- data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/eo/lib/calculator.rb +0 -14
- data/examples/i18n/es/Rakefile +0 -6
- data/examples/i18n/es/features/adicion.feature +0 -17
- data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -21
- data/examples/i18n/es/lib/calculador.rb +0 -14
- data/examples/i18n/et/Rakefile +0 -6
- data/examples/i18n/et/features/jagamine.feature +0 -10
- data/examples/i18n/et/features/liitmine.feature +0 -17
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -24
- data/examples/i18n/et/lib/kalkulaator.rb +0 -14
- data/examples/i18n/fi/Rakefile +0 -6
- data/examples/i18n/fi/features/jakolasku.feature +0 -10
- data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -24
- data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
- data/examples/i18n/fi/lib/laskin.rb +0 -14
- data/examples/i18n/fr/Rakefile +0 -8
- data/examples/i18n/fr/features/addition.feature +0 -18
- data/examples/i18n/fr/features/addition2.feature +0 -17
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
- data/examples/i18n/fr/features/support/env.rb +0 -5
- data/examples/i18n/fr/lib/calculatrice.rb +0 -10
- data/examples/i18n/he/Rakefile +0 -6
- data/examples/i18n/he/features/addition.feature +0 -17
- data/examples/i18n/he/features/division.feature +0 -10
- data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/he/lib/calculator.rb +0 -15
- data/examples/i18n/hi/Rakefile +0 -6
- data/examples/i18n/hi/features/addition.feature +0 -16
- data/examples/i18n/hi/features/division.feature +0 -10
- data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/hi/lib/calculator.rb +0 -15
- data/examples/i18n/ht/Rakefile +0 -6
- data/examples/i18n/ht/features/adisyon.feature +0 -17
- data/examples/i18n/ht/features/divizyon.feature +0 -10
- data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +0 -25
- data/examples/i18n/ht/lib/kalkilatris.rb +0 -14
- data/examples/i18n/hu/Rakefile +0 -6
- data/examples/i18n/hu/features/osszeadas.feature +0 -17
- data/examples/i18n/hu/features/osztas.feature +0 -10
- data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -25
- data/examples/i18n/hu/lib/calculator.rb +0 -14
- data/examples/i18n/id/Rakefile +0 -6
- data/examples/i18n/id/features/addition.feature +0 -17
- data/examples/i18n/id/features/division.feature +0 -10
- data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/id/lib/calculator.rb +0 -14
- data/examples/i18n/it/Rakefile +0 -6
- data/examples/i18n/it/features/somma.feature +0 -11
- data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -24
- data/examples/i18n/it/lib/calcolatrice.rb +0 -11
- data/examples/i18n/ja/Rakefile +0 -6
- data/examples/i18n/ja/features/addition.feature +0 -17
- data/examples/i18n/ja/features/division.feature +0 -10
- data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
- data/examples/i18n/ja/features/support/env.rb +0 -5
- data/examples/i18n/ja/lib/calculator.rb +0 -14
- data/examples/i18n/ko/Rakefile +0 -6
- data/examples/i18n/ko/features/addition.feature +0 -17
- data/examples/i18n/ko/features/division.feature +0 -11
- data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/ko/lib/calculator.rb +0 -14
- data/examples/i18n/lt/Rakefile +0 -6
- data/examples/i18n/lt/features/addition.feature +0 -17
- data/examples/i18n/lt/features/division.feature +0 -10
- data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/lt/lib/calculator.rb +0 -14
- data/examples/i18n/lv/Rakefile +0 -6
- data/examples/i18n/lv/features/addition.feature +0 -17
- data/examples/i18n/lv/features/division.feature +0 -10
- data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/lv/lib/calculator.rb +0 -14
- data/examples/i18n/no/Rakefile +0 -6
- data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
- data/examples/i18n/no/features/summering.feature +0 -19
- data/examples/i18n/no/features/support/env.rb +0 -6
- data/examples/i18n/no/lib/kalkulator.rb +0 -11
- data/examples/i18n/pl/Rakefile +0 -6
- data/examples/i18n/pl/features/addition.feature +0 -17
- data/examples/i18n/pl/features/division.feature +0 -10
- data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/pl/features/support/env.rb +0 -5
- data/examples/i18n/pl/lib/calculator.rb +0 -14
- data/examples/i18n/pt/Rakefile +0 -6
- data/examples/i18n/pt/features/adicao.feature +0 -11
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
- data/examples/i18n/pt/features/support/env.rb +0 -5
- data/examples/i18n/pt/lib/calculadora.rb +0 -10
- data/examples/i18n/ro/Rakefile +0 -6
- data/examples/i18n/ro/features/adunare.feature +0 -12
- data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -21
- data/examples/i18n/ro/lib/calculator.rb +0 -11
- data/examples/i18n/ru/Rakefile +0 -6
- data/examples/i18n/ru/features/addition.feature +0 -11
- data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
- data/examples/i18n/ru/features/division.feature +0 -16
- data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
- data/examples/i18n/ru/features/support/env.rb +0 -5
- data/examples/i18n/ru/features/support/world.rb +0 -8
- data/examples/i18n/ru/lib/calculator.rb +0 -24
- data/examples/i18n/sk/Rakefile +0 -6
- data/examples/i18n/sk/features/addition.feature +0 -17
- data/examples/i18n/sk/features/division.feature +0 -10
- data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/sk/lib/calculator.rb +0 -14
- data/examples/i18n/sr-Cyrl/Rakefile +0 -6
- data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
- data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
- data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -5
- data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
- data/examples/i18n/sr-Latn/Rakefile +0 -6
- data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
- data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
- data/examples/i18n/sv/Rakefile +0 -6
- data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -24
- data/examples/i18n/sv/features/summering.feature +0 -18
- data/examples/i18n/sv/lib/kalkulator.rb +0 -11
- data/examples/i18n/tr/Rakefile +0 -6
- data/examples/i18n/tr/features/bolme.feature +0 -10
- data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -24
- data/examples/i18n/tr/features/toplama.feature +0 -18
- data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
- data/examples/i18n/uk/Rakefile +0 -6
- data/examples/i18n/uk/features/addition.feature +0 -11
- data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
- data/examples/i18n/uk/features/division.feature +0 -16
- data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
- data/examples/i18n/uk/features/support/env.rb +0 -5
- data/examples/i18n/uk/features/support/world.rb +0 -8
- data/examples/i18n/uk/lib/calculator.rb +0 -24
- data/examples/i18n/uz/Rakefile +0 -6
- data/examples/i18n/uz/features/addition.feature +0 -10
- data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
- data/examples/i18n/uz/features/division.feature +0 -17
- data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
- data/examples/i18n/uz/features/support/env.rb +0 -5
- data/examples/i18n/uz/features/support/world.rb +0 -8
- data/examples/i18n/uz/lib/calculator.rb +0 -24
- data/examples/i18n/zh-CN/Rakefile +0 -4
- data/examples/i18n/zh-CN/features/addition.feature +0 -18
- data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -26
- data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
- data/examples/i18n/zh-TW/Rakefile +0 -4
- data/examples/i18n/zh-TW/features/addition.feature +0 -17
- data/examples/i18n/zh-TW/features/division.feature +0 -11
- data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -24
- data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
- data/examples/rspec_doubles/Rakefile +0 -4
- data/examples/rspec_doubles/features/mocking.feature +0 -9
- data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
- data/examples/rspec_doubles/features/support/env.rb +0 -12
- data/examples/sinatra/README.textile +0 -13
- data/examples/sinatra/Rakefile +0 -6
- data/examples/sinatra/app.rb +0 -14
- data/examples/sinatra/features/add.feature +0 -11
- data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
- data/examples/sinatra/features/support/env.rb +0 -10
- data/examples/sinatra/views/add.erb +0 -7
- data/examples/sinatra/views/layout.erb +0 -8
- data/examples/tcl/README.textile +0 -11
- data/examples/tcl/Rakefile +0 -6
- data/examples/tcl/features/fibonnacci.feature +0 -17
- data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
- data/examples/tcl/features/support/env.rb +0 -6
- data/examples/tcl/src/fib.tcl +0 -3
- data/examples/test_unit/Gemfile +0 -4
- data/examples/test_unit/Rakefile +0 -6
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
- data/examples/test_unit/features/test_unit.feature +0 -9
- data/examples/watir/README.textile +0 -16
- data/examples/watir/Rakefile +0 -12
- data/examples/watir/cucumber.yml +0 -1
- data/examples/watir/features/search.feature +0 -12
- data/examples/watir/features/step_definitions/search_steps.rb +0 -26
- data/examples/watir/features/support/env.rb +0 -35
- data/examples/watir/features/support/screenshots.rb +0 -47
- data/features/docs/api/list_step_defs_as_json.feature +0 -50
- data/features/docs/api/listen_for_events.feature +0 -59
- data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -26
- data/features/docs/cli/backtraces.feature +0 -36
- data/features/docs/cli/dry_run.feature +0 -70
- data/features/docs/cli/exclude_files.feature +0 -18
- data/features/docs/cli/execute_with_tag_filter.feature +0 -117
- data/features/docs/cli/fail_fast.feature +0 -46
- data/features/docs/cli/finding_steps.feature +0 -28
- data/features/docs/cli/help.feature +0 -8
- data/features/docs/cli/randomize.feature +0 -140
- data/features/docs/cli/require.feature +0 -27
- data/features/docs/cli/retry_failing_tests.feature +0 -67
- data/features/docs/cli/run_scenarios_matching_name.feature +0 -104
- data/features/docs/cli/run_specific_scenarios.feature +0 -77
- data/features/docs/cli/showing_differences.feature +0 -43
- data/features/docs/cli/specifying_multiple_formatters.feature +0 -65
- data/features/docs/cli/strict_mode.feature +0 -64
- data/features/docs/defining_steps/nested_steps.feature +0 -177
- data/features/docs/defining_steps/nested_steps_i18n.feature +0 -36
- data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -54
- data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
- data/features/docs/defining_steps/printing_messages.feature +0 -147
- data/features/docs/defining_steps/skip_scenario.feature +0 -30
- data/features/docs/defining_steps/snippets.feature +0 -56
- data/features/docs/defining_steps/table_diffing.feature +0 -50
- data/features/docs/exception_in_after_hook.feature +0 -126
- data/features/docs/exception_in_after_step_hook.feature +0 -102
- data/features/docs/exception_in_around_hook.feature +0 -78
- data/features/docs/exception_in_before_hook.feature +0 -96
- data/features/docs/extending_cucumber/custom_filter.feature +0 -29
- data/features/docs/extending_cucumber/custom_formatter.feature +0 -102
- data/features/docs/formatters/api_methods.feature +0 -37
- data/features/docs/formatters/debug_formatter.feature +0 -47
- data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
- data/features/docs/formatters/html_formatter.feature +0 -91
- data/features/docs/formatters/json_formatter.feature +0 -767
- data/features/docs/formatters/junit_formatter.feature +0 -454
- data/features/docs/formatters/pretty_formatter.feature +0 -73
- data/features/docs/formatters/progress_formatter.feature +0 -31
- data/features/docs/formatters/rerun_formatter.feature +0 -188
- data/features/docs/formatters/summary_formatter.feature +0 -34
- data/features/docs/formatters/usage_formatter.feature +0 -98
- data/features/docs/getting_started.feature +0 -27
- data/features/docs/gherkin/background.feature +0 -548
- data/features/docs/gherkin/doc_strings.feature +0 -74
- data/features/docs/gherkin/expand_option_for_outlines.feature +0 -46
- data/features/docs/gherkin/language_from_header.feature +0 -32
- data/features/docs/gherkin/language_help.feature +0 -42
- data/features/docs/gherkin/outlines.feature +0 -156
- data/features/docs/gherkin/unicode_table.feature +0 -32
- data/features/docs/gherkin/using_descriptions.feature +0 -82
- data/features/docs/gherkin/using_star_notation.feature +0 -37
- data/features/docs/iso-8859-1.feature +0 -6
- data/features/docs/post_configuration_hook.feature +0 -33
- data/features/docs/profiles.feature +0 -120
- data/features/docs/rake_task.feature +0 -141
- data/features/docs/raketask.feature +0 -44
- data/features/docs/work_in_progress.feature +0 -154
- data/features/docs/writing_support_code/after_hooks.feature +0 -102
- data/features/docs/writing_support_code/after_step_hooks.feature +0 -53
- data/features/docs/writing_support_code/around_hooks.feature +0 -260
- data/features/docs/writing_support_code/before_hook.feature +0 -65
- data/features/docs/writing_support_code/hook_order.feature +0 -61
- data/features/docs/writing_support_code/load_path.feature +0 -17
- data/features/docs/writing_support_code/state.feature +0 -32
- data/features/docs/writing_support_code/tagged_hooks.feature +0 -95
- data/features/docs/writing_support_code/transforms.feature +0 -98
- data/features/docs/writing_support_code/world.feature +0 -129
- data/features/lib/step_definitions/aruba_steps.rb +0 -27
- data/features/lib/step_definitions/cli_steps.rb +0 -4
- data/features/lib/step_definitions/cucumber_steps.rb +0 -79
- data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -13
- data/features/lib/step_definitions/json_steps.rb +0 -8
- data/features/lib/step_definitions/junit_steps.rb +0 -14
- data/features/lib/step_definitions/language_steps.rb +0 -9
- data/features/lib/step_definitions/profile_steps.rb +0 -16
- data/features/lib/step_definitions/retry_steps.rb +0 -55
- data/features/lib/step_definitions/ruby_steps.rb +0 -4
- data/features/lib/step_definitions/wire_steps.rb +0 -59
- data/features/lib/support/env.rb +0 -22
- data/features/lib/support/fake_wire_server.rb +0 -81
- data/features/lib/support/feature_factory.rb +0 -68
- data/features/lib/support/normalise_output.rb +0 -51
- data/gem_tasks/contributors.rake +0 -16
- data/gem_tasks/cov.rake +0 -6
- data/gem_tasks/cucumber.rake +0 -26
- data/gem_tasks/downloads.rb +0 -8
- data/gem_tasks/environment.rake +0 -8
- data/gem_tasks/examples.rake +0 -12
- data/gem_tasks/fix_cr_lf.rake +0 -11
- data/gem_tasks/flog.rake +0 -5
- data/gem_tasks/rspec.rake +0 -7
- data/gem_tasks/sass.rake +0 -5
- data/gem_tasks/stats +0 -16
- data/gem_tasks/versions.txt +0 -74
- data/lib/cucumber/core_ext/instance_exec.rb +0 -71
- data/lib/cucumber/formatter/cucumber.css +0 -286
- data/lib/cucumber/formatter/cucumber.sass +0 -247
- data/lib/cucumber/formatter/debug.rb +0 -36
- data/lib/cucumber/formatter/hook_query_visitor.rb +0 -41
- data/lib/cucumber/formatter/html.rb +0 -690
- data/lib/cucumber/formatter/jquery-min.js +0 -154
- data/lib/cucumber/formatter/json_pretty.rb +0 -11
- data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1012
- data/lib/cucumber/formatter/legacy_api/ast.rb +0 -390
- data/lib/cucumber/formatter/legacy_api/results.rb +0 -52
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
- data/lib/cucumber/rb_support/rb_hook.rb +0 -20
- data/lib/cucumber/rb_support/rb_language.rb +0 -227
- data/lib/cucumber/rb_support/rb_step_definition.rb +0 -132
- data/lib/cucumber/rb_support/rb_transform.rb +0 -60
- data/lib/cucumber/rb_support/rb_world.rb +0 -171
- data/lib/cucumber/rb_support/snippet.rb +0 -171
- data/lib/cucumber/step_argument.rb +0 -26
- data/spec/cucumber/cli/configuration_spec.rb +0 -436
- data/spec/cucumber/cli/main_spec.rb +0 -84
- data/spec/cucumber/cli/options_spec.rb +0 -411
- data/spec/cucumber/cli/profile_loader_spec.rb +0 -47
- data/spec/cucumber/cli/rerun_spec.rb +0 -86
- data/spec/cucumber/configuration_spec.rb +0 -148
- data/spec/cucumber/constantize_spec.rb +0 -20
- data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -5
- data/spec/cucumber/file_specs_spec.rb +0 -61
- data/spec/cucumber/filters/activate_steps_spec.rb +0 -152
- data/spec/cucumber/filters/gated_receiver_spec.rb +0 -48
- data/spec/cucumber/filters/retry_spec.rb +0 -85
- data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -39
- data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -58
- data/spec/cucumber/filters/tag_limits_spec.rb +0 -60
- data/spec/cucumber/formatter/ansicolor_spec.rb +0 -33
- data/spec/cucumber/formatter/console_counts_spec.rb +0 -14
- data/spec/cucumber/formatter/debug_spec.rb +0 -65
- data/spec/cucumber/formatter/duration_spec.rb +0 -23
- data/spec/cucumber/formatter/fail_fast_spec.rb +0 -88
- data/spec/cucumber/formatter/html_spec.rb +0 -543
- data/spec/cucumber/formatter/interceptor_spec.rb +0 -137
- data/spec/cucumber/formatter/json_spec.rb +0 -842
- data/spec/cucumber/formatter/junit_spec.rb +0 -253
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2187
- data/spec/cucumber/formatter/pretty_spec.rb +0 -920
- data/spec/cucumber/formatter/progress_spec.rb +0 -170
- data/spec/cucumber/formatter/rerun_spec.rb +0 -97
- data/spec/cucumber/formatter/spec_helper.rb +0 -83
- data/spec/cucumber/hooks_spec.rb +0 -31
- data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -604
- data/spec/cucumber/project_initializer_spec.rb +0 -88
- data/spec/cucumber/rake/forked_spec.rb +0 -54
- data/spec/cucumber/rake/task_spec.rb +0 -86
- data/spec/cucumber/rb_support/rb_language_spec.rb +0 -321
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -200
- data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -47
- data/spec/cucumber/rb_support/rb_world_spec.rb +0 -48
- data/spec/cucumber/rb_support/snippet_spec.rb +0 -138
- data/spec/cucumber/running_test_case_spec.rb +0 -140
- data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -37
- data/spec/cucumber/runtime/support_code_spec.rb +0 -17
- data/spec/cucumber/runtime_spec.rb +0 -21
- data/spec/cucumber/sell_cucumbers.feature +0 -19
- data/spec/cucumber/step_argument_spec.rb +0 -19
- data/spec/cucumber/step_match_search_spec.rb +0 -123
- data/spec/cucumber/step_match_spec.rb +0 -86
- data/spec/cucumber/world/pending_spec.rb +0 -48
- data/spec/spec_helper.rb +0 -30
- data/spec/support/standard_step_actions.rb +0 -19
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'gherkin
|
4
|
-
require 'gherkin/parser'
|
2
|
+
|
3
|
+
require 'gherkin'
|
5
4
|
require 'gherkin/dialect'
|
6
5
|
|
7
6
|
module Cucumber
|
@@ -14,12 +13,23 @@ module Cucumber
|
|
14
13
|
|
15
14
|
def parse(text)
|
16
15
|
dialect = ::Gherkin::Dialect.for(@language)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
gherkin_document = nil
|
17
|
+
messages = ::Gherkin.from_source('dummy', feature_header(dialect) + text, gherkin_options)
|
18
|
+
|
19
|
+
messages.each do |message|
|
20
|
+
gherkin_document = message.gherkin_document.to_hash unless message.gherkin_document.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
@builder.steps(gherkin_document[:feature][:children][0][:scenario][:steps])
|
24
|
+
end
|
21
25
|
|
22
|
-
|
26
|
+
def gherkin_options
|
27
|
+
{
|
28
|
+
default_dialect: @language,
|
29
|
+
include_source: false,
|
30
|
+
include_gherkin_document: true,
|
31
|
+
include_pickles: false
|
32
|
+
}
|
23
33
|
end
|
24
34
|
|
25
35
|
def feature_header(dialect)
|
@@ -1,10 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cucumber/cucumber_expressions/parameter_type'
|
4
|
+
require 'cucumber/deprecate'
|
5
|
+
|
2
6
|
module Cucumber
|
3
|
-
module
|
4
|
-
# This module
|
5
|
-
#
|
6
|
-
|
7
|
-
module RbDsl
|
7
|
+
module Glue
|
8
|
+
# This module provides the methods the DSL you can use to define
|
9
|
+
# steps, hooks, transforms etc.
|
10
|
+
module Dsl
|
8
11
|
class << self
|
9
12
|
attr_writer :rb_language
|
10
13
|
|
@@ -20,8 +23,8 @@ module Cucumber
|
|
20
23
|
@rb_language.register_rb_hook(phase, tag_names, proc)
|
21
24
|
end
|
22
25
|
|
23
|
-
def
|
24
|
-
@rb_language.
|
26
|
+
def define_parameter_type(parameter_type)
|
27
|
+
@rb_language.define_parameter_type(parameter_type)
|
25
28
|
end
|
26
29
|
|
27
30
|
def register_rb_step_definition(regexp, proc_or_sym, options = {})
|
@@ -54,19 +57,19 @@ module Cucumber
|
|
54
57
|
# World(my_module: MyModule)
|
55
58
|
#
|
56
59
|
def World(*world_modules, **namespaced_world_modules, &proc)
|
57
|
-
|
60
|
+
Dsl.build_rb_world_factory(world_modules, namespaced_world_modules, proc)
|
58
61
|
end
|
59
62
|
|
60
63
|
# Registers a proc that will run before each Scenario. You can register as many
|
61
64
|
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
62
65
|
def Before(*tag_expressions, &proc)
|
63
|
-
|
66
|
+
Dsl.register_rb_hook('before', tag_expressions, proc)
|
64
67
|
end
|
65
68
|
|
66
69
|
# Registers a proc that will run after each Scenario. You can register as many
|
67
70
|
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
68
71
|
def After(*tag_expressions, &proc)
|
69
|
-
|
72
|
+
Dsl.register_rb_hook('after', tag_expressions, proc)
|
70
73
|
end
|
71
74
|
|
72
75
|
# Registers a proc that will be wrapped around each scenario. The proc
|
@@ -75,29 +78,39 @@ module Cucumber
|
|
75
78
|
# blocks in 1.8), on which it should call the .call method. You can register
|
76
79
|
# as many as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
77
80
|
def Around(*tag_expressions, &proc)
|
78
|
-
|
81
|
+
Dsl.register_rb_hook('around', tag_expressions, proc)
|
79
82
|
end
|
80
83
|
|
81
84
|
# Registers a proc that will run after each Step. You can register as
|
82
85
|
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
83
86
|
def AfterStep(*tag_expressions, &proc)
|
84
|
-
|
87
|
+
Dsl.register_rb_hook('after_step', tag_expressions, proc)
|
88
|
+
end
|
89
|
+
|
90
|
+
def ParameterType(options)
|
91
|
+
type = options[:type] || Object
|
92
|
+
use_for_snippets = if_nil(options[:use_for_snippets], true)
|
93
|
+
prefer_for_regexp_match = if_nil(options[:prefer_for_regexp_match], false)
|
94
|
+
|
95
|
+
parameter_type = CucumberExpressions::ParameterType.new(
|
96
|
+
options[:name],
|
97
|
+
options[:regexp],
|
98
|
+
type,
|
99
|
+
options[:transformer],
|
100
|
+
use_for_snippets,
|
101
|
+
prefer_for_regexp_match
|
102
|
+
)
|
103
|
+
Dsl.define_parameter_type(parameter_type)
|
85
104
|
end
|
86
105
|
|
87
|
-
|
88
|
-
|
89
|
-
# the pattern contains captures then they will be yielded as arguments to the
|
90
|
-
# provided proc. The return value of the proc is consequently yielded to the
|
91
|
-
# step definition.
|
92
|
-
def Transform(regexp, &proc)
|
93
|
-
RbDsl.register_rb_transform(regexp, proc)
|
106
|
+
def if_nil(value, default)
|
107
|
+
value.nil? ? default : value
|
94
108
|
end
|
95
109
|
|
96
110
|
# Registers a proc that will run after Cucumber is configured. You can register as
|
97
111
|
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
98
|
-
# TODO: Deprecate this
|
99
112
|
def AfterConfiguration(&proc)
|
100
|
-
|
113
|
+
Dsl.register_rb_hook('after_configuration', [], proc)
|
101
114
|
end
|
102
115
|
|
103
116
|
# Registers a new Ruby StepDefinition. This method is aliased
|
@@ -117,10 +130,11 @@ module Cucumber
|
|
117
130
|
# the context of the <tt>World</tt> object.
|
118
131
|
def register_rb_step_definition(regexp, symbol = nil, options = {}, &proc)
|
119
132
|
proc_or_sym = symbol || proc
|
120
|
-
|
133
|
+
Dsl.register_rb_step_definition(regexp, proc_or_sym, options)
|
121
134
|
end
|
122
135
|
end
|
123
136
|
end
|
124
137
|
end
|
125
138
|
|
126
|
-
|
139
|
+
# TODO: can we avoid adding methods to the global namespace (Kernel)
|
140
|
+
extend(Cucumber::Glue::Dsl) # rubocop:disable Style/MixinUsage
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cucumber/glue/invoke_in_world'
|
4
|
+
|
5
|
+
module Cucumber
|
6
|
+
module Glue
|
7
|
+
# TODO: Kill pointless wrapper for Before, After and AfterStep hooks with fire
|
8
|
+
class Hook
|
9
|
+
attr_reader :id, :tag_expressions, :location
|
10
|
+
|
11
|
+
def initialize(id, registry, tag_expressions, proc)
|
12
|
+
@id = id
|
13
|
+
@registry = registry
|
14
|
+
@tag_expressions = sanitize_tag_expressions(tag_expressions)
|
15
|
+
@proc = proc
|
16
|
+
@location = Cucumber::Core::Test::Location.from_source_location(*@proc.source_location)
|
17
|
+
fail_for_old_style_tag_expressions(@tag_expressions)
|
18
|
+
end
|
19
|
+
|
20
|
+
def invoke(pseudo_method, arguments, &block)
|
21
|
+
check_arity = false
|
22
|
+
InvokeInWorld.cucumber_instance_exec_in(
|
23
|
+
@registry.current_world,
|
24
|
+
check_arity,
|
25
|
+
pseudo_method,
|
26
|
+
*[arguments, block].flatten.compact,
|
27
|
+
&@proc
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_envelope
|
32
|
+
Cucumber::Messages::Envelope.new(
|
33
|
+
hook: Cucumber::Messages::Hook.new(
|
34
|
+
id: id,
|
35
|
+
tag_expression: tag_expressions.join(' '),
|
36
|
+
source_reference: Cucumber::Messages::SourceReference.new(
|
37
|
+
uri: location.file,
|
38
|
+
location: Cucumber::Messages::Location.new(
|
39
|
+
line: location.lines.first
|
40
|
+
)
|
41
|
+
)
|
42
|
+
)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def sanitize_tag_expressions(tag_expressions)
|
49
|
+
# TODO: remove when '~@no-clobber' has been changed to 'not @no-clobber' in aruba
|
50
|
+
tag_expressions.map { |tag_expression| tag_expression == '~@no-clobber' ? 'not @no-clobber' : tag_expression }
|
51
|
+
end
|
52
|
+
|
53
|
+
def fail_for_old_style_tag_expressions(tag_expressions)
|
54
|
+
tag_expressions.each do |tag_expression|
|
55
|
+
if tag_expression.include?('~')
|
56
|
+
raise("Found tagged hook with '#{tag_expression}'." \
|
57
|
+
"'~@tag' is no longer supported, use 'not @tag' instead.")
|
58
|
+
end
|
59
|
+
|
60
|
+
next unless tag_expression.include?(',')
|
61
|
+
warn("Found tagged hook with '#{tag_expression}'." \
|
62
|
+
"'@tag1,@tag2' is no longer supported, use '@tag or @tag2' instead.")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cucumber/platform'
|
4
|
+
module Cucumber
|
5
|
+
module Glue
|
6
|
+
# Utility methods for executing step definitions with nice backtraces etc.
|
7
|
+
# TODO: add unit tests
|
8
|
+
# TODO: refactor for readability
|
9
|
+
class InvokeInWorld
|
10
|
+
def self.replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
|
11
|
+
return if Cucumber.use_full_backtrace
|
12
|
+
|
13
|
+
instance_exec_pos = backtrace.index(instance_exec_invocation_line)
|
14
|
+
return unless instance_exec_pos
|
15
|
+
replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
|
16
|
+
backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
|
17
|
+
|
18
|
+
depth = backtrace.count { |line| line == instance_exec_invocation_line }
|
19
|
+
end_pos = depth > 1 ? instance_exec_pos : -1
|
20
|
+
|
21
|
+
backtrace[replacement_line + 1..end_pos] = nil
|
22
|
+
backtrace.compact!
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.cucumber_instance_exec_in(world, check_arity, pseudo_method, *args, &block)
|
26
|
+
cucumber_run_with_backtrace_filtering(pseudo_method) do
|
27
|
+
if check_arity && !cucumber_compatible_arity?(args, block)
|
28
|
+
world.instance_exec do
|
29
|
+
ari = block.arity
|
30
|
+
ari = ari < 0 ? (ari.abs - 1).to_s + '+' : ari
|
31
|
+
s1 = ari == 1 ? '' : 's'
|
32
|
+
s2 = args.length == 1 ? '' : 's'
|
33
|
+
raise ArityMismatchError, "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
|
34
|
+
end
|
35
|
+
else
|
36
|
+
world.instance_exec(*args, &block)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.cucumber_compatible_arity?(args, block)
|
42
|
+
return true if block.arity == args.length
|
43
|
+
if block.arity < 0
|
44
|
+
return true if args.length >= (block.arity.abs - 1)
|
45
|
+
end
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.cucumber_run_with_backtrace_filtering(pseudo_method)
|
50
|
+
yield
|
51
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
52
|
+
instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
|
53
|
+
replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
|
54
|
+
raise e
|
55
|
+
end
|
56
|
+
|
57
|
+
INSTANCE_EXEC_OFFSET = -3
|
58
|
+
end
|
59
|
+
|
60
|
+
# Raised if the number of a StepDefinition's Regexp match groups
|
61
|
+
# is different from the number of Proc arguments.
|
62
|
+
class ArityMismatchError < StandardError
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,231 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cucumber/gherkin/formatter/ansi_escapes'
|
4
|
+
require 'cucumber/core/test/data_table'
|
5
|
+
require 'cucumber/deprecate'
|
6
|
+
|
7
|
+
module Cucumber
|
8
|
+
module Glue
|
9
|
+
# Defines the basic API methods availlable in all Cucumber step definitions.
|
10
|
+
#
|
11
|
+
# You can, and probably should, extend this API with your own methods that
|
12
|
+
# make sense in your domain. For more on that, see {Cucumber::Glue::Dsl#World}
|
13
|
+
module ProtoWorld
|
14
|
+
# Run a single Gherkin step
|
15
|
+
# @example Call another step
|
16
|
+
# step "I am logged in"
|
17
|
+
# @example Call a step with quotes in the name
|
18
|
+
# step %{the user "Dave" is logged in}
|
19
|
+
# @example Passing a table
|
20
|
+
# step "the following users exist:", table(%{
|
21
|
+
# | name | email |
|
22
|
+
# | Matt | matt@matt.com |
|
23
|
+
# | Aslak | aslak@aslak.com |
|
24
|
+
# })
|
25
|
+
# @example Passing a multiline string
|
26
|
+
# step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
|
27
|
+
# @param [String] name The name of the step
|
28
|
+
# @param [String,Cucumber::Test::DocString,Cucumber::Ast::Table] multiline_argument
|
29
|
+
def step(name, raw_multiline_arg = nil)
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
# Run a snippet of Gherkin
|
34
|
+
# @example
|
35
|
+
# steps %{
|
36
|
+
# Given the user "Susan" exists
|
37
|
+
# And I am logged in as "Susan"
|
38
|
+
# }
|
39
|
+
# @param [String] steps_text The Gherkin snippet to run
|
40
|
+
def steps(steps_text)
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
# Parse Gherkin into a {Cucumber::Ast::Table} object.
|
45
|
+
#
|
46
|
+
# Useful in conjunction with the #step method.
|
47
|
+
# @example Create a table
|
48
|
+
# users = table(%{
|
49
|
+
# | name | email |
|
50
|
+
# | Matt | matt@matt.com |
|
51
|
+
# | Aslak | aslak@aslak.com |
|
52
|
+
# })
|
53
|
+
# @param [String] text_or_table The Gherkin string that represents the table
|
54
|
+
# Returns a Cucumber::MultilineArgument::DataTable for +text_or_table+, which can either
|
55
|
+
# be a String:
|
56
|
+
#
|
57
|
+
# table(%{
|
58
|
+
# | account | description | amount |
|
59
|
+
# | INT-100 | Taxi | 114 |
|
60
|
+
# | CUC-101 | Peeler | 22 |
|
61
|
+
# })
|
62
|
+
#
|
63
|
+
# or a 2D Array:
|
64
|
+
#
|
65
|
+
# table([
|
66
|
+
# %w{ account description amount },
|
67
|
+
# %w{ INT-100 Taxi 114 },
|
68
|
+
# %w{ CUC-101 Peeler 22 }
|
69
|
+
# ])
|
70
|
+
#
|
71
|
+
def table(text_or_table)
|
72
|
+
MultilineArgument::DataTable.from(text_or_table)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Print a message to the output.
|
76
|
+
#
|
77
|
+
# @note Cucumber might surprise you with the behaviour of this method. Instead
|
78
|
+
# of sending the output directly to STDOUT, Cucumber will intercept and cache
|
79
|
+
# the message until the current step has finished, and then display it.
|
80
|
+
#
|
81
|
+
# If you'd prefer to see the message immediately, call {Kernel.puts} instead.
|
82
|
+
def puts(*messages)
|
83
|
+
Cucumber.deprecate(
|
84
|
+
'Messages emitted with "puts" will no longer be caught by Cucumber ' \
|
85
|
+
'and sent to the formatter. If you want message to be in the formatted output, ' \
|
86
|
+
"please use log(message) instead.\n" \
|
87
|
+
'If you simply want it in the console, '\
|
88
|
+
'keep using "puts" (or Kernel.puts to avoid this message)',
|
89
|
+
'puts(message)',
|
90
|
+
'5.0.0'
|
91
|
+
)
|
92
|
+
messages.each { |message| log(message.to_s) }
|
93
|
+
end
|
94
|
+
|
95
|
+
# Pause the tests and ask the operator for input
|
96
|
+
def ask(question, timeout_seconds = 60)
|
97
|
+
super
|
98
|
+
end
|
99
|
+
|
100
|
+
# Embed an image in the output
|
101
|
+
def embed(file, mime_type, _label = 'Screenshot')
|
102
|
+
Cucumber.deprecate(
|
103
|
+
'Please use attach(file, media_type) instead',
|
104
|
+
'embed(file, mime_type, label)',
|
105
|
+
'5.0.0'
|
106
|
+
)
|
107
|
+
attach(file, mime_type)
|
108
|
+
end
|
109
|
+
|
110
|
+
def log(message)
|
111
|
+
raise Cucumber::LogTypeInvalid unless message.is_a?(String)
|
112
|
+
attach(message.dup, 'text/x.cucumber.log+plain')
|
113
|
+
end
|
114
|
+
|
115
|
+
def attach(file, media_type)
|
116
|
+
super
|
117
|
+
end
|
118
|
+
|
119
|
+
# Mark the matched step as pending.
|
120
|
+
def pending(message = 'TODO')
|
121
|
+
raise Pending, message unless block_given?
|
122
|
+
|
123
|
+
begin
|
124
|
+
yield
|
125
|
+
rescue Exception # rubocop:disable Lint/RescueException
|
126
|
+
raise Pending, message
|
127
|
+
end
|
128
|
+
raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
|
129
|
+
end
|
130
|
+
|
131
|
+
# Skips this step and the remaining steps in the scenario
|
132
|
+
def skip_this_scenario(message = 'Scenario skipped')
|
133
|
+
raise Core::Test::Result::Skipped, message
|
134
|
+
end
|
135
|
+
|
136
|
+
# Prints the list of modules that are included in the World
|
137
|
+
def inspect
|
138
|
+
super
|
139
|
+
end
|
140
|
+
|
141
|
+
# see {#inspect}
|
142
|
+
def to_s
|
143
|
+
inspect
|
144
|
+
end
|
145
|
+
|
146
|
+
# Dynamially generate the API module, closuring the dependencies
|
147
|
+
def self.for(runtime, language) # rubocop:disable Metrics/MethodLength
|
148
|
+
Module.new do # rubocop:disable Metrics/BlockLength
|
149
|
+
def self.extended(object)
|
150
|
+
# wrap the dynamically generated module so that we can document the methods
|
151
|
+
# for yardoc, which doesn't like define_method.
|
152
|
+
object.extend(ProtoWorld)
|
153
|
+
end
|
154
|
+
|
155
|
+
# TODO: pass these in when building the module, instead of mutating them later
|
156
|
+
# Extend the World with user-defined modules
|
157
|
+
def add_modules!(world_modules, namespaced_world_modules)
|
158
|
+
add_world_modules!(world_modules)
|
159
|
+
add_namespaced_modules!(namespaced_world_modules)
|
160
|
+
end
|
161
|
+
|
162
|
+
define_method(:step) do |name, raw_multiline_arg = nil|
|
163
|
+
location = Core::Test::Location.of_caller
|
164
|
+
runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
|
165
|
+
end
|
166
|
+
|
167
|
+
define_method(:steps) do |steps_text|
|
168
|
+
location = Core::Test::Location.of_caller
|
169
|
+
runtime.invoke_dynamic_steps(steps_text, language, location)
|
170
|
+
end
|
171
|
+
|
172
|
+
define_method(:ask) do |question, timeout_seconds = 60|
|
173
|
+
runtime.ask(question, timeout_seconds)
|
174
|
+
end
|
175
|
+
|
176
|
+
define_method(:attach) do |file, media_type|
|
177
|
+
runtime.attach(file, media_type)
|
178
|
+
end
|
179
|
+
|
180
|
+
# Prints the list of modules that are included in the World
|
181
|
+
def inspect
|
182
|
+
modules = [self.class]
|
183
|
+
(class << self; self; end).instance_eval do
|
184
|
+
modules += included_modules
|
185
|
+
end
|
186
|
+
modules << stringify_namespaced_modules
|
187
|
+
format('#<%<modules>s:0x%<object_id>x>', modules: modules.join('+'), object_id: object_id)
|
188
|
+
end
|
189
|
+
|
190
|
+
private
|
191
|
+
|
192
|
+
# @private
|
193
|
+
def add_world_modules!(modules)
|
194
|
+
modules.each do |world_module|
|
195
|
+
extend(world_module)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
# @private
|
200
|
+
def add_namespaced_modules!(modules)
|
201
|
+
@__namespaced_modules = modules
|
202
|
+
modules.each do |namespace, world_modules|
|
203
|
+
world_modules.each do |world_module|
|
204
|
+
variable_name = "@__#{namespace}_world"
|
205
|
+
|
206
|
+
inner_world = if self.class.respond_to?(namespace)
|
207
|
+
instance_variable_get(variable_name)
|
208
|
+
else
|
209
|
+
Object.new
|
210
|
+
end
|
211
|
+
instance_variable_set(variable_name,
|
212
|
+
inner_world.extend(world_module))
|
213
|
+
self.class.send(:define_method, namespace) do
|
214
|
+
instance_variable_get(variable_name)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# @private
|
221
|
+
def stringify_namespaced_modules
|
222
|
+
@__namespaced_modules.map { |k, v| "#{v.join(',')} (as #{k})" }.join('+')
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# @private
|
228
|
+
AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|