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
@@ -0,0 +1,21 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module Glue
|
3
|
+
class WorldFactory
|
4
|
+
def initialize(proc)
|
5
|
+
@proc = proc || -> { Object.new }
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_world
|
9
|
+
@proc.call || raise_nil_world
|
10
|
+
end
|
11
|
+
|
12
|
+
def raise_nil_world
|
13
|
+
raise NilWorld
|
14
|
+
rescue NilWorld => e
|
15
|
+
e.backtrace.clear
|
16
|
+
e.backtrace.push(Glue.backtrace_line(@proc, 'World'))
|
17
|
+
raise e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/cucumber/hooks.rb
CHANGED
@@ -1,38 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'pathname'
|
3
|
-
require 'cucumber/core/
|
4
|
+
require 'cucumber/core/test/location'
|
4
5
|
require 'cucumber/core/test/around_hook'
|
5
6
|
|
6
7
|
module Cucumber
|
7
|
-
|
8
8
|
# Hooks quack enough like `Cucumber::Core::Ast` source nodes that we can use them as
|
9
9
|
# source for test steps
|
10
10
|
module Hooks
|
11
|
-
|
12
11
|
class << self
|
13
|
-
def before_hook(
|
14
|
-
build_hook_step(
|
12
|
+
def before_hook(id, location, &block)
|
13
|
+
build_hook_step(id, location, block, BeforeHook, Core::Test::UnskippableAction)
|
15
14
|
end
|
16
15
|
|
17
|
-
def after_hook(
|
18
|
-
build_hook_step(
|
16
|
+
def after_hook(id, location, &block)
|
17
|
+
build_hook_step(id, location, block, AfterHook, Core::Test::UnskippableAction)
|
19
18
|
end
|
20
19
|
|
21
|
-
def after_step_hook(
|
22
|
-
raise ArgumentError
|
23
|
-
build_hook_step(
|
20
|
+
def after_step_hook(id, test_step, location, &block)
|
21
|
+
raise ArgumentError if test_step.hook?
|
22
|
+
build_hook_step(id, location, block, AfterStepHook, Core::Test::Action)
|
24
23
|
end
|
25
24
|
|
26
|
-
def around_hook(
|
25
|
+
def around_hook(&block)
|
27
26
|
Core::Test::AroundHook.new(&block)
|
28
27
|
end
|
29
28
|
|
30
29
|
private
|
31
30
|
|
32
|
-
def build_hook_step(
|
31
|
+
def build_hook_step(id, location, block, hook_type, action_type)
|
33
32
|
action = action_type.new(location, &block)
|
34
33
|
hook = hook_type.new(action.location)
|
35
|
-
Core::Test::
|
34
|
+
Core::Test::HookStep.new(id, hook.text, location, action)
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
@@ -43,8 +42,12 @@ module Cucumber
|
|
43
42
|
@location = location
|
44
43
|
end
|
45
44
|
|
46
|
-
def
|
47
|
-
|
45
|
+
def text
|
46
|
+
'After hook'
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"#{text} at #{location}"
|
48
51
|
end
|
49
52
|
|
50
53
|
def match_locations?(queried_locations)
|
@@ -63,8 +66,12 @@ module Cucumber
|
|
63
66
|
@location = location
|
64
67
|
end
|
65
68
|
|
66
|
-
def
|
67
|
-
|
69
|
+
def text
|
70
|
+
'Before hook'
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_s
|
74
|
+
"#{text} at #{location}"
|
68
75
|
end
|
69
76
|
|
70
77
|
def match_locations?(queried_locations)
|
@@ -83,8 +90,12 @@ module Cucumber
|
|
83
90
|
@location = location
|
84
91
|
end
|
85
92
|
|
86
|
-
def
|
87
|
-
|
93
|
+
def text
|
94
|
+
'AfterStep hook'
|
95
|
+
end
|
96
|
+
|
97
|
+
def to_s
|
98
|
+
"#{text} at #{location}"
|
88
99
|
end
|
89
100
|
|
90
101
|
def match_locations?(queried_locations)
|
@@ -95,6 +106,5 @@ module Cucumber
|
|
95
106
|
visitor.after_step_hook(self, *args)
|
96
107
|
end
|
97
108
|
end
|
98
|
-
|
99
109
|
end
|
100
110
|
end
|
data/lib/cucumber/load_path.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'delegate'
|
3
4
|
require 'cucumber/multiline_argument/data_table'
|
4
5
|
require 'cucumber/multiline_argument/doc_string'
|
5
6
|
|
6
7
|
module Cucumber
|
7
8
|
module MultilineArgument
|
8
|
-
|
9
9
|
class << self
|
10
10
|
def from_core(node)
|
11
11
|
builder.wrap(node)
|
12
12
|
end
|
13
13
|
|
14
|
-
def from(argument, location=nil)
|
15
|
-
location ||= Core::
|
14
|
+
def from(argument, location = nil, content_type = nil)
|
15
|
+
location ||= Core::Test::Location.of_caller
|
16
16
|
case argument
|
17
17
|
when String
|
18
|
-
doc_string(argument,
|
18
|
+
builder.doc_string(Core::Test::DocString.new(argument, content_type))
|
19
19
|
when Array
|
20
20
|
location = location.on_line(argument.first.line..argument.last.line)
|
21
|
-
data_table(argument.map
|
21
|
+
builder.data_table(argument.map(&:cells), location)
|
22
22
|
when DataTable, DocString, None
|
23
23
|
argument
|
24
24
|
when nil
|
@@ -28,14 +28,6 @@ module Cucumber
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
def doc_string(argument, content_type, location)
|
32
|
-
builder.doc_string(Core::Ast::DocString.new(argument, content_type, location))
|
33
|
-
end
|
34
|
-
|
35
|
-
def data_table(data, location)
|
36
|
-
builder.data_table(Core::Ast::DataTable.new(data, location))
|
37
|
-
end
|
38
|
-
|
39
31
|
private
|
40
32
|
|
41
33
|
def builder
|
@@ -49,22 +41,20 @@ module Cucumber
|
|
49
41
|
@result
|
50
42
|
end
|
51
43
|
|
52
|
-
def doc_string(node, *
|
44
|
+
def doc_string(node, *_args)
|
53
45
|
@result = DocString.new(node)
|
54
46
|
end
|
55
47
|
|
56
|
-
def data_table(node, *
|
48
|
+
def data_table(node, *_args)
|
57
49
|
@result = DataTable.new(node)
|
58
50
|
end
|
59
51
|
end
|
60
52
|
end
|
61
53
|
|
62
54
|
class None
|
63
|
-
def append_to(array)
|
64
|
-
end
|
55
|
+
def append_to(array); end
|
65
56
|
|
66
|
-
def describe_to(visitor)
|
67
|
-
end
|
57
|
+
def describe_to(visitor); end
|
68
58
|
end
|
69
59
|
end
|
70
60
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'forwardable'
|
3
4
|
require 'cucumber/gherkin/data_table_parser'
|
4
5
|
require 'cucumber/gherkin/formatter/escaping'
|
5
|
-
require 'cucumber/
|
6
|
+
require 'cucumber/multiline_argument/data_table/diff_matrices'
|
6
7
|
|
7
8
|
module Cucumber
|
8
9
|
module MultilineArgument
|
@@ -26,72 +27,62 @@ module Cucumber
|
|
26
27
|
# This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
|
27
28
|
#
|
28
29
|
class DataTable
|
29
|
-
|
30
|
-
|
31
|
-
super("Tables were not identical:\n#{table}")
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class Builder
|
36
|
-
attr_reader :rows
|
37
|
-
|
38
|
-
def initialize
|
39
|
-
@rows = []
|
40
|
-
end
|
41
|
-
|
42
|
-
def row(row)
|
43
|
-
@rows << row
|
44
|
-
end
|
45
|
-
|
46
|
-
def eof
|
47
|
-
end
|
30
|
+
def self.default_arg_name #:nodoc:
|
31
|
+
'table'
|
48
32
|
end
|
49
33
|
|
50
|
-
|
51
|
-
|
52
|
-
extend Forwardable
|
53
|
-
|
54
|
-
NULL_CONVERSIONS = Hash.new({ :strict => false, :proc => lambda{ |cell_value| cell_value } }).freeze
|
55
|
-
|
56
|
-
attr_accessor :file
|
57
|
-
def_delegator :@ast_table, :location
|
58
|
-
|
59
|
-
def self.default_arg_name #:nodoc:
|
60
|
-
"table"
|
34
|
+
def describe_to(visitor, *args)
|
35
|
+
visitor.legacy_table(self, *args)
|
61
36
|
end
|
62
37
|
|
63
38
|
class << self
|
64
|
-
def from(data
|
39
|
+
def from(data)
|
65
40
|
case data
|
66
41
|
when Array
|
67
|
-
from_array(data
|
42
|
+
from_array(data)
|
68
43
|
when String
|
69
|
-
parse(data
|
44
|
+
parse(data)
|
70
45
|
else
|
71
|
-
raise ArgumentError,
|
46
|
+
raise ArgumentError, 'expected data to be a String or an Array.'
|
72
47
|
end
|
73
48
|
end
|
74
49
|
|
75
50
|
private
|
76
|
-
|
51
|
+
|
52
|
+
def parse(text)
|
77
53
|
builder = Builder.new
|
78
54
|
parser = Cucumber::Gherkin::DataTableParser.new(builder)
|
79
55
|
parser.parse(text)
|
80
|
-
from_array(builder.rows
|
56
|
+
from_array(builder.rows)
|
81
57
|
end
|
82
58
|
|
83
|
-
def from_array(data
|
84
|
-
new Core::
|
59
|
+
def from_array(data)
|
60
|
+
new Core::Test::DataTable.new(data)
|
85
61
|
end
|
86
62
|
end
|
87
63
|
|
64
|
+
class Builder
|
65
|
+
attr_reader :rows
|
66
|
+
|
67
|
+
def initialize
|
68
|
+
@rows = []
|
69
|
+
end
|
70
|
+
|
71
|
+
def row(row)
|
72
|
+
@rows << row
|
73
|
+
end
|
74
|
+
|
75
|
+
def eof; end
|
76
|
+
end
|
77
|
+
|
78
|
+
NULL_CONVERSIONS = Hash.new(strict: false, proc: ->(cell_value) { cell_value }).freeze
|
88
79
|
|
89
|
-
# @param data [Core::
|
80
|
+
# @param data [Core::Test::DataTable] the data for the table
|
90
81
|
# @param conversion_procs [Hash] see map_columns!
|
91
82
|
# @param header_mappings [Hash] see map_headers!
|
92
83
|
# @param header_conversion_proc [Proc] see map_headers!
|
93
84
|
def initialize(data, conversion_procs = NULL_CONVERSIONS.dup, header_mappings = {}, header_conversion_proc = nil)
|
94
|
-
raise ArgumentError,
|
85
|
+
raise ArgumentError, 'data must be a Core::Test::DataTable' unless data.is_a? Core::Test::DataTable
|
95
86
|
ast_table = data
|
96
87
|
# Verify that it's square
|
97
88
|
ast_table.transpose
|
@@ -110,11 +101,17 @@ module Cucumber
|
|
110
101
|
dup
|
111
102
|
end
|
112
103
|
|
104
|
+
attr_accessor :file
|
105
|
+
|
106
|
+
def location
|
107
|
+
@ast_table.location
|
108
|
+
end
|
109
|
+
|
113
110
|
# Creates a copy of this table, inheriting any column and header mappings
|
114
111
|
# registered with #map_column! and #map_headers!.
|
115
112
|
#
|
116
113
|
def dup
|
117
|
-
self.class.new(Core::
|
114
|
+
self.class.new(Core::Test::DataTable.new(raw), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
|
118
115
|
end
|
119
116
|
|
120
117
|
# Returns a new, transposed table. Example:
|
@@ -129,7 +126,7 @@ module Cucumber
|
|
129
126
|
# | 4 | 2 |
|
130
127
|
#
|
131
128
|
def transpose
|
132
|
-
self.class.new(Core::
|
129
|
+
self.class.new(Core::Test::DataTable.new(raw.transpose), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
|
133
130
|
end
|
134
131
|
|
135
132
|
# Converts this table into an Array of Hash where the keys of each
|
@@ -162,8 +159,10 @@ module Cucumber
|
|
162
159
|
# [{:foo => '2', :bar => '3', :foo_bar => '5'}, {:foo => '7', :bar => '9', :foo_bar => '16'}]
|
163
160
|
#
|
164
161
|
def symbolic_hashes
|
165
|
-
@
|
166
|
-
|
162
|
+
@symbolic_hashes ||=
|
163
|
+
hashes.map do |string_hash|
|
164
|
+
Hash[string_hash.map { |a, b| [symbolize_key(a), b] }]
|
165
|
+
end
|
167
166
|
end
|
168
167
|
|
169
168
|
# Converts this table into a Hash where the first column is
|
@@ -181,7 +180,7 @@ module Cucumber
|
|
181
180
|
def rows_hash
|
182
181
|
return @rows_hash if @rows_hash
|
183
182
|
verify_table_width(2)
|
184
|
-
@rows_hash =
|
183
|
+
@rows_hash = transpose.hashes[0]
|
185
184
|
end
|
186
185
|
|
187
186
|
# Gets the raw data of this table. For example, a Table built from
|
@@ -196,14 +195,12 @@ module Cucumber
|
|
196
195
|
#
|
197
196
|
def raw
|
198
197
|
cell_matrix.map do |row|
|
199
|
-
row.map
|
200
|
-
cell.value
|
201
|
-
end
|
198
|
+
row.map(&:value)
|
202
199
|
end
|
203
200
|
end
|
204
201
|
|
205
202
|
def column_names #:nodoc:
|
206
|
-
@
|
203
|
+
@column_names ||= cell_matrix[0].map(&:value)
|
207
204
|
end
|
208
205
|
|
209
206
|
def rows
|
@@ -263,7 +260,7 @@ module Cucumber
|
|
263
260
|
# table.hashes.keys
|
264
261
|
# # => ['phone number', 'ADDRESS']
|
265
262
|
#
|
266
|
-
def map_headers!(mappings={}, &block)
|
263
|
+
def map_headers!(mappings = {}, &block)
|
267
264
|
# TODO: Remove this method for 2.0
|
268
265
|
clear_cache!
|
269
266
|
@header_mappings = mappings
|
@@ -271,8 +268,8 @@ module Cucumber
|
|
271
268
|
end
|
272
269
|
|
273
270
|
# Returns a new Table where the headers are redefined. See #map_headers!
|
274
|
-
def map_headers(mappings={}, &block)
|
275
|
-
self.class.new(Core::
|
271
|
+
def map_headers(mappings = {}, &block)
|
272
|
+
self.class.new(Core::Test::DataTable.new(raw), @conversion_procs.dup, mappings, block)
|
276
273
|
end
|
277
274
|
|
278
275
|
# Change how #hashes converts column values. The +column_name+ argument identifies the column
|
@@ -287,17 +284,17 @@ module Cucumber
|
|
287
284
|
# end
|
288
285
|
# end
|
289
286
|
#
|
290
|
-
def map_column!(column_name, strict=true, &conversion_proc)
|
287
|
+
def map_column!(column_name, strict = true, &conversion_proc)
|
291
288
|
# TODO: Remove this method for 2.0
|
292
|
-
@conversion_procs[column_name.to_s] = { :
|
289
|
+
@conversion_procs[column_name.to_s] = { strict: strict, proc: conversion_proc }
|
293
290
|
self
|
294
291
|
end
|
295
292
|
|
296
293
|
# Returns a new Table with an additional column mapping. See #map_column!
|
297
|
-
def map_column(column_name, strict=true, &conversion_proc)
|
294
|
+
def map_column(column_name, strict = true, &conversion_proc)
|
298
295
|
conversion_procs = @conversion_procs.dup
|
299
|
-
conversion_procs[column_name.to_s] = { :
|
300
|
-
self.class.new(Core::
|
296
|
+
conversion_procs[column_name.to_s] = { strict: strict, proc: conversion_proc }
|
297
|
+
self.class.new(Core::Test::DataTable.new(raw), conversion_procs, @header_mappings.dup, @header_conversion_proc)
|
301
298
|
end
|
302
299
|
|
303
300
|
# Compares +other_table+ to self. If +other_table+ contains columns
|
@@ -336,86 +333,32 @@ module Cucumber
|
|
336
333
|
# Calling this method is particularly useful in <tt>Then</tt> steps that take
|
337
334
|
# a Table argument, if you want to compare that table to some actual values.
|
338
335
|
#
|
339
|
-
def diff!(other_table, options={})
|
340
|
-
options = {
|
341
|
-
:missing_row => true,
|
342
|
-
:surplus_row => true,
|
343
|
-
:missing_col => true,
|
344
|
-
:surplus_col => false,
|
345
|
-
:misplaced_col => false
|
346
|
-
}.merge(options)
|
347
|
-
|
336
|
+
def diff!(other_table, options = {})
|
348
337
|
other_table = ensure_table(other_table)
|
349
338
|
other_table.convert_headers!
|
350
339
|
other_table.convert_columns!
|
351
|
-
ensure_green!
|
352
340
|
|
353
341
|
convert_headers!
|
354
342
|
convert_columns!
|
355
343
|
|
356
|
-
|
357
|
-
|
358
|
-
padded_width = cell_matrix[0].length
|
359
|
-
|
360
|
-
missing_col = cell_matrix[0].detect{|cell| cell.status == :undefined}
|
361
|
-
surplus_col = padded_width > original_width
|
362
|
-
misplaced_col = cell_matrix[0] != other_table.cell_matrix[0]
|
363
|
-
|
364
|
-
require_diff_lcs
|
365
|
-
cell_matrix.extend(Diff::LCS)
|
366
|
-
changes = cell_matrix.diff(other_table_cell_matrix).flatten
|
367
|
-
|
368
|
-
inserted = 0
|
369
|
-
missing = 0
|
370
|
-
|
371
|
-
row_indices = Array.new(other_table_cell_matrix.length) {|n| n}
|
372
|
-
|
373
|
-
last_change = nil
|
374
|
-
missing_row_pos = nil
|
375
|
-
insert_row_pos = nil
|
376
|
-
|
377
|
-
changes.each do |change|
|
378
|
-
if(change.action == '-')
|
379
|
-
missing_row_pos = change.position + inserted
|
380
|
-
cell_matrix[missing_row_pos].each{|cell| cell.status = :undefined}
|
381
|
-
row_indices.insert(missing_row_pos, nil)
|
382
|
-
missing += 1
|
383
|
-
else # '+'
|
384
|
-
insert_row_pos = change.position + missing
|
385
|
-
inserted_row = change.element
|
386
|
-
inserted_row.each{|cell| cell.status = :comment}
|
387
|
-
cell_matrix.insert(insert_row_pos, inserted_row)
|
388
|
-
row_indices[insert_row_pos] = nil
|
389
|
-
inspect_rows(cell_matrix[missing_row_pos], inserted_row) if last_change && last_change.action == '-'
|
390
|
-
inserted += 1
|
391
|
-
end
|
392
|
-
last_change = change
|
393
|
-
end
|
344
|
+
DiffMatrices.new(cell_matrix, other_table.cell_matrix, options).call
|
345
|
+
end
|
394
346
|
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
surplus_cell = other_row[col_index]
|
401
|
-
row[col_index].value = surplus_cell.value if row[col_index]
|
402
|
-
end
|
403
|
-
end
|
347
|
+
class Different < StandardError
|
348
|
+
attr_reader :table
|
349
|
+
def initialize(table)
|
350
|
+
@table = table
|
351
|
+
super("Tables were not identical:\n#{table}")
|
404
352
|
end
|
353
|
+
end
|
405
354
|
|
406
|
-
|
407
|
-
|
408
|
-
missing_row_pos && options[:missing_row] ||
|
409
|
-
insert_row_pos && options[:surplus_row] ||
|
410
|
-
missing_col && options[:missing_col] ||
|
411
|
-
surplus_col && options[:surplus_col] ||
|
412
|
-
misplaced_col && options[:misplaced_col]
|
413
|
-
raise Different.new(self) if should_raise
|
355
|
+
def to_hash
|
356
|
+
cells_rows.map { |cells| cells.map(&:value) }
|
414
357
|
end
|
415
358
|
|
416
|
-
def
|
417
|
-
hash = Hash.new do |
|
418
|
-
|
359
|
+
def cells_to_hash(cells) #:nodoc:
|
360
|
+
hash = Hash.new do |hash_inner, key|
|
361
|
+
hash_inner[key.to_s] if key.is_a?(Symbol)
|
419
362
|
end
|
420
363
|
column_names.each_with_index do |column_name, column_index|
|
421
364
|
hash[column_name] = cells.value(column_index)
|
@@ -428,19 +371,21 @@ module Cucumber
|
|
428
371
|
end
|
429
372
|
|
430
373
|
def verify_column(column_name) #:nodoc:
|
431
|
-
raise %
|
374
|
+
raise %(The column named "#{column_name}" does not exist) unless raw[0].include?(column_name)
|
432
375
|
end
|
433
376
|
|
434
377
|
def verify_table_width(width) #:nodoc:
|
435
|
-
raise %
|
378
|
+
raise %(The table must have exactly #{width} columns) unless raw[0].size == width
|
436
379
|
end
|
437
380
|
|
438
|
-
|
439
|
-
|
381
|
+
# TODO: remove the below function if it's not actually being used.
|
382
|
+
# Nothing else in this repo calls it.
|
383
|
+
def text?(text) #:nodoc:
|
384
|
+
raw.flatten.compact.detect { |cell_value| cell_value.index(text) }
|
440
385
|
end
|
441
386
|
|
442
387
|
def cells_rows #:nodoc:
|
443
|
-
@rows ||= cell_matrix.map do |cell_row|
|
388
|
+
@rows ||= cell_matrix.map do |cell_row| # rubocop:disable Naming/MemoizedInstanceVariableName
|
444
389
|
Cells.new(self, cell_row)
|
445
390
|
end
|
446
391
|
end
|
@@ -453,35 +398,55 @@ module Cucumber
|
|
453
398
|
cells_rows[0][col]
|
454
399
|
end
|
455
400
|
|
456
|
-
|
457
|
-
@cell_matrix
|
458
|
-
end
|
401
|
+
attr_reader :cell_matrix
|
459
402
|
|
460
403
|
def col_width(col) #:nodoc:
|
461
404
|
columns[col].__send__(:width)
|
462
405
|
end
|
463
406
|
|
464
407
|
def to_s(options = {}) #:nodoc:
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
|
469
|
-
io = StringIO.new
|
470
|
-
|
471
|
-
c = Cucumber::Term::ANSIColor.coloring?
|
472
|
-
Cucumber::Term::ANSIColor.coloring = options[:color]
|
473
|
-
runtime = Struct.new(:configuration).new(Configuration.new)
|
474
|
-
formatter = Formatter::Pretty.new(runtime, io, options)
|
475
|
-
formatter.instance_variable_set('@indent', options[:indent])
|
476
|
-
Formatter::LegacyApi::Ast::MultilineArg.for(self).accept(Formatter::Fanout.new([formatter]))
|
477
|
-
Cucumber::Term::ANSIColor.coloring = c
|
478
|
-
io.rewind
|
479
|
-
s = "\n" + io.read + (" " * (options[:indent] - 2))
|
480
|
-
s
|
408
|
+
indentation = options.key?(:indent) ? options[:indent] : 2
|
409
|
+
prefixes = options.key?(:prefixes) ? options[:prefixes] : TO_S_PREFIXES
|
410
|
+
DataTablePrinter.new(self, indentation, prefixes).to_s
|
481
411
|
end
|
482
412
|
|
483
|
-
|
484
|
-
|
413
|
+
class DataTablePrinter #:nodoc:
|
414
|
+
include Cucumber::Gherkin::Formatter::Escaping
|
415
|
+
attr_reader :data_table, :indentation, :prefixes
|
416
|
+
private :data_table, :indentation, :prefixes
|
417
|
+
|
418
|
+
def initialize(data_table, indentation, prefixes)
|
419
|
+
@data_table = data_table
|
420
|
+
@indentation = indentation
|
421
|
+
@prefixes = prefixes
|
422
|
+
end
|
423
|
+
|
424
|
+
def to_s
|
425
|
+
leading_row = "\n"
|
426
|
+
end_indentation = indentation - 2
|
427
|
+
trailing_row = "\n" + (' ' * end_indentation)
|
428
|
+
table_rows = data_table.cell_matrix.map { |row| format_row(row) }
|
429
|
+
leading_row + table_rows.join("\n") + trailing_row
|
430
|
+
end
|
431
|
+
|
432
|
+
private
|
433
|
+
|
434
|
+
def format_row(row)
|
435
|
+
row_start = (' ' * indentation) + '| '
|
436
|
+
row_end = '|'
|
437
|
+
cells = row.map.with_index do |cell, i|
|
438
|
+
format_cell(cell, data_table.col_width(i))
|
439
|
+
end
|
440
|
+
row_start + cells.join('| ') + row_end
|
441
|
+
end
|
442
|
+
|
443
|
+
def format_cell(cell, col_width)
|
444
|
+
cell_text = escape_cell(cell.value.to_s)
|
445
|
+
cell_text_width = cell_text.unpack('U*').length
|
446
|
+
padded_text = cell_text + (' ' * (col_width - cell_text_width))
|
447
|
+
prefix = prefixes[cell.status]
|
448
|
+
"#{prefix}#{padded_text} "
|
449
|
+
end
|
485
450
|
end
|
486
451
|
|
487
452
|
def columns #:nodoc:
|
@@ -494,35 +459,26 @@ module Cucumber
|
|
494
459
|
raw.to_json(*args)
|
495
460
|
end
|
496
461
|
|
497
|
-
private
|
498
|
-
|
499
462
|
TO_S_PREFIXES = Hash.new(' ')
|
500
463
|
TO_S_PREFIXES[:comment] = '(+) '
|
501
464
|
TO_S_PREFIXES[:undefined] = '(-) '
|
465
|
+
private_constant :TO_S_PREFIXES
|
502
466
|
|
503
467
|
protected
|
504
468
|
|
505
469
|
def build_hashes
|
506
470
|
convert_headers!
|
507
471
|
convert_columns!
|
508
|
-
cells_rows[1..-1].map
|
509
|
-
row.to_hash
|
510
|
-
end
|
511
|
-
end
|
512
|
-
|
513
|
-
def inspect_rows(missing_row, inserted_row) #:nodoc:
|
514
|
-
missing_row.each_with_index do |missing_cell, col|
|
515
|
-
inserted_cell = inserted_row[col]
|
516
|
-
if(missing_cell.value != inserted_cell.value && (missing_cell.value.to_s == inserted_cell.value.to_s))
|
517
|
-
missing_cell.inspect!
|
518
|
-
inserted_cell.inspect!
|
519
|
-
end
|
520
|
-
end
|
472
|
+
cells_rows[1..-1].map(&:to_hash)
|
521
473
|
end
|
522
474
|
|
523
475
|
def create_cell_matrix(ast_table) #:nodoc:
|
524
476
|
ast_table.raw.map do |raw_row|
|
525
|
-
line =
|
477
|
+
line = begin
|
478
|
+
raw_row.line
|
479
|
+
rescue StandardError
|
480
|
+
-1
|
481
|
+
end
|
526
482
|
raw_row.map do |raw_cell|
|
527
483
|
Cell.new(raw_cell, self, line)
|
528
484
|
end
|
@@ -547,94 +503,28 @@ module Cucumber
|
|
547
503
|
header_cells = cell_matrix[0]
|
548
504
|
|
549
505
|
if @header_conversion_proc
|
550
|
-
header_values = header_cells.map
|
506
|
+
header_values = header_cells.map(&:value) - @header_mappings.keys
|
551
507
|
@header_mappings = @header_mappings.merge(Hash[*header_values.zip(header_values.map(&@header_conversion_proc)).flatten])
|
552
508
|
end
|
553
509
|
|
554
510
|
@header_mappings.each_pair do |pre, post|
|
555
|
-
mapped_cells = header_cells.
|
511
|
+
mapped_cells = header_cells.reject { |cell| cell.value.match(pre).nil? }
|
556
512
|
raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
|
557
|
-
raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map
|
513
|
+
raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map(&:value).inspect}" if mapped_cells.length > 1
|
558
514
|
mapped_cells[0].value = post
|
559
|
-
if @conversion_procs.
|
560
|
-
@conversion_procs[post] = @conversion_procs.delete(pre)
|
561
|
-
end
|
562
|
-
end
|
563
|
-
end
|
564
|
-
|
565
|
-
def require_diff_lcs #:nodoc:
|
566
|
-
begin
|
567
|
-
require 'diff/lcs'
|
568
|
-
rescue LoadError => e
|
569
|
-
e.message << "\n Please gem install diff-lcs\n"
|
570
|
-
raise e
|
515
|
+
@conversion_procs[post] = @conversion_procs.delete(pre) if @conversion_procs.key?(pre)
|
571
516
|
end
|
572
517
|
end
|
573
518
|
|
574
519
|
def clear_cache! #:nodoc:
|
575
|
-
@hashes = @rows_hash = @
|
576
|
-
end
|
577
|
-
|
578
|
-
# Pads two cell matrices to same column width and matches columns according to header value.
|
579
|
-
# The first cell matrix is the reference matrix with the second matrix matched against it.
|
580
|
-
def pad_and_match(a_cell_matrix, other_cell_matrix) #:nodoc:
|
581
|
-
clear_cache!
|
582
|
-
cols = a_cell_matrix.transpose
|
583
|
-
unmatched_cols = other_cell_matrix.transpose
|
584
|
-
|
585
|
-
|
586
|
-
header_values = cols.map(&:first)
|
587
|
-
matched_cols = []
|
588
|
-
|
589
|
-
header_values.each_with_index do |v, i|
|
590
|
-
mapped_index = unmatched_cols.index{|unmapped_col| unmapped_col.first == v}
|
591
|
-
if (mapped_index)
|
592
|
-
matched_cols << unmatched_cols.delete_at(mapped_index)
|
593
|
-
else
|
594
|
-
mark_as_missing(cols[i])
|
595
|
-
empty_col = other_cell_matrix.collect {SurplusCell.new(nil, self, -1)}
|
596
|
-
empty_col.first.value = v
|
597
|
-
matched_cols << empty_col
|
598
|
-
end
|
599
|
-
end
|
600
|
-
|
601
|
-
|
602
|
-
empty_col = cell_matrix.collect {SurplusCell.new(nil, self, -1)}
|
603
|
-
unmatched_cols.each do
|
604
|
-
cols << empty_col
|
605
|
-
end
|
606
|
-
|
607
|
-
return cols.transpose, (matched_cols + unmatched_cols).transpose
|
520
|
+
@hashes = @rows_hash = @column_names = @rows = @columns = nil
|
608
521
|
end
|
609
522
|
|
610
523
|
def ensure_table(table_or_array) #:nodoc:
|
611
|
-
return table_or_array if DataTable
|
524
|
+
return table_or_array if DataTable == table_or_array.class
|
612
525
|
DataTable.from(table_or_array)
|
613
526
|
end
|
614
527
|
|
615
|
-
def ensure_array_of_array(array)
|
616
|
-
Hash === array[0] ? hashes_to_array(array) : array
|
617
|
-
end
|
618
|
-
|
619
|
-
def hashes_to_array(hashes) #:nodoc:
|
620
|
-
header = hashes[0].keys.sort
|
621
|
-
[header] + hashes.map{|hash| header.map{|key| hash[key]}}
|
622
|
-
end
|
623
|
-
|
624
|
-
def ensure_green! #:nodoc:
|
625
|
-
each_cell{|cell| cell.status = :passed}
|
626
|
-
end
|
627
|
-
|
628
|
-
def each_cell(&proc) #:nodoc:
|
629
|
-
cell_matrix.each{|row| row.each(&proc)}
|
630
|
-
end
|
631
|
-
|
632
|
-
def mark_as_missing(col) #:nodoc:
|
633
|
-
col.each do |cell|
|
634
|
-
cell.status = :undefined
|
635
|
-
end
|
636
|
-
end
|
637
|
-
|
638
528
|
def symbolize_key(key)
|
639
529
|
key.downcase.tr(' ', '_').to_sym
|
640
530
|
end
|
@@ -647,7 +537,8 @@ module Cucumber
|
|
647
537
|
attr_reader :exception
|
648
538
|
|
649
539
|
def initialize(table, cells)
|
650
|
-
@table
|
540
|
+
@table = table
|
541
|
+
@cells = cells
|
651
542
|
end
|
652
543
|
|
653
544
|
def accept(visitor)
|
@@ -660,11 +551,11 @@ module Cucumber
|
|
660
551
|
|
661
552
|
# For testing only
|
662
553
|
def to_sexp #:nodoc:
|
663
|
-
[:row, line, *@cells.map
|
554
|
+
[:row, line, *@cells.map(&:to_sexp)]
|
664
555
|
end
|
665
556
|
|
666
557
|
def to_hash #:nodoc:
|
667
|
-
@to_hash ||= @table.
|
558
|
+
@to_hash ||= @table.cells_to_hash(self)
|
668
559
|
end
|
669
560
|
|
670
561
|
def value(n) #:nodoc:
|
@@ -694,7 +585,7 @@ module Cucumber
|
|
694
585
|
end
|
695
586
|
|
696
587
|
def width
|
697
|
-
map{|cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0}.max
|
588
|
+
map { |cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0 }.max
|
698
589
|
end
|
699
590
|
end
|
700
591
|
|
@@ -703,19 +594,21 @@ module Cucumber
|
|
703
594
|
attr_accessor :status, :value
|
704
595
|
|
705
596
|
def initialize(value, table, line)
|
706
|
-
@value
|
597
|
+
@value = value
|
598
|
+
@table = table
|
599
|
+
@line = line
|
707
600
|
end
|
708
601
|
|
709
602
|
def inspect!
|
710
603
|
@value = "(i) #{value.inspect}"
|
711
604
|
end
|
712
605
|
|
713
|
-
def ==(
|
714
|
-
SurplusCell
|
606
|
+
def ==(other)
|
607
|
+
SurplusCell == other.class || value == other.value
|
715
608
|
end
|
716
609
|
|
717
|
-
def eql?(
|
718
|
-
self ==
|
610
|
+
def eql?(other)
|
611
|
+
self == other
|
719
612
|
end
|
720
613
|
|
721
614
|
def hash
|
@@ -733,7 +626,7 @@ module Cucumber
|
|
733
626
|
:comment
|
734
627
|
end
|
735
628
|
|
736
|
-
def ==(
|
629
|
+
def ==(_other)
|
737
630
|
true
|
738
631
|
end
|
739
632
|
|