cucumber 2.0.0.rc.4 → 4.0.0.rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/{History.md → CHANGELOG.md} +734 -283
- data/CONTRIBUTING.md +26 -23
- data/LICENSE +1 -1
- data/README.md +25 -8
- data/bin/cucumber +3 -3
- data/lib/autotest/cucumber.rb +2 -0
- data/lib/autotest/cucumber_mixin.rb +45 -48
- data/lib/autotest/cucumber_rails.rb +2 -0
- data/lib/autotest/cucumber_rails_rspec.rb +2 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +2 -0
- data/lib/autotest/cucumber_rspec.rb +2 -0
- data/lib/autotest/cucumber_rspec2.rb +2 -0
- data/lib/autotest/discover.rb +4 -2
- data/lib/cucumber.rb +3 -9
- data/lib/cucumber/cli/configuration.rb +23 -106
- data/lib/cucumber/cli/main.rb +45 -25
- data/lib/cucumber/cli/options.rb +411 -223
- data/lib/cucumber/cli/profile_loader.rb +64 -38
- data/lib/cucumber/cli/rerun_file.rb +31 -0
- data/lib/cucumber/configuration.rb +240 -8
- data/lib/cucumber/constantize.rb +9 -10
- data/lib/cucumber/core_ext/string.rb +3 -1
- data/lib/cucumber/deprecate.rb +30 -0
- data/lib/cucumber/encoding.rb +7 -0
- data/lib/cucumber/errors.rb +17 -8
- data/lib/cucumber/events.rb +40 -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/step_activated.rb +26 -0
- data/lib/cucumber/events/step_definition_registered.rb +20 -0
- data/lib/cucumber/events/test_case_finished.rb +14 -0
- data/lib/cucumber/events/test_case_started.rb +11 -0
- data/lib/cucumber/events/test_run_finished.rb +11 -0
- data/lib/cucumber/events/test_run_started.rb +14 -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 +8 -6
- data/lib/cucumber/filters.rb +4 -0
- data/lib/cucumber/filters/activate_steps.rb +48 -7
- data/lib/cucumber/filters/apply_after_hooks.rb +2 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +2 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +2 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +2 -0
- data/lib/cucumber/filters/broadcast_test_run_started_event.rb +28 -0
- data/lib/cucumber/filters/gated_receiver.rb +2 -2
- data/lib/cucumber/filters/prepare_world.rb +13 -11
- data/lib/cucumber/filters/quit.rb +4 -7
- data/lib/cucumber/filters/randomizer.rb +10 -5
- data/lib/cucumber/filters/retry.rb +32 -0
- data/lib/cucumber/filters/tag_limits.rb +6 -5
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +2 -2
- data/lib/cucumber/filters/tag_limits/verifier.rb +5 -7
- data/lib/cucumber/formatter/ansicolor.rb +39 -45
- data/lib/cucumber/formatter/ast_lookup.rb +165 -0
- data/lib/cucumber/formatter/backtrace_filter.rb +54 -0
- data/lib/cucumber/formatter/console.rb +93 -115
- data/lib/cucumber/formatter/console_counts.rb +39 -0
- data/lib/cucumber/formatter/console_issues.rb +61 -0
- data/lib/cucumber/formatter/duration.rb +3 -1
- data/lib/cucumber/formatter/duration_extractor.rb +31 -0
- data/lib/cucumber/formatter/fail_fast.rb +23 -0
- data/lib/cucumber/formatter/fanout.rb +4 -3
- data/lib/cucumber/formatter/ignore_missing_messages.rb +3 -4
- data/lib/cucumber/formatter/interceptor.rb +13 -14
- data/lib/cucumber/formatter/io.rb +10 -5
- data/lib/cucumber/formatter/json.rb +310 -8
- data/lib/cucumber/formatter/junit.rb +175 -110
- data/lib/cucumber/formatter/pretty.rb +359 -154
- data/lib/cucumber/formatter/progress.rb +78 -72
- data/lib/cucumber/formatter/rerun.rb +34 -17
- data/lib/cucumber/formatter/stepdefs.rb +3 -2
- data/lib/cucumber/formatter/steps.rb +7 -7
- data/lib/cucumber/formatter/summary.rb +50 -20
- data/lib/cucumber/formatter/unicode.rb +17 -18
- data/lib/cucumber/formatter/usage.rb +61 -54
- data/lib/cucumber/gherkin/data_table_parser.rb +44 -0
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +97 -0
- data/lib/cucumber/gherkin/formatter/escaping.rb +19 -0
- data/lib/cucumber/gherkin/i18n.rb +17 -0
- data/lib/cucumber/gherkin/steps_parser.rb +42 -0
- data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +47 -26
- data/lib/cucumber/glue/hook.rb +51 -0
- data/lib/cucumber/glue/invoke_in_world.rb +65 -0
- data/lib/cucumber/glue/proto_world.rb +219 -0
- data/lib/cucumber/glue/registry_and_more.rb +192 -0
- data/lib/cucumber/glue/snippet.rb +205 -0
- data/lib/cucumber/glue/step_definition.rb +142 -0
- data/lib/cucumber/glue/world_factory.rb +21 -0
- data/lib/cucumber/hooks.rb +34 -21
- data/lib/cucumber/load_path.rb +2 -0
- data/lib/cucumber/multiline_argument.rb +10 -24
- data/lib/cucumber/multiline_argument/data_table.rb +157 -253
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +154 -0
- data/lib/cucumber/multiline_argument/doc_string.rb +3 -2
- data/lib/cucumber/platform.rb +7 -10
- data/lib/cucumber/project_initializer.rb +44 -0
- data/lib/cucumber/rake/task.rb +37 -29
- data/lib/cucumber/rspec/disable_option_parser.rb +11 -8
- data/lib/cucumber/rspec/doubles.rb +3 -1
- data/lib/cucumber/running_test_case.rb +60 -0
- data/lib/cucumber/runtime.rb +84 -78
- data/lib/cucumber/runtime/after_hooks.rb +10 -7
- data/lib/cucumber/runtime/before_hooks.rb +12 -6
- data/lib/cucumber/runtime/for_programming_languages.rb +14 -44
- data/lib/cucumber/runtime/step_hooks.rb +8 -4
- data/lib/cucumber/runtime/support_code.rb +55 -159
- data/lib/cucumber/runtime/user_interface.rb +15 -24
- data/lib/cucumber/step_definition_light.rb +10 -6
- data/lib/cucumber/step_definitions.rb +6 -4
- data/lib/cucumber/step_match.rb +58 -38
- data/lib/cucumber/step_match_search.rb +67 -0
- data/lib/cucumber/term/ansicolor.rb +40 -39
- data/lib/cucumber/unit.rb +2 -0
- data/lib/cucumber/version +1 -0
- data/{spec → lib}/simplecov_setup.rb +3 -1
- metadata +260 -607
- data/.coveralls.yml +0 -1
- data/.rspec +0 -1
- data/.ruby-gemset +0 -1
- data/.travis.yml +0 -18
- data/.yardopts +0 -1
- data/Gemfile +0 -11
- data/Rakefile +0 -22
- data/bin/cuke +0 -60
- data/cucumber.gemspec +0 -50
- 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/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/run_cli_main_with_existing_runtime.feature +0 -29
- data/features/docs/cli/backtraces.feature +0 -36
- data/features/docs/cli/dry_run.feature +0 -25
- data/features/docs/cli/exclude_files.feature +0 -19
- data/features/docs/cli/execute_with_tag_filter.feature +0 -117
- data/features/docs/cli/randomize.feature +0 -46
- data/features/docs/cli/require.feature +0 -27
- data/features/docs/cli/run_scenarios_matching_name.feature +0 -104
- data/features/docs/cli/run_specific_scenarios.feature +0 -130
- data/features/docs/cli/showing_differences.feature +0 -43
- data/features/docs/cli/specifying_multiple_formatters.feature +0 -44
- data/features/docs/cli/strict_mode.feature +0 -41
- data/features/docs/defining_steps/nested_steps.feature +0 -129
- data/features/docs/defining_steps/nested_steps_i18n.feature +0 -34
- data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -73
- data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
- data/features/docs/defining_steps/printing_messages.feature +0 -148
- data/features/docs/defining_steps/skip_scenario.feature +0 -62
- data/features/docs/defining_steps/snippets.feature +0 -56
- data/features/docs/defining_steps/table_diffing.feature +0 -50
- data/features/docs/defining_steps/transforms.feature +0 -63
- 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_before_hook.feature +0 -96
- data/features/docs/extending_cucumber/custom_filter.feature +0 -29
- data/features/docs/extending_cucumber/custom_formatter.feature +0 -94
- 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 -90
- data/features/docs/formatters/json_formatter.feature +0 -696
- data/features/docs/formatters/junit_formatter.feature +0 -276
- 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 -136
- data/features/docs/formatters/usage_formatter.feature +0 -102
- data/features/docs/getting_started.feature +0 -27
- data/features/docs/gherkin/background.feature +0 -559
- 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 -37
- data/features/docs/gherkin/outlines.feature +0 -158
- data/features/docs/gherkin/unicode_table.feature +0 -32
- data/features/docs/gherkin/using_descriptions.feature +0 -88
- 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 -49
- 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/report_called_undefined_steps.feature +0 -57
- data/features/docs/wire_protocol.feature +0 -337
- data/features/docs/wire_protocol_erb.feature +0 -56
- data/features/docs/wire_protocol_table_diffing.feature +0 -125
- data/features/docs/wire_protocol_tags.feature +0 -86
- data/features/docs/wire_protocol_timeouts.feature +0 -63
- data/features/docs/work_in_progress.feature +0 -154
- data/features/docs/writing_support_code/after_hooks.feature +0 -56
- data/features/docs/writing_support_code/around_hooks.feature +0 -229
- data/features/docs/writing_support_code/before_hook.feature +0 -61
- 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 -57
- data/features/lib/step_definitions/aruba_steps.rb +0 -22
- data/features/lib/step_definitions/cucumber_steps.rb +0 -50
- data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -12
- data/features/lib/step_definitions/json_steps.rb +0 -7
- data/features/lib/step_definitions/junit_steps.rb +0 -13
- data/features/lib/step_definitions/language_steps.rb +0 -8
- data/features/lib/step_definitions/profile_steps.rb +0 -15
- data/features/lib/step_definitions/ruby_steps.rb +0 -3
- data/features/lib/step_definitions/wire_steps.rb +0 -41
- data/features/lib/support/env.rb +0 -21
- data/features/lib/support/fake_wire_server.rb +0 -77
- data/features/lib/support/feature_factory.rb +0 -67
- data/features/lib/support/normalise_output.rb +0 -33
- data/gem_tasks/contributors.rake +0 -15
- data/gem_tasks/cov.rake +0 -5
- data/gem_tasks/cucumber.rake +0 -25
- data/gem_tasks/downloads.rb +0 -7
- data/gem_tasks/environment.rake +0 -7
- data/gem_tasks/examples.rake +0 -11
- data/gem_tasks/fix_cr_lf.rake +0 -10
- data/gem_tasks/flog.rake +0 -4
- data/gem_tasks/rspec.rake +0 -6
- data/gem_tasks/sass.rake +0 -4
- data/gem_tasks/stats +0 -16
- data/gem_tasks/versions.txt +0 -74
- data/lib/cucumber/ast.rb +0 -13
- data/lib/cucumber/ast/facade.rb +0 -117
- data/lib/cucumber/core_ext/instance_exec.rb +0 -70
- data/lib/cucumber/core_ext/proc.rb +0 -36
- data/lib/cucumber/formatter/cucumber.css +0 -285
- data/lib/cucumber/formatter/cucumber.sass +0 -247
- data/lib/cucumber/formatter/debug.rb +0 -35
- data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +0 -201
- data/lib/cucumber/formatter/gpretty.rb +0 -24
- data/lib/cucumber/formatter/html.rb +0 -674
- data/lib/cucumber/formatter/jquery-min.js +0 -154
- data/lib/cucumber/formatter/json_pretty.rb +0 -10
- data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1024
- data/lib/cucumber/formatter/legacy_api/ast.rb +0 -376
- data/lib/cucumber/formatter/legacy_api/results.rb +0 -51
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -30
- data/lib/cucumber/language_support.rb +0 -30
- data/lib/cucumber/language_support/language_methods.rb +0 -71
- data/lib/cucumber/rb_support/rb_hook.rb +0 -18
- data/lib/cucumber/rb_support/rb_language.rb +0 -160
- data/lib/cucumber/rb_support/rb_step_definition.rb +0 -122
- data/lib/cucumber/rb_support/rb_transform.rb +0 -59
- data/lib/cucumber/rb_support/rb_world.rb +0 -142
- data/lib/cucumber/rb_support/regexp_argument_matcher.rb +0 -21
- data/lib/cucumber/rb_support/snippet.rb +0 -149
- data/lib/cucumber/wire_support/configuration.rb +0 -38
- data/lib/cucumber/wire_support/connection.rb +0 -61
- data/lib/cucumber/wire_support/request_handler.rb +0 -32
- data/lib/cucumber/wire_support/wire_exception.rb +0 -32
- data/lib/cucumber/wire_support/wire_language.rb +0 -68
- data/lib/cucumber/wire_support/wire_packet.rb +0 -34
- data/lib/cucumber/wire_support/wire_protocol.rb +0 -43
- data/lib/cucumber/wire_support/wire_protocol/requests.rb +0 -133
- data/lib/cucumber/wire_support/wire_step_definition.rb +0 -19
- data/spec/cucumber/cli/configuration_spec.rb +0 -503
- data/spec/cucumber/cli/main_spec.rb +0 -105
- data/spec/cucumber/cli/options_spec.rb +0 -335
- data/spec/cucumber/cli/profile_loader_spec.rb +0 -46
- data/spec/cucumber/configuration_spec.rb +0 -23
- data/spec/cucumber/constantize_spec.rb +0 -19
- data/spec/cucumber/core_ext/proc_spec.rb +0 -69
- data/spec/cucumber/file_specs_spec.rb +0 -60
- data/spec/cucumber/filters/activate_steps_spec.rb +0 -57
- data/spec/cucumber/filters/gated_receiver_spec.rb +0 -47
- data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -38
- data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -57
- data/spec/cucumber/filters/tag_limits_spec.rb +0 -59
- data/spec/cucumber/formatter/ansicolor_spec.rb +0 -32
- data/spec/cucumber/formatter/debug_spec.rb +0 -64
- data/spec/cucumber/formatter/duration_spec.rb +0 -22
- data/spec/cucumber/formatter/html_spec.rb +0 -459
- data/spec/cucumber/formatter/interceptor_spec.rb +0 -136
- data/spec/cucumber/formatter/junit_spec.rb +0 -196
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2002
- data/spec/cucumber/formatter/pretty_spec.rb +0 -810
- data/spec/cucumber/formatter/progress_spec.rb +0 -85
- data/spec/cucumber/formatter/rerun_spec.rb +0 -107
- data/spec/cucumber/formatter/spec_helper.rb +0 -67
- data/spec/cucumber/hooks_spec.rb +0 -30
- data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -514
- data/spec/cucumber/rake/forked_spec.rb +0 -53
- data/spec/cucumber/rb_support/rb_language_spec.rb +0 -279
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -152
- data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +0 -22
- data/spec/cucumber/rb_support/snippet_spec.rb +0 -137
- data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -36
- data/spec/cucumber/runtime/support_code_spec.rb +0 -123
- data/spec/cucumber/runtime_spec.rb +0 -46
- data/spec/cucumber/sell_cucumbers.feature +0 -19
- data/spec/cucumber/step_match_spec.rb +0 -79
- data/spec/cucumber/wire_support/configuration_spec.rb +0 -64
- data/spec/cucumber/wire_support/connection_spec.rb +0 -64
- data/spec/cucumber/wire_support/wire_exception_spec.rb +0 -50
- data/spec/cucumber/wire_support/wire_language_spec.rb +0 -46
- data/spec/cucumber/wire_support/wire_packet_spec.rb +0 -44
- data/spec/cucumber/world/pending_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -32
data/lib/cucumber/load_path.rb
CHANGED
@@ -1,26 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'delegate'
|
2
4
|
require 'cucumber/multiline_argument/data_table'
|
3
5
|
require 'cucumber/multiline_argument/doc_string'
|
4
|
-
require 'gherkin/rubify'
|
5
6
|
|
6
7
|
module Cucumber
|
7
8
|
module MultilineArgument
|
8
|
-
extend Gherkin::Rubify
|
9
|
-
|
10
9
|
class << self
|
11
10
|
def from_core(node)
|
12
11
|
builder.wrap(node)
|
13
12
|
end
|
14
13
|
|
15
|
-
def from(argument, location=nil)
|
16
|
-
location ||= Core::
|
17
|
-
argument = rubify(argument)
|
14
|
+
def from(argument, location = nil, content_type = nil)
|
15
|
+
location ||= Core::Test::Location.of_caller
|
18
16
|
case argument
|
19
17
|
when String
|
20
|
-
doc_string(argument,
|
18
|
+
builder.doc_string(Core::Test::DocString.new(argument, content_type, location))
|
21
19
|
when Array
|
22
20
|
location = location.on_line(argument.first.line..argument.last.line)
|
23
|
-
data_table(argument.map
|
21
|
+
builder.data_table(argument.map(&:cells), location)
|
24
22
|
when DataTable, DocString, None
|
25
23
|
argument
|
26
24
|
when nil
|
@@ -30,14 +28,6 @@ module Cucumber
|
|
30
28
|
end
|
31
29
|
end
|
32
30
|
|
33
|
-
def doc_string(argument, content_type, location)
|
34
|
-
builder.doc_string(Core::Ast::DocString.new(argument, content_type, location))
|
35
|
-
end
|
36
|
-
|
37
|
-
def data_table(data, location)
|
38
|
-
builder.data_table(Core::Ast::DataTable.new(data, location))
|
39
|
-
end
|
40
|
-
|
41
31
|
private
|
42
32
|
|
43
33
|
def builder
|
@@ -51,24 +41,20 @@ module Cucumber
|
|
51
41
|
@result
|
52
42
|
end
|
53
43
|
|
54
|
-
def doc_string(node, *
|
44
|
+
def doc_string(node, *_args)
|
55
45
|
@result = DocString.new(node)
|
56
46
|
end
|
57
47
|
|
58
|
-
def data_table(node, *
|
48
|
+
def data_table(node, *_args)
|
59
49
|
@result = DataTable.new(node)
|
60
50
|
end
|
61
51
|
end
|
62
52
|
end
|
63
53
|
|
64
54
|
class None
|
65
|
-
def append_to(array)
|
66
|
-
end
|
55
|
+
def append_to(array); end
|
67
56
|
|
68
|
-
def describe_to(visitor)
|
69
|
-
end
|
57
|
+
def describe_to(visitor); end
|
70
58
|
end
|
71
59
|
end
|
72
60
|
end
|
73
|
-
|
74
|
-
require 'cucumber/ast'
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'forwardable'
|
2
|
-
require 'gherkin/
|
3
|
-
require 'cucumber/
|
4
|
+
require 'cucumber/gherkin/data_table_parser'
|
5
|
+
require 'cucumber/gherkin/formatter/escaping'
|
6
|
+
require 'cucumber/multiline_argument/data_table/diff_matrices'
|
4
7
|
|
5
8
|
module Cucumber
|
6
9
|
module MultilineArgument
|
@@ -24,72 +27,62 @@ module Cucumber
|
|
24
27
|
# This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
|
25
28
|
#
|
26
29
|
class DataTable
|
27
|
-
|
28
|
-
|
29
|
-
super("Tables were not identical:\n#{table}")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class Builder
|
34
|
-
attr_reader :rows
|
35
|
-
|
36
|
-
def initialize
|
37
|
-
@rows = []
|
38
|
-
end
|
39
|
-
|
40
|
-
def row(row, line_number)
|
41
|
-
@rows << row
|
42
|
-
end
|
43
|
-
|
44
|
-
def eof
|
45
|
-
end
|
30
|
+
def self.default_arg_name #:nodoc:
|
31
|
+
'table'
|
46
32
|
end
|
47
33
|
|
48
|
-
|
49
|
-
|
50
|
-
extend Forwardable
|
51
|
-
|
52
|
-
NULL_CONVERSIONS = Hash.new({ :strict => false, :proc => lambda{ |cell_value| cell_value } }).freeze
|
53
|
-
|
54
|
-
attr_accessor :file
|
55
|
-
def_delegator :@ast_table, :location
|
56
|
-
|
57
|
-
def self.default_arg_name #:nodoc:
|
58
|
-
"table"
|
34
|
+
def describe_to(visitor, *args)
|
35
|
+
visitor.legacy_table(self, *args)
|
59
36
|
end
|
60
37
|
|
61
38
|
class << self
|
62
|
-
def from(data, location = Core::
|
39
|
+
def from(data, location = Core::Test::Location.of_caller)
|
63
40
|
case data
|
64
41
|
when Array
|
65
42
|
from_array(data, location)
|
66
43
|
when String
|
67
44
|
parse(data, location)
|
68
45
|
else
|
69
|
-
raise ArgumentError,
|
46
|
+
raise ArgumentError, 'expected data to be a String or an Array.'
|
70
47
|
end
|
71
48
|
end
|
72
49
|
|
73
50
|
private
|
74
|
-
|
51
|
+
|
52
|
+
def parse(text, location = Core::Test::Location.of_caller)
|
75
53
|
builder = Builder.new
|
76
|
-
|
77
|
-
|
54
|
+
parser = Cucumber::Gherkin::DataTableParser.new(builder)
|
55
|
+
parser.parse(text)
|
78
56
|
from_array(builder.rows, location)
|
79
57
|
end
|
80
58
|
|
81
|
-
def from_array(data, location = Core::
|
82
|
-
new Core::
|
59
|
+
def from_array(data, location = Core::Test::Location.of_caller)
|
60
|
+
new Core::Test::DataTable.new(data, location)
|
83
61
|
end
|
84
62
|
end
|
85
63
|
|
64
|
+
class Builder
|
65
|
+
attr_reader :rows
|
86
66
|
|
87
|
-
|
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
|
79
|
+
|
80
|
+
# @param data [Core::Test::DataTable] the data for the table
|
88
81
|
# @param conversion_procs [Hash] see map_columns!
|
89
82
|
# @param header_mappings [Hash] see map_headers!
|
90
83
|
# @param header_conversion_proc [Proc] see map_headers!
|
91
84
|
def initialize(data, conversion_procs = NULL_CONVERSIONS.dup, header_mappings = {}, header_conversion_proc = nil)
|
92
|
-
raise ArgumentError,
|
85
|
+
raise ArgumentError, 'data must be a Core::Test::DataTable' unless data.is_a? Core::Test::DataTable
|
93
86
|
ast_table = data
|
94
87
|
# Verify that it's square
|
95
88
|
ast_table.transpose
|
@@ -108,11 +101,17 @@ module Cucumber
|
|
108
101
|
dup
|
109
102
|
end
|
110
103
|
|
104
|
+
attr_accessor :file
|
105
|
+
|
106
|
+
def location
|
107
|
+
@ast_table.location
|
108
|
+
end
|
109
|
+
|
111
110
|
# Creates a copy of this table, inheriting any column and header mappings
|
112
111
|
# registered with #map_column! and #map_headers!.
|
113
112
|
#
|
114
113
|
def dup
|
115
|
-
self.class.new(Core::
|
114
|
+
self.class.new(Core::Test::DataTable.new(raw, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
|
116
115
|
end
|
117
116
|
|
118
117
|
# Returns a new, transposed table. Example:
|
@@ -127,7 +126,7 @@ module Cucumber
|
|
127
126
|
# | 4 | 2 |
|
128
127
|
#
|
129
128
|
def transpose
|
130
|
-
self.class.new(Core::
|
129
|
+
self.class.new(Core::Test::DataTable.new(raw.transpose, location), @conversion_procs.dup, @header_mappings.dup, @header_conversion_proc)
|
131
130
|
end
|
132
131
|
|
133
132
|
# Converts this table into an Array of Hash where the keys of each
|
@@ -148,6 +147,24 @@ module Cucumber
|
|
148
147
|
@hashes ||= build_hashes
|
149
148
|
end
|
150
149
|
|
150
|
+
# Converts this table into an Array of Hashes where the keys are symbols.
|
151
|
+
# For example, a Table built from the following plain text:
|
152
|
+
#
|
153
|
+
# | foo | Bar | Foo Bar |
|
154
|
+
# | 2 | 3 | 5 |
|
155
|
+
# | 7 | 9 | 16 |
|
156
|
+
#
|
157
|
+
# Gets converted into the following:
|
158
|
+
#
|
159
|
+
# [{:foo => '2', :bar => '3', :foo_bar => '5'}, {:foo => '7', :bar => '9', :foo_bar => '16'}]
|
160
|
+
#
|
161
|
+
def symbolic_hashes
|
162
|
+
@symbolic_hashes ||=
|
163
|
+
hashes.map do |string_hash|
|
164
|
+
Hash[string_hash.map { |a, b| [symbolize_key(a), b] }]
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
151
168
|
# Converts this table into a Hash where the first column is
|
152
169
|
# used as keys and the second column is used as values
|
153
170
|
#
|
@@ -163,7 +180,7 @@ module Cucumber
|
|
163
180
|
def rows_hash
|
164
181
|
return @rows_hash if @rows_hash
|
165
182
|
verify_table_width(2)
|
166
|
-
@rows_hash =
|
183
|
+
@rows_hash = transpose.hashes[0]
|
167
184
|
end
|
168
185
|
|
169
186
|
# Gets the raw data of this table. For example, a Table built from
|
@@ -178,14 +195,12 @@ module Cucumber
|
|
178
195
|
#
|
179
196
|
def raw
|
180
197
|
cell_matrix.map do |row|
|
181
|
-
row.map
|
182
|
-
cell.value
|
183
|
-
end
|
198
|
+
row.map(&:value)
|
184
199
|
end
|
185
200
|
end
|
186
201
|
|
187
202
|
def column_names #:nodoc:
|
188
|
-
@
|
203
|
+
@column_names ||= cell_matrix[0].map(&:value)
|
189
204
|
end
|
190
205
|
|
191
206
|
def rows
|
@@ -245,7 +260,7 @@ module Cucumber
|
|
245
260
|
# table.hashes.keys
|
246
261
|
# # => ['phone number', 'ADDRESS']
|
247
262
|
#
|
248
|
-
def map_headers!(mappings={}, &block)
|
263
|
+
def map_headers!(mappings = {}, &block)
|
249
264
|
# TODO: Remove this method for 2.0
|
250
265
|
clear_cache!
|
251
266
|
@header_mappings = mappings
|
@@ -253,8 +268,8 @@ module Cucumber
|
|
253
268
|
end
|
254
269
|
|
255
270
|
# Returns a new Table where the headers are redefined. See #map_headers!
|
256
|
-
def map_headers(mappings={}, &block)
|
257
|
-
self.class.new(Core::
|
271
|
+
def map_headers(mappings = {}, &block)
|
272
|
+
self.class.new(Core::Test::DataTable.new(raw, location), @conversion_procs.dup, mappings, block)
|
258
273
|
end
|
259
274
|
|
260
275
|
# Change how #hashes converts column values. The +column_name+ argument identifies the column
|
@@ -269,17 +284,17 @@ module Cucumber
|
|
269
284
|
# end
|
270
285
|
# end
|
271
286
|
#
|
272
|
-
def map_column!(column_name, strict=true, &conversion_proc)
|
287
|
+
def map_column!(column_name, strict = true, &conversion_proc)
|
273
288
|
# TODO: Remove this method for 2.0
|
274
|
-
@conversion_procs[column_name.to_s] = { :
|
289
|
+
@conversion_procs[column_name.to_s] = { strict: strict, proc: conversion_proc }
|
275
290
|
self
|
276
291
|
end
|
277
292
|
|
278
293
|
# Returns a new Table with an additional column mapping. See #map_column!
|
279
|
-
def map_column(column_name, strict=true, &conversion_proc)
|
294
|
+
def map_column(column_name, strict = true, &conversion_proc)
|
280
295
|
conversion_procs = @conversion_procs.dup
|
281
|
-
conversion_procs[column_name.to_s] = { :
|
282
|
-
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, location), conversion_procs, @header_mappings.dup, @header_conversion_proc)
|
283
298
|
end
|
284
299
|
|
285
300
|
# Compares +other_table+ to self. If +other_table+ contains columns
|
@@ -318,86 +333,28 @@ module Cucumber
|
|
318
333
|
# Calling this method is particularly useful in <tt>Then</tt> steps that take
|
319
334
|
# a Table argument, if you want to compare that table to some actual values.
|
320
335
|
#
|
321
|
-
def diff!(other_table, options={})
|
322
|
-
options = {
|
323
|
-
:missing_row => true,
|
324
|
-
:surplus_row => true,
|
325
|
-
:missing_col => true,
|
326
|
-
:surplus_col => false,
|
327
|
-
:misplaced_col => false
|
328
|
-
}.merge(options)
|
329
|
-
|
336
|
+
def diff!(other_table, options = {})
|
330
337
|
other_table = ensure_table(other_table)
|
331
338
|
other_table.convert_headers!
|
332
339
|
other_table.convert_columns!
|
333
|
-
ensure_green!
|
334
340
|
|
335
341
|
convert_headers!
|
336
342
|
convert_columns!
|
337
343
|
|
338
|
-
|
339
|
-
|
340
|
-
padded_width = cell_matrix[0].length
|
341
|
-
|
342
|
-
missing_col = cell_matrix[0].detect{|cell| cell.status == :undefined}
|
343
|
-
surplus_col = padded_width > original_width
|
344
|
-
misplaced_col = cell_matrix[0] != other_table.cell_matrix[0]
|
345
|
-
|
346
|
-
require_diff_lcs
|
347
|
-
cell_matrix.extend(Diff::LCS)
|
348
|
-
changes = cell_matrix.diff(other_table_cell_matrix).flatten
|
349
|
-
|
350
|
-
inserted = 0
|
351
|
-
missing = 0
|
352
|
-
|
353
|
-
row_indices = Array.new(other_table_cell_matrix.length) {|n| n}
|
354
|
-
|
355
|
-
last_change = nil
|
356
|
-
missing_row_pos = nil
|
357
|
-
insert_row_pos = nil
|
358
|
-
|
359
|
-
changes.each do |change|
|
360
|
-
if(change.action == '-')
|
361
|
-
missing_row_pos = change.position + inserted
|
362
|
-
cell_matrix[missing_row_pos].each{|cell| cell.status = :undefined}
|
363
|
-
row_indices.insert(missing_row_pos, nil)
|
364
|
-
missing += 1
|
365
|
-
else # '+'
|
366
|
-
insert_row_pos = change.position + missing
|
367
|
-
inserted_row = change.element
|
368
|
-
inserted_row.each{|cell| cell.status = :comment}
|
369
|
-
cell_matrix.insert(insert_row_pos, inserted_row)
|
370
|
-
row_indices[insert_row_pos] = nil
|
371
|
-
inspect_rows(cell_matrix[missing_row_pos], inserted_row) if last_change && last_change.action == '-'
|
372
|
-
inserted += 1
|
373
|
-
end
|
374
|
-
last_change = change
|
375
|
-
end
|
344
|
+
DiffMatrices.new(cell_matrix, other_table.cell_matrix, options).call
|
345
|
+
end
|
376
346
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
surplus_cell = other_row[col_index]
|
383
|
-
row[col_index].value = surplus_cell.value if row[col_index]
|
384
|
-
end
|
385
|
-
end
|
347
|
+
class Different < StandardError
|
348
|
+
attr_reader :table
|
349
|
+
def initialize(table)
|
350
|
+
@table = table
|
351
|
+
super("Tables were not identical:\n#{table}")
|
386
352
|
end
|
387
|
-
|
388
|
-
clear_cache!
|
389
|
-
should_raise =
|
390
|
-
missing_row_pos && options[:missing_row] ||
|
391
|
-
insert_row_pos && options[:surplus_row] ||
|
392
|
-
missing_col && options[:missing_col] ||
|
393
|
-
surplus_col && options[:surplus_col] ||
|
394
|
-
misplaced_col && options[:misplaced_col]
|
395
|
-
raise Different.new(self) if should_raise
|
396
353
|
end
|
397
354
|
|
398
355
|
def to_hash(cells) #:nodoc:
|
399
|
-
hash = Hash.new do |
|
400
|
-
|
356
|
+
hash = Hash.new do |hash_inner, key|
|
357
|
+
hash_inner[key.to_s] if key.is_a?(Symbol)
|
401
358
|
end
|
402
359
|
column_names.each_with_index do |column_name, column_index|
|
403
360
|
hash[column_name] = cells.value(column_index)
|
@@ -410,19 +367,21 @@ module Cucumber
|
|
410
367
|
end
|
411
368
|
|
412
369
|
def verify_column(column_name) #:nodoc:
|
413
|
-
raise %
|
370
|
+
raise %(The column named "#{column_name}" does not exist) unless raw[0].include?(column_name)
|
414
371
|
end
|
415
372
|
|
416
373
|
def verify_table_width(width) #:nodoc:
|
417
|
-
raise %
|
374
|
+
raise %(The table must have exactly #{width} columns) unless raw[0].size == width
|
418
375
|
end
|
419
376
|
|
420
|
-
|
421
|
-
|
377
|
+
# TODO: remove the below function if it's not actually being used.
|
378
|
+
# Nothing else in this repo calls it.
|
379
|
+
def text?(text) #:nodoc:
|
380
|
+
raw.flatten.compact.detect { |cell_value| cell_value.index(text) }
|
422
381
|
end
|
423
382
|
|
424
383
|
def cells_rows #:nodoc:
|
425
|
-
@rows ||= cell_matrix.map do |cell_row|
|
384
|
+
@rows ||= cell_matrix.map do |cell_row| # rubocop:disable Naming/MemoizedInstanceVariableName
|
426
385
|
Cells.new(self, cell_row)
|
427
386
|
end
|
428
387
|
end
|
@@ -435,34 +394,55 @@ module Cucumber
|
|
435
394
|
cells_rows[0][col]
|
436
395
|
end
|
437
396
|
|
438
|
-
|
439
|
-
@cell_matrix
|
440
|
-
end
|
397
|
+
attr_reader :cell_matrix
|
441
398
|
|
442
399
|
def col_width(col) #:nodoc:
|
443
400
|
columns[col].__send__(:width)
|
444
401
|
end
|
445
402
|
|
446
403
|
def to_s(options = {}) #:nodoc:
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
|
451
|
-
io = StringIO.new
|
452
|
-
|
453
|
-
c = Cucumber::Term::ANSIColor.coloring?
|
454
|
-
Cucumber::Term::ANSIColor.coloring = options[:color]
|
455
|
-
formatter = Formatter::Pretty.new(nil, io, options)
|
456
|
-
formatter.instance_variable_set('@indent', options[:indent])
|
457
|
-
Formatter::LegacyApi::Ast::MultilineArg.for(self).accept(Formatter::Fanout.new([formatter]))
|
458
|
-
Cucumber::Term::ANSIColor.coloring = c
|
459
|
-
io.rewind
|
460
|
-
s = "\n" + io.read + (" " * (options[:indent] - 2))
|
461
|
-
s
|
404
|
+
indentation = options.key?(:indent) ? options[:indent] : 2
|
405
|
+
prefixes = options.key?(:prefixes) ? options[:prefixes] : TO_S_PREFIXES
|
406
|
+
DataTablePrinter.new(self, indentation, prefixes).to_s
|
462
407
|
end
|
463
408
|
|
464
|
-
|
465
|
-
|
409
|
+
class DataTablePrinter #:nodoc:
|
410
|
+
include Cucumber::Gherkin::Formatter::Escaping
|
411
|
+
attr_reader :data_table, :indentation, :prefixes
|
412
|
+
private :data_table, :indentation, :prefixes
|
413
|
+
|
414
|
+
def initialize(data_table, indentation, prefixes)
|
415
|
+
@data_table = data_table
|
416
|
+
@indentation = indentation
|
417
|
+
@prefixes = prefixes
|
418
|
+
end
|
419
|
+
|
420
|
+
def to_s
|
421
|
+
leading_row = "\n"
|
422
|
+
end_indentation = indentation - 2
|
423
|
+
trailing_row = "\n" + (' ' * end_indentation)
|
424
|
+
table_rows = data_table.cell_matrix.map { |row| format_row(row) }
|
425
|
+
leading_row + table_rows.join("\n") + trailing_row
|
426
|
+
end
|
427
|
+
|
428
|
+
private
|
429
|
+
|
430
|
+
def format_row(row)
|
431
|
+
row_start = (' ' * indentation) + '| '
|
432
|
+
row_end = '|'
|
433
|
+
cells = row.map.with_index do |cell, i|
|
434
|
+
format_cell(cell, data_table.col_width(i))
|
435
|
+
end
|
436
|
+
row_start + cells.join('| ') + row_end
|
437
|
+
end
|
438
|
+
|
439
|
+
def format_cell(cell, col_width)
|
440
|
+
cell_text = escape_cell(cell.value.to_s)
|
441
|
+
cell_text_width = cell_text.unpack('U*').length
|
442
|
+
padded_text = cell_text + (' ' * (col_width - cell_text_width))
|
443
|
+
prefix = prefixes[cell.status]
|
444
|
+
"#{prefix}#{padded_text} "
|
445
|
+
end
|
466
446
|
end
|
467
447
|
|
468
448
|
def columns #:nodoc:
|
@@ -475,35 +455,26 @@ module Cucumber
|
|
475
455
|
raw.to_json(*args)
|
476
456
|
end
|
477
457
|
|
478
|
-
private
|
479
|
-
|
480
458
|
TO_S_PREFIXES = Hash.new(' ')
|
481
459
|
TO_S_PREFIXES[:comment] = '(+) '
|
482
460
|
TO_S_PREFIXES[:undefined] = '(-) '
|
461
|
+
private_constant :TO_S_PREFIXES
|
483
462
|
|
484
463
|
protected
|
485
464
|
|
486
465
|
def build_hashes
|
487
466
|
convert_headers!
|
488
467
|
convert_columns!
|
489
|
-
cells_rows[1..-1].map
|
490
|
-
row.to_hash
|
491
|
-
end
|
492
|
-
end
|
493
|
-
|
494
|
-
def inspect_rows(missing_row, inserted_row) #:nodoc:
|
495
|
-
missing_row.each_with_index do |missing_cell, col|
|
496
|
-
inserted_cell = inserted_row[col]
|
497
|
-
if(missing_cell.value != inserted_cell.value && (missing_cell.value.to_s == inserted_cell.value.to_s))
|
498
|
-
missing_cell.inspect!
|
499
|
-
inserted_cell.inspect!
|
500
|
-
end
|
501
|
-
end
|
468
|
+
cells_rows[1..-1].map(&:to_hash)
|
502
469
|
end
|
503
470
|
|
504
471
|
def create_cell_matrix(ast_table) #:nodoc:
|
505
472
|
ast_table.raw.map do |raw_row|
|
506
|
-
line =
|
473
|
+
line = begin
|
474
|
+
raw_row.line
|
475
|
+
rescue StandardError
|
476
|
+
-1
|
477
|
+
end
|
507
478
|
raw_row.map do |raw_cell|
|
508
479
|
Cell.new(raw_cell, self, line)
|
509
480
|
end
|
@@ -528,111 +499,42 @@ module Cucumber
|
|
528
499
|
header_cells = cell_matrix[0]
|
529
500
|
|
530
501
|
if @header_conversion_proc
|
531
|
-
header_values = header_cells.map
|
502
|
+
header_values = header_cells.map(&:value) - @header_mappings.keys
|
532
503
|
@header_mappings = @header_mappings.merge(Hash[*header_values.zip(header_values.map(&@header_conversion_proc)).flatten])
|
533
504
|
end
|
534
505
|
|
535
506
|
@header_mappings.each_pair do |pre, post|
|
536
|
-
mapped_cells = header_cells.
|
507
|
+
mapped_cells = header_cells.reject { |cell| cell.value.match(pre).nil? }
|
537
508
|
raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
|
538
|
-
raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map
|
509
|
+
raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map(&:value).inspect}" if mapped_cells.length > 1
|
539
510
|
mapped_cells[0].value = post
|
540
|
-
if @conversion_procs.
|
541
|
-
@conversion_procs[post] = @conversion_procs.delete(pre)
|
542
|
-
end
|
543
|
-
end
|
544
|
-
end
|
545
|
-
|
546
|
-
def require_diff_lcs #:nodoc:
|
547
|
-
begin
|
548
|
-
require 'diff/lcs'
|
549
|
-
rescue LoadError => e
|
550
|
-
e.message << "\n Please gem install diff-lcs\n"
|
551
|
-
raise e
|
511
|
+
@conversion_procs[post] = @conversion_procs.delete(pre) if @conversion_procs.key?(pre)
|
552
512
|
end
|
553
513
|
end
|
554
514
|
|
555
515
|
def clear_cache! #:nodoc:
|
556
|
-
@hashes = @rows_hash = @
|
557
|
-
end
|
558
|
-
|
559
|
-
# Pads our own cell_matrix and returns a cell matrix of same
|
560
|
-
# column width that can be used for diffing
|
561
|
-
def pad!(other_cell_matrix) #:nodoc:
|
562
|
-
clear_cache!
|
563
|
-
cols = cell_matrix.transpose
|
564
|
-
unmapped_cols = other_cell_matrix.transpose
|
565
|
-
|
566
|
-
mapped_cols = []
|
567
|
-
|
568
|
-
cols.each_with_index do |col, col_index|
|
569
|
-
header = col[0]
|
570
|
-
candidate_cols, unmapped_cols = unmapped_cols.partition do |other_col|
|
571
|
-
other_col[0] == header
|
572
|
-
end
|
573
|
-
raise "More than one column has the header #{header}" if candidate_cols.size > 2
|
574
|
-
|
575
|
-
other_padded_col = if candidate_cols.size == 1
|
576
|
-
# Found a matching column
|
577
|
-
candidate_cols[0]
|
578
|
-
else
|
579
|
-
mark_as_missing(cols[col_index])
|
580
|
-
(0...other_cell_matrix.length).map do |row|
|
581
|
-
val = row == 0 ? header.value : nil
|
582
|
-
SurplusCell.new(val, self, -1)
|
583
|
-
end
|
584
|
-
end
|
585
|
-
mapped_cols.insert(col_index, other_padded_col)
|
586
|
-
end
|
587
|
-
|
588
|
-
unmapped_cols.each_with_index do |col, col_index|
|
589
|
-
empty_col = (0...cell_matrix.length).map do |row|
|
590
|
-
SurplusCell.new(nil, self, -1)
|
591
|
-
end
|
592
|
-
cols << empty_col
|
593
|
-
end
|
594
|
-
|
595
|
-
@cell_matrix = cols.transpose
|
596
|
-
(mapped_cols + unmapped_cols).transpose
|
516
|
+
@hashes = @rows_hash = @column_names = @rows = @columns = nil
|
597
517
|
end
|
598
518
|
|
599
519
|
def ensure_table(table_or_array) #:nodoc:
|
600
|
-
return table_or_array if DataTable
|
520
|
+
return table_or_array if DataTable == table_or_array.class
|
601
521
|
DataTable.from(table_or_array)
|
602
522
|
end
|
603
523
|
|
604
|
-
def
|
605
|
-
|
606
|
-
end
|
607
|
-
|
608
|
-
def hashes_to_array(hashes) #:nodoc:
|
609
|
-
header = hashes[0].keys.sort
|
610
|
-
[header] + hashes.map{|hash| header.map{|key| hash[key]}}
|
611
|
-
end
|
612
|
-
|
613
|
-
def ensure_green! #:nodoc:
|
614
|
-
each_cell{|cell| cell.status = :passed}
|
615
|
-
end
|
616
|
-
|
617
|
-
def each_cell(&proc) #:nodoc:
|
618
|
-
cell_matrix.each{|row| row.each(&proc)}
|
619
|
-
end
|
620
|
-
|
621
|
-
def mark_as_missing(col) #:nodoc:
|
622
|
-
col.each do |cell|
|
623
|
-
cell.status = :undefined
|
624
|
-
end
|
524
|
+
def symbolize_key(key)
|
525
|
+
key.downcase.tr(' ', '_').to_sym
|
625
526
|
end
|
626
527
|
|
627
528
|
# Represents a row of cells or columns of cells
|
628
529
|
class Cells #:nodoc:
|
629
530
|
include Enumerable
|
630
|
-
include Gherkin::Formatter::Escaping
|
531
|
+
include Cucumber::Gherkin::Formatter::Escaping
|
631
532
|
|
632
533
|
attr_reader :exception
|
633
534
|
|
634
535
|
def initialize(table, cells)
|
635
|
-
@table
|
536
|
+
@table = table
|
537
|
+
@cells = cells
|
636
538
|
end
|
637
539
|
|
638
540
|
def accept(visitor)
|
@@ -645,7 +547,7 @@ module Cucumber
|
|
645
547
|
|
646
548
|
# For testing only
|
647
549
|
def to_sexp #:nodoc:
|
648
|
-
[:row, line, *@cells.map
|
550
|
+
[:row, line, *@cells.map(&:to_sexp)]
|
649
551
|
end
|
650
552
|
|
651
553
|
def to_hash #:nodoc:
|
@@ -679,7 +581,7 @@ module Cucumber
|
|
679
581
|
end
|
680
582
|
|
681
583
|
def width
|
682
|
-
map{|cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0}.max
|
584
|
+
map { |cell| cell.value ? escape_cell(cell.value.to_s).unpack('U*').length : 0 }.max
|
683
585
|
end
|
684
586
|
end
|
685
587
|
|
@@ -688,19 +590,21 @@ module Cucumber
|
|
688
590
|
attr_accessor :status, :value
|
689
591
|
|
690
592
|
def initialize(value, table, line)
|
691
|
-
@value
|
593
|
+
@value = value
|
594
|
+
@table = table
|
595
|
+
@line = line
|
692
596
|
end
|
693
597
|
|
694
598
|
def inspect!
|
695
599
|
@value = "(i) #{value.inspect}"
|
696
600
|
end
|
697
601
|
|
698
|
-
def ==(
|
699
|
-
SurplusCell
|
602
|
+
def ==(other)
|
603
|
+
SurplusCell == other.class || value == other.value
|
700
604
|
end
|
701
605
|
|
702
|
-
def eql?(
|
703
|
-
self ==
|
606
|
+
def eql?(other)
|
607
|
+
self == other
|
704
608
|
end
|
705
609
|
|
706
610
|
def hash
|
@@ -718,7 +622,7 @@ module Cucumber
|
|
718
622
|
:comment
|
719
623
|
end
|
720
624
|
|
721
|
-
def ==(
|
625
|
+
def ==(_other)
|
722
626
|
true
|
723
627
|
end
|
724
628
|
|