opal-rspec 0.8.0.alpha3 → 1.0.0.alpha1
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 +4 -4
- data/.github/workflows/build.yml +7 -7
- data/.gitmodules +6 -0
- data/CHANGELOG.md +16 -1
- data/Gemfile +13 -0
- data/README.md +63 -59
- data/diff-lcs/spec/files_to_exclude.txt +1 -0
- data/diff-lcs/spec/requires.rb +4 -0
- data/diff-lcs/upstream/.autotest +5 -0
- data/diff-lcs/upstream/.fasterer.yml +3 -0
- data/{stubs/diff/lcs.rb → diff-lcs/upstream/.gemtest} +0 -0
- data/diff-lcs/upstream/.github/workflows/ci.yml +64 -0
- data/diff-lcs/upstream/.github/workflows/codeql-analysis.yml +70 -0
- data/diff-lcs/upstream/.gitignore +20 -0
- data/diff-lcs/upstream/.hoerc +52 -0
- data/diff-lcs/upstream/.rspec +1 -0
- data/diff-lcs/upstream/.standard.yml +6 -0
- data/diff-lcs/upstream/Code-of-Conduct.md +74 -0
- data/diff-lcs/upstream/Contributing.md +119 -0
- data/diff-lcs/upstream/Gemfile +28 -0
- data/diff-lcs/upstream/History.md +407 -0
- data/diff-lcs/upstream/License.md +41 -0
- data/diff-lcs/upstream/Manifest.txt +59 -0
- data/diff-lcs/upstream/README.rdoc +84 -0
- data/diff-lcs/upstream/Rakefile +127 -0
- data/diff-lcs/upstream/bin/htmldiff +35 -0
- data/diff-lcs/upstream/bin/ldiff +9 -0
- data/diff-lcs/upstream/diff-lcs.gemspec +48 -0
- data/diff-lcs/upstream/docs/COPYING.txt +339 -0
- data/diff-lcs/upstream/docs/artistic.txt +127 -0
- data/diff-lcs/upstream/lib/diff/lcs/array.rb +7 -0
- data/diff-lcs/upstream/lib/diff/lcs/backports.rb +9 -0
- data/diff-lcs/upstream/lib/diff/lcs/block.rb +37 -0
- data/diff-lcs/upstream/lib/diff/lcs/callbacks.rb +327 -0
- data/diff-lcs/upstream/lib/diff/lcs/change.rb +174 -0
- data/diff-lcs/upstream/lib/diff/lcs/htmldiff.rb +158 -0
- data/diff-lcs/upstream/lib/diff/lcs/hunk.rb +363 -0
- data/diff-lcs/upstream/lib/diff/lcs/internals.rb +308 -0
- data/diff-lcs/upstream/lib/diff/lcs/ldiff.rb +173 -0
- data/diff-lcs/upstream/lib/diff/lcs/string.rb +5 -0
- data/diff-lcs/upstream/lib/diff/lcs.rb +741 -0
- data/diff-lcs/upstream/lib/diff-lcs.rb +3 -0
- data/diff-lcs/upstream/spec/change_spec.rb +89 -0
- data/diff-lcs/upstream/spec/diff_spec.rb +51 -0
- data/diff-lcs/upstream/spec/fixtures/aX +1 -0
- data/diff-lcs/upstream/spec/fixtures/bXaX +1 -0
- data/diff-lcs/upstream/spec/fixtures/ds1.csv +50 -0
- data/diff-lcs/upstream/spec/fixtures/ds2.csv +51 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff +4 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-c +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-e +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-f +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-u +5 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef +4 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-c +15 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-e +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-f +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-u +9 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2 +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-c +20 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-d +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-e +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-f +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-u +16 -0
- data/diff-lcs/upstream/spec/fixtures/new-chef +4 -0
- data/diff-lcs/upstream/spec/fixtures/new-chef2 +17 -0
- data/diff-lcs/upstream/spec/fixtures/old-chef +4 -0
- data/diff-lcs/upstream/spec/fixtures/old-chef2 +14 -0
- data/diff-lcs/upstream/spec/hunk_spec.rb +83 -0
- data/diff-lcs/upstream/spec/issues_spec.rb +160 -0
- data/diff-lcs/upstream/spec/lcs_spec.rb +56 -0
- data/diff-lcs/upstream/spec/ldiff_spec.rb +89 -0
- data/diff-lcs/upstream/spec/patch_spec.rb +416 -0
- data/diff-lcs/upstream/spec/sdiff_spec.rb +216 -0
- data/diff-lcs/upstream/spec/spec_helper.rb +376 -0
- data/diff-lcs/upstream/spec/traverse_balanced_spec.rb +312 -0
- data/diff-lcs/upstream/spec/traverse_sequences_spec.rb +137 -0
- data/lib/opal/rspec/runner.rb +11 -0
- data/lib/opal/rspec/sprockets.rb +6 -0
- data/lib/opal/rspec/version.rb +1 -1
- data/lib/opal/rspec.rb +1 -2
- data/lib-opal/opal/rspec/async/configuration.rb +39 -0
- data/lib-opal/opal/rspec/async/example.rb +80 -168
- data/lib-opal/opal/rspec/async/example_group.rb +71 -81
- data/lib-opal/opal/rspec/async/hooks.rb +98 -8
- data/lib-opal/opal/rspec/async/memoized_helpers.rb +32 -0
- data/lib-opal/opal/rspec/async/reporter.rb +6 -3
- data/lib-opal/opal/rspec/async/runner.rb +33 -24
- data/lib-opal/opal/rspec/async.rb +4 -1
- data/lib-opal/opal/rspec/browser.rb +0 -8
- data/lib-opal/opal/rspec/browser_early.rb +5 -0
- data/lib-opal/opal/rspec/fixes/diff-lcs/hunk.rb +164 -0
- data/lib-opal/opal/rspec/fixes/diff-lcs/lcs.rb +112 -0
- data/lib-opal/opal/rspec/fixes/diff-lcs.rb +2 -0
- data/lib-opal/opal/rspec/fixes/opal.rb +4 -17
- data/lib-opal/opal/rspec/fixes/rspec/core/example_status_persister.rb +11 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +3 -12
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/exception_presenter.rb +28 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +0 -32
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/snippet_extractor.rb +17 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/syntax_highlighter.rb +17 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters.rb +3 -4
- data/lib-opal/opal/rspec/fixes/rspec/core/metadata.rb +24 -8
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +3 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications.rb +0 -2
- data/lib-opal/opal/rspec/fixes/rspec/core.rb +1 -2
- data/lib-opal/opal/rspec/fixes/rspec/expectations.rb +0 -1
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/base_matcher.rb +26 -0
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in.rb +1 -3
- data/lib-opal/opal/rspec/fixes/rspec/matchers/expecteds_for_multiple_diffs.rb +13 -0
- data/lib-opal/opal/rspec/fixes/rspec/matchers.rb +1 -1
- data/lib-opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +26 -10
- data/lib-opal/opal/rspec/fixes/rspec/mocks/proxy.rb +19 -0
- data/lib-opal/opal/rspec/fixes/rspec/mocks.rb +1 -3
- data/lib-opal/opal/rspec/fixes/rspec/support/differ.rb +29 -0
- data/lib-opal/opal/rspec/fixes/rspec/support/encoded_string.rb +9 -5
- data/lib-opal/opal/rspec/fixes/rspec/support/ruby_features.rb +22 -0
- data/lib-opal/opal/rspec/fixes/rspec/support/source.rb +15 -0
- data/lib-opal/opal/rspec/fixes/rspec/support.rb +3 -3
- data/lib-opal/opal/rspec/fixes/rspec.rb +0 -1
- data/lib-opal/opal/rspec/fixes.rb +1 -0
- data/lib-opal/opal/rspec/formatter/document_io.rb +1 -1
- data/lib-opal/opal/rspec/formatter/html_printer.rb +1 -1
- data/lib-opal/opal/rspec/pre_require_fixes.rb +1 -5
- data/lib-opal/opal/rspec/requires.rb +32 -19
- data/lib-opal/opal/rspec/sprockets_runner.rb.erb +1 -0
- data/lib-opal/opal/rspec.rb +3 -0
- data/opal-rspec.gemspec +1 -1
- data/rspec/upstream/.document +1 -1
- data/rspec/upstream/.github/FUNDING.yml +5 -0
- data/rspec/upstream/.gitignore +1 -0
- data/rspec/upstream/LICENSE.md +27 -0
- data/rspec/upstream/README.md +26 -26
- data/rspec/upstream/Rakefile +1 -1
- data/rspec/upstream/certs/rspec.pem +32 -20
- data/rspec/upstream/certs/samphippen.asc +18 -0
- data/rspec/upstream/code_of_conduct.md +59 -0
- data/rspec/upstream/lib/rspec/version.rb +1 -1
- data/rspec/upstream/rspec.gemspec +7 -2
- data/rspec-core/upstream/.document +1 -1
- data/rspec-core/upstream/.github/FUNDING.yml +5 -0
- data/rspec-core/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-core/upstream/.gitignore +2 -0
- data/rspec-core/upstream/.rspec +1 -0
- data/rspec-core/upstream/.rubocop.yml +64 -12
- data/rspec-core/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-core/upstream/.rubocop_todo.yml +1031 -0
- data/rspec-core/upstream/.yardopts +2 -1
- data/rspec-core/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-core/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-core/upstream/CONTRIBUTING.md +86 -0
- data/rspec-core/upstream/Changelog.md +721 -2
- data/rspec-core/upstream/DEV-README.md +2 -2
- data/rspec-core/upstream/DEVELOPMENT.md +131 -0
- data/rspec-core/upstream/Filtering.md +173 -0
- data/rspec-core/upstream/Gemfile +78 -9
- data/rspec-core/upstream/ISSUE_TEMPLATE.md +24 -0
- data/rspec-core/upstream/{License.txt → LICENSE.md} +6 -5
- data/rspec-core/upstream/README.md +165 -24
- data/rspec-core/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-core/upstream/Rakefile +1 -1
- data/rspec-core/upstream/benchmarks/allocations/1000_groups_1_example.rb +124 -0
- data/rspec-core/upstream/benchmarks/allocations/1_group_1000_examples.rb +63 -0
- data/rspec-core/upstream/benchmarks/allocations/helper.rb +30 -0
- data/rspec-core/upstream/benchmarks/allocations/running_1000_groups_1_example.rb +100 -0
- data/rspec-core/upstream/benchmarks/allocations/running_1_group_1000_examples.rb +60 -0
- data/rspec-core/upstream/benchmarks/capture_block_vs_yield.rb +208 -0
- data/rspec-core/upstream/benchmarks/flat_map_vs_inject.rb +55 -0
- data/rspec-core/upstream/benchmarks/hash_functions.rb +74 -0
- data/rspec-core/upstream/benchmarks/keys_each_vs_each_key.rb +43 -0
- data/rspec-core/upstream/benchmarks/module_inclusion_filtering.rb +89 -0
- data/rspec-core/upstream/benchmarks/precalculate_absolute_file_path_or_not.rb +29 -0
- data/rspec-core/upstream/benchmarks/shuffle_vs_sort_by_for_random_ordering.rb +131 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/helper.rb +122 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks.rb +28 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks_module_inclusions_and_shared_context_inclusions.rb +35 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_module_inclusions.rb +28 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_no_config_hooks_or_inclusions.rb +22 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_shared_context_inclusions.rb +28 -0
- data/rspec-core/upstream/benchmarks/threadsafe_let_block.rb +312 -0
- data/rspec-core/upstream/cucumber.yml +7 -2
- data/rspec-core/upstream/features/.nav +5 -1
- data/rspec-core/upstream/features/README.md +2 -2
- data/rspec-core/upstream/features/clear_examples.feature +106 -0
- data/rspec-core/upstream/features/command_line/bisect.feature +178 -0
- data/rspec-core/upstream/features/command_line/example_matches_name_option.feature +131 -0
- data/rspec-core/upstream/features/command_line/example_name_option.feature +2 -0
- data/rspec-core/upstream/features/command_line/fail_fast.feature +21 -4
- data/rspec-core/upstream/features/command_line/init.feature +2 -2
- data/rspec-core/upstream/features/command_line/line_number_appended_to_path.feature +2 -2
- data/rspec-core/upstream/features/command_line/only_failures.feature +113 -0
- data/rspec-core/upstream/features/command_line/order.md +8 -1
- data/rspec-core/upstream/features/command_line/pattern_option.feature +6 -3
- data/rspec-core/upstream/features/command_line/rake_task.feature +3 -3
- data/rspec-core/upstream/features/command_line/randomization.feature +5 -2
- data/rspec-core/upstream/features/command_line/ruby.feature +6 -2
- data/rspec-core/upstream/features/command_line/tag.feature +13 -11
- data/rspec-core/upstream/features/command_line/warnings_option.feature +20 -3
- data/rspec-core/upstream/features/configuration/backtrace_exclusion_patterns.feature +45 -29
- data/rspec-core/upstream/features/configuration/color.feature +22 -0
- data/rspec-core/upstream/features/configuration/custom_settings.feature +9 -13
- data/rspec-core/upstream/features/configuration/default_path.feature +1 -1
- data/rspec-core/upstream/features/configuration/enable_global_dsl.feature +15 -1
- data/rspec-core/upstream/features/configuration/error_exit_code.feature +52 -0
- data/rspec-core/upstream/features/configuration/fail_fast.feature +42 -12
- data/rspec-core/upstream/features/configuration/fail_if_no_examples.feature +31 -0
- data/rspec-core/upstream/features/configuration/failure_exit_code.feature +26 -0
- data/rspec-core/upstream/features/configuration/overriding_global_ordering.feature +1 -1
- data/rspec-core/upstream/features/configuration/pattern.feature +1 -1
- data/rspec-core/upstream/features/configuration/profile.feature +25 -0
- data/rspec-core/upstream/features/configuration/read_options_from_file.feature +25 -19
- data/rspec-core/upstream/features/configuration/run_all_when_everything_filtered.feature +4 -0
- data/rspec-core/upstream/features/core_standalone.feature +2 -0
- data/rspec-core/upstream/features/example_groups/basic_structure.feature +1 -0
- data/rspec-core/upstream/features/example_groups/shared_context.feature +55 -5
- data/rspec-core/upstream/features/example_groups/shared_examples.feature +59 -15
- data/rspec-core/upstream/features/expectation_framework_integration/aggregating_failures.feature +602 -0
- data/rspec-core/upstream/features/expectation_framework_integration/configure_expectation_framework.feature +13 -5
- data/rspec-core/upstream/features/filtering/filter_run_when_matching.feature +75 -0
- data/rspec-core/upstream/features/formatters/configurable_colors.feature +23 -4
- data/rspec-core/upstream/features/helper_methods/let.feature +3 -0
- data/rspec-core/upstream/features/helper_methods/modules.feature +6 -0
- data/rspec-core/upstream/features/hooks/around_hooks.feature +36 -6
- data/rspec-core/upstream/features/hooks/before_and_after_hooks.feature +47 -5
- data/rspec-core/upstream/features/hooks/filtering.feature +199 -4
- data/rspec-core/upstream/features/hooks/when_first_matching_example_defined.feature +70 -0
- data/rspec-core/upstream/features/metadata/current_scope.feature +87 -0
- data/rspec-core/upstream/features/metadata/described_class.feature +12 -5
- data/rspec-core/upstream/features/metadata/user_defined.feature +3 -3
- data/rspec-core/upstream/features/mock_framework_integration/use_any_framework.feature +1 -1
- data/rspec-core/upstream/features/mock_framework_integration/use_flexmock.feature +5 -5
- data/rspec-core/upstream/features/mock_framework_integration/use_mocha.feature +5 -5
- data/rspec-core/upstream/features/mock_framework_integration/use_rr.feature +5 -5
- data/rspec-core/upstream/features/mock_framework_integration/use_rspec.feature +6 -6
- data/rspec-core/upstream/features/pending_and_skipped_examples/pending_examples.feature +8 -7
- data/rspec-core/upstream/features/pending_and_skipped_examples/skipped_examples.feature +49 -22
- data/rspec-core/upstream/features/step_definitions/additional_cli_steps.rb +142 -12
- data/rspec-core/upstream/features/step_definitions/core_standalone_steps.rb +6 -2
- data/rspec-core/upstream/features/subject/implicit_subject.feature +3 -2
- data/rspec-core/upstream/features/subject/one_liner_syntax.feature +9 -5
- data/rspec-core/upstream/features/support/diff_lcs_versions.rb +17 -0
- data/rspec-core/upstream/features/support/env.rb +20 -7
- data/rspec-core/upstream/features/support/jruby.rb +8 -0
- data/rspec-core/upstream/features/support/require_expect_syntax_in_aruba_specs.rb +6 -3
- data/rspec-core/upstream/features/support/rubinius.rb +5 -1
- data/rspec-core/upstream/features/support/ruby_27_support.rb +7 -0
- data/rspec-core/upstream/features/support/send_sigint_during_bisect.rb +21 -0
- data/rspec-core/upstream/lib/rspec/autorun.rb +1 -0
- data/rspec-core/upstream/lib/rspec/core/backtrace_formatter.rb +3 -4
- data/rspec-core/upstream/lib/rspec/core/bisect/coordinator.rb +62 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/example_minimizer.rb +173 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/fork_runner.rb +138 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/server.rb +61 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/shell_command.rb +126 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/shell_runner.rb +73 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/utilities.rb +69 -0
- data/rspec-core/upstream/lib/rspec/core/configuration.rb +1157 -212
- data/rspec-core/upstream/lib/rspec/core/configuration_options.rb +82 -22
- data/rspec-core/upstream/lib/rspec/core/did_you_mean.rb +46 -0
- data/rspec-core/upstream/lib/rspec/core/drb.rb +10 -1
- data/rspec-core/upstream/lib/rspec/core/dsl.rb +10 -5
- data/rspec-core/upstream/lib/rspec/core/example.rb +271 -107
- data/rspec-core/upstream/lib/rspec/core/example_group.rb +426 -127
- data/rspec-core/upstream/lib/rspec/core/example_status_persister.rb +235 -0
- data/rspec-core/upstream/lib/rspec/core/filter_manager.rb +76 -104
- data/rspec-core/upstream/lib/rspec/core/flat_map.rb +6 -4
- data/rspec-core/upstream/lib/rspec/core/formatters/base_bisect_formatter.rb +45 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/base_formatter.rb +7 -4
- data/rspec-core/upstream/lib/rspec/core/formatters/base_text_formatter.rb +15 -16
- data/rspec-core/upstream/lib/rspec/core/formatters/bisect_drb_formatter.rb +29 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/bisect_progress_formatter.rb +157 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/console_codes.rb +28 -16
- data/rspec-core/upstream/lib/rspec/core/formatters/deprecation_formatter.rb +14 -13
- data/rspec-core/upstream/lib/rspec/core/formatters/documentation_formatter.rb +47 -13
- data/rspec-core/upstream/lib/rspec/core/formatters/exception_presenter.rb +525 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/failure_list_formatter.rb +23 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/helpers.rb +40 -9
- data/rspec-core/upstream/lib/rspec/core/formatters/html_formatter.rb +20 -16
- data/rspec-core/upstream/lib/rspec/core/formatters/html_printer.rb +27 -18
- data/rspec-core/upstream/lib/rspec/core/formatters/html_snippet_extractor.rb +120 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/json_formatter.rb +15 -7
- data/rspec-core/upstream/lib/rspec/core/formatters/profile_formatter.rb +10 -7
- data/rspec-core/upstream/lib/rspec/core/formatters/progress_formatter.rb +1 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/protocol.rb +62 -43
- data/rspec-core/upstream/lib/rspec/core/formatters/snippet_extractor.rb +115 -85
- data/rspec-core/upstream/lib/rspec/core/formatters/syntax_highlighter.rb +91 -0
- data/rspec-core/upstream/lib/rspec/core/formatters.rb +71 -32
- data/rspec-core/upstream/lib/rspec/core/hooks.rb +303 -248
- data/rspec-core/upstream/lib/rspec/core/invocations.rb +87 -0
- data/rspec-core/upstream/lib/rspec/core/memoized_helpers.rb +155 -47
- data/rspec-core/upstream/lib/rspec/core/metadata.rb +102 -41
- data/rspec-core/upstream/lib/rspec/core/metadata_filter.rb +209 -49
- data/rspec-core/upstream/lib/rspec/core/minitest_assertions_adapter.rb +5 -2
- data/rspec-core/upstream/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
- data/rspec-core/upstream/lib/rspec/core/mocking_adapters/mocha.rb +8 -8
- data/rspec-core/upstream/lib/rspec/core/notifications.rb +180 -201
- data/rspec-core/upstream/lib/rspec/core/option_parser.rb +159 -58
- data/rspec-core/upstream/lib/rspec/core/ordering.rb +40 -26
- data/rspec-core/upstream/lib/rspec/core/output_wrapper.rb +29 -0
- data/rspec-core/upstream/lib/rspec/core/pending.rb +19 -25
- data/rspec-core/upstream/lib/rspec/core/profiler.rb +34 -0
- data/rspec-core/upstream/lib/rspec/core/project_initializer/.rspec +0 -1
- data/rspec-core/upstream/lib/rspec/core/project_initializer/spec/spec_helper.rb +31 -22
- data/rspec-core/upstream/lib/rspec/core/project_initializer.rb +1 -1
- data/rspec-core/upstream/lib/rspec/core/rake_task.rb +73 -72
- data/rspec-core/upstream/lib/rspec/core/reporter.rb +134 -18
- data/rspec-core/upstream/lib/rspec/core/ruby_project.rb +13 -5
- data/rspec-core/upstream/lib/rspec/core/runner.rb +99 -45
- data/rspec-core/upstream/lib/rspec/core/sandbox.rb +37 -0
- data/rspec-core/upstream/lib/rspec/core/set.rb +54 -0
- data/rspec-core/upstream/lib/rspec/core/shared_example_group.rb +126 -37
- data/rspec-core/upstream/lib/rspec/core/shell_escape.rb +49 -0
- data/rspec-core/upstream/lib/rspec/core/test_unit_assertions_adapter.rb +3 -3
- data/rspec-core/upstream/lib/rspec/core/version.rb +1 -1
- data/rspec-core/upstream/lib/rspec/core/warnings.rb +2 -2
- data/rspec-core/upstream/lib/rspec/core/world.rb +164 -60
- data/rspec-core/upstream/lib/rspec/core.rb +64 -21
- data/rspec-core/upstream/maintenance-branch +1 -1
- data/rspec-core/upstream/rspec-core.gemspec +16 -11
- data/rspec-core/upstream/script/ci_functions.sh +73 -0
- data/rspec-core/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-core/upstream/script/cucumber.sh +8 -0
- data/rspec-core/upstream/script/custom_build_functions.sh +22 -0
- data/rspec-core/upstream/script/functions.sh +125 -89
- data/rspec-core/upstream/script/legacy_setup.sh +20 -0
- data/rspec-core/upstream/script/predicate_functions.sh +162 -0
- data/rspec-core/upstream/script/rspec_with_simplecov +6 -6
- data/rspec-core/upstream/script/run_build +14 -9
- data/rspec-core/upstream/script/run_rubocop +14 -0
- data/rspec-core/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/rspec-expectations/upstream/.document +1 -1
- data/rspec-expectations/upstream/.github/FUNDING.yml +5 -0
- data/rspec-expectations/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-expectations/upstream/.gitignore +2 -0
- data/rspec-expectations/upstream/.rubocop.yml +126 -2
- data/rspec-expectations/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-expectations/upstream/.rubocop_todo.yml +335 -0
- data/rspec-expectations/upstream/.yardopts +1 -1
- data/rspec-expectations/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-expectations/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-expectations/upstream/CONTRIBUTING.md +86 -0
- data/rspec-expectations/upstream/Changelog.md +454 -4
- data/rspec-expectations/upstream/DEV-README.md +3 -3
- data/rspec-expectations/upstream/DEVELOPMENT.md +131 -0
- data/rspec-expectations/upstream/Gemfile +77 -9
- data/rspec-expectations/upstream/ISSUE_TEMPLATE.md +24 -0
- data/{rspec-mocks/upstream/License.txt → rspec-expectations/upstream/LICENSE.md} +5 -4
- data/rspec-expectations/upstream/README.md +73 -31
- data/rspec-expectations/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-expectations/upstream/Rakefile +13 -10
- data/rspec-expectations/upstream/Should.md +13 -5
- data/rspec-expectations/upstream/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +1 -2
- data/rspec-expectations/upstream/benchmarks/caller_vs_raise_for_backtrace.rb +77 -0
- data/rspec-expectations/upstream/benchmarks/count_vs_select_size.rb +68 -0
- data/rspec-expectations/upstream/benchmarks/default_messages_as_methods_v_blocks.rb +1 -1
- data/rspec-expectations/upstream/benchmarks/gsub_vs_tr_single_character.rb +28 -0
- data/rspec-expectations/upstream/benchmarks/include_matcher.rb +249 -0
- data/rspec-expectations/upstream/benchmarks/include_v_superclass.rb +0 -1
- data/rspec-expectations/upstream/benchmarks/match_array/failing_with_duplicate_items.rb +1 -1
- data/rspec-expectations/upstream/benchmarks/output_stringio_vs_tempfile.rb +31 -0
- data/rspec-expectations/upstream/benchmarks/set_vs_array_include.rb +1 -3
- data/rspec-expectations/upstream/cucumber.yml +9 -4
- data/rspec-expectations/upstream/features/.nav +1 -0
- data/rspec-expectations/upstream/features/aggregating_failures.feature +56 -0
- data/rspec-expectations/upstream/features/built_in_matchers/README.md +3 -3
- data/rspec-expectations/upstream/features/built_in_matchers/all.feature +3 -2
- data/rspec-expectations/upstream/features/built_in_matchers/be_within.feature +1 -1
- data/rspec-expectations/upstream/features/built_in_matchers/change.feature +8 -6
- data/rspec-expectations/upstream/features/built_in_matchers/comparisons.feature +33 -1
- data/rspec-expectations/upstream/features/built_in_matchers/contain_exactly.feature +1 -0
- data/rspec-expectations/upstream/features/built_in_matchers/cover.feature +3 -3
- data/rspec-expectations/upstream/features/built_in_matchers/exist.feature +1 -1
- data/rspec-expectations/upstream/features/built_in_matchers/have_attributes.feature +1 -2
- data/rspec-expectations/upstream/features/built_in_matchers/include.feature +74 -17
- data/rspec-expectations/upstream/features/built_in_matchers/match.feature +2 -2
- data/rspec-expectations/upstream/features/built_in_matchers/output.feature +67 -4
- data/rspec-expectations/upstream/features/built_in_matchers/predicates.feature +56 -19
- data/rspec-expectations/upstream/features/built_in_matchers/raise_error.feature +16 -2
- data/rspec-expectations/upstream/features/built_in_matchers/respond_to.feature +191 -3
- data/rspec-expectations/upstream/features/built_in_matchers/satisfy.feature +17 -8
- data/rspec-expectations/upstream/features/built_in_matchers/throw_symbol.feature +1 -1
- data/rspec-expectations/upstream/features/built_in_matchers/types.feature +34 -34
- data/rspec-expectations/upstream/features/built_in_matchers/yield.feature +2 -2
- data/rspec-expectations/upstream/features/composing_matchers.feature +4 -4
- data/rspec-expectations/upstream/features/custom_matchers/define_block_matcher.feature +78 -0
- data/rspec-expectations/upstream/features/custom_matchers/define_diffable_matcher.feature +115 -3
- data/rspec-expectations/upstream/features/custom_matchers/define_matcher.feature +173 -21
- data/rspec-expectations/upstream/features/custom_matchers/define_matcher_with_fluent_interface.feature +21 -2
- data/rspec-expectations/upstream/features/define_negated_matcher.feature +2 -1
- data/rspec-expectations/upstream/features/diffing.feature +29 -1
- data/rspec-expectations/upstream/features/implicit_docstrings.feature +8 -8
- data/rspec-expectations/upstream/features/step_definitions/additional_cli_steps.rb +11 -7
- data/rspec-expectations/upstream/features/support/diff_lcs_versions.rb +25 -0
- data/rspec-expectations/upstream/features/support/disallow_certain_apis.rb +3 -3
- data/rspec-expectations/upstream/features/support/env.rb +11 -11
- data/rspec-expectations/upstream/features/support/rubinius.rb +1 -1
- data/rspec-expectations/upstream/features/support/ruby_features.rb +39 -0
- data/rspec-expectations/upstream/features/syntax_configuration.feature +9 -9
- data/rspec-expectations/upstream/features/test_frameworks/minitest.feature +69 -2
- data/rspec-expectations/upstream/lib/rspec/expectations/block_snippet_extractor.rb +253 -0
- data/rspec-expectations/upstream/lib/rspec/expectations/configuration.rb +84 -1
- data/rspec-expectations/upstream/lib/rspec/expectations/expectation_target.rb +82 -38
- data/rspec-expectations/upstream/lib/rspec/expectations/fail_with.rb +11 -6
- data/rspec-expectations/upstream/lib/rspec/expectations/failure_aggregator.rb +212 -0
- data/rspec-expectations/upstream/lib/rspec/expectations/handler.rb +27 -12
- data/rspec-expectations/upstream/lib/rspec/expectations/minitest_integration.rb +43 -2
- data/rspec-expectations/upstream/lib/rspec/expectations/syntax.rb +5 -5
- data/rspec-expectations/upstream/lib/rspec/expectations/version.rb +1 -1
- data/rspec-expectations/upstream/lib/rspec/expectations.rb +15 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/all.rb +1 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/base_matcher.rb +77 -11
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be.rb +28 -114
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_between.rb +1 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_instance_of.rb +5 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_kind_of.rb +5 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_within.rb +4 -4
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/change.rb +168 -55
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/compound.rb +61 -29
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/contain_exactly.rb +73 -12
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/count_expectation.rb +169 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eq.rb +3 -38
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eql.rb +2 -2
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/equal.rb +3 -3
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/exist.rb +7 -3
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/has.rb +90 -24
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/have_attributes.rb +37 -7
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/include.rb +124 -23
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/match.rb +79 -2
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/operators.rb +14 -5
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/output.rb +56 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/raise_error.rb +126 -29
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/respond_to.rb +118 -9
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/satisfy.rb +28 -7
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/{start_and_end_with.rb → start_or_end_with.rb} +20 -8
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/throw_symbol.rb +11 -5
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/yield.rb +110 -155
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in.rb +4 -3
- data/rspec-expectations/upstream/lib/rspec/matchers/composable.rb +23 -35
- data/rspec-expectations/upstream/lib/rspec/matchers/dsl.rb +179 -26
- data/rspec-expectations/upstream/lib/rspec/matchers/english_phrasing.rb +58 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +82 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/fail_matchers.rb +42 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/generated_descriptions.rb +1 -2
- data/rspec-expectations/upstream/lib/rspec/matchers/matcher_delegator.rb +2 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/matcher_protocol.rb +72 -66
- data/rspec-expectations/upstream/lib/rspec/matchers.rb +227 -150
- data/rspec-expectations/upstream/maintenance-branch +1 -1
- data/rspec-expectations/upstream/rspec-expectations.gemspec +13 -8
- data/rspec-expectations/upstream/script/ci_functions.sh +73 -0
- data/rspec-expectations/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-expectations/upstream/script/cucumber.sh +8 -0
- data/rspec-expectations/upstream/script/functions.sh +125 -89
- data/rspec-expectations/upstream/script/legacy_setup.sh +20 -0
- data/rspec-expectations/upstream/script/predicate_functions.sh +162 -0
- data/rspec-expectations/upstream/script/run_build +14 -9
- data/rspec-expectations/upstream/script/run_rubocop +14 -0
- data/rspec-expectations/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/rspec-mocks/upstream/.document +1 -1
- data/rspec-mocks/upstream/.github/FUNDING.yml +5 -0
- data/rspec-mocks/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-mocks/upstream/.gitignore +2 -0
- data/rspec-mocks/upstream/.rubocop.yml +28 -9
- data/rspec-mocks/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-mocks/upstream/.rubocop_todo.yml +573 -0
- data/rspec-mocks/upstream/.yardopts +1 -1
- data/rspec-mocks/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-mocks/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-mocks/upstream/CONTRIBUTING.md +86 -0
- data/rspec-mocks/upstream/Changelog.md +398 -3
- data/rspec-mocks/upstream/DEV-README.md +3 -3
- data/rspec-mocks/upstream/DEVELOPMENT.md +131 -0
- data/rspec-mocks/upstream/Gemfile +77 -10
- data/rspec-mocks/upstream/ISSUE_TEMPLATE.md +24 -0
- data/{rspec-expectations/upstream/License.txt → rspec-mocks/upstream/LICENSE.md} +5 -4
- data/rspec-mocks/upstream/README.md +83 -17
- data/rspec-mocks/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-mocks/upstream/Rakefile +3 -3
- data/rspec-mocks/upstream/benchmarks/accessing_configuration_via_method_vs_cache.rb +52 -0
- data/rspec-mocks/upstream/benchmarks/allocations/1_object_1000_mocks.rb +76 -0
- data/rspec-mocks/upstream/benchmarks/allocations/helper.rb +17 -0
- data/rspec-mocks/upstream/benchmarks/each_value_v_values_each.rb +4 -5
- data/rspec-mocks/upstream/benchmarks/find_original_method_early.rb +1 -1
- data/rspec-mocks/upstream/benchmarks/method_defined_at_any_visibility.rb +3 -3
- data/rspec-mocks/upstream/benchmarks/thread_safety.rb +1 -1
- data/rspec-mocks/upstream/benchmarks/transfer_nested_constants.rb +1 -1
- data/rspec-mocks/upstream/cucumber.yml +8 -1
- data/rspec-mocks/upstream/features/.nav +2 -0
- data/rspec-mocks/upstream/features/basics/allowing_messages.feature +1 -1
- data/rspec-mocks/upstream/features/basics/expecting_messages.feature +40 -1
- data/rspec-mocks/upstream/features/basics/null_object_doubles.feature +1 -1
- data/rspec-mocks/upstream/features/basics/partial_test_doubles.feature +1 -1
- data/rspec-mocks/upstream/features/basics/scope.feature +5 -5
- data/rspec-mocks/upstream/features/basics/spies.feature +17 -30
- data/rspec-mocks/upstream/features/basics/test_doubles.feature +4 -4
- data/rspec-mocks/upstream/features/configuring_responses/README.md +2 -0
- data/rspec-mocks/upstream/features/configuring_responses/calling_the_original_implementation.feature +2 -2
- data/rspec-mocks/upstream/features/configuring_responses/mixed_responses.feature +25 -0
- data/rspec-mocks/upstream/features/configuring_responses/raising_an_error.feature +1 -0
- data/rspec-mocks/upstream/features/configuring_responses/wrapping_the_original_implementation.feature +3 -3
- data/rspec-mocks/upstream/features/configuring_responses/yielding.feature +2 -2
- data/rspec-mocks/upstream/features/mutating_constants/README.md +1 -1
- data/rspec-mocks/upstream/features/old_syntax/any_instance.feature +3 -3
- data/rspec-mocks/upstream/features/old_syntax/should_receive.feature +3 -1
- data/rspec-mocks/upstream/features/outside_rspec/any_test_framework.feature +116 -0
- data/rspec-mocks/upstream/features/outside_rspec/minitest.feature +202 -46
- data/rspec-mocks/upstream/features/outside_rspec/standalone.feature +5 -5
- data/rspec-mocks/upstream/features/setting_constraints/matching_arguments.feature +54 -27
- data/rspec-mocks/upstream/features/setting_constraints/message_order.feature +2 -2
- data/rspec-mocks/upstream/features/setting_constraints/receive_counts.feature +18 -0
- data/rspec-mocks/upstream/features/step_definitions/additional_cli_steps.rb +4 -4
- data/rspec-mocks/upstream/features/support/disallow_certain_apis.rb +3 -2
- data/rspec-mocks/upstream/features/support/env.rb +12 -12
- data/rspec-mocks/upstream/features/support/rubinius.rb +1 -1
- data/rspec-mocks/upstream/features/verifying_doubles/README.md +2 -2
- data/rspec-mocks/upstream/features/verifying_doubles/class_doubles.feature +1 -1
- data/rspec-mocks/upstream/features/verifying_doubles/dynamic_classes.feature +41 -5
- data/rspec-mocks/upstream/features/verifying_doubles/instance_doubles.feature +5 -3
- data/rspec-mocks/upstream/features/working_with_legacy_code/any_instance.feature +8 -6
- data/rspec-mocks/upstream/features/working_with_legacy_code/message_chains.feature +16 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/chain.rb +3 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expect_chain_chain.rb +1 -5
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expectation_chain.rb +7 -5
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/message_chains.rb +1 -3
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/recorder.rb +42 -14
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain.rb +13 -7
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain_chain.rb +1 -5
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance.rb +1 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/argument_list_matcher.rb +53 -10
- data/rspec-mocks/upstream/lib/rspec/mocks/argument_matchers.rb +66 -26
- data/rspec-mocks/upstream/lib/rspec/mocks/configuration.rb +59 -4
- data/rspec-mocks/upstream/lib/rspec/mocks/error_generator.rb +235 -108
- data/rspec-mocks/upstream/lib/rspec/mocks/example_methods.rb +82 -27
- data/rspec-mocks/upstream/lib/rspec/mocks/instance_method_stasher.rb +12 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/have_received.rb +30 -17
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive.rb +28 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_message_chain.rb +17 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_messages.rb +6 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/message_chain.rb +0 -4
- data/rspec-mocks/upstream/lib/rspec/mocks/message_expectation.rb +430 -304
- data/rspec-mocks/upstream/lib/rspec/mocks/method_double.rb +46 -15
- data/rspec-mocks/upstream/lib/rspec/mocks/method_reference.rb +78 -19
- data/rspec-mocks/upstream/lib/rspec/mocks/minitest_integration.rb +68 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/mutate_const.rb +23 -8
- data/rspec-mocks/upstream/lib/rspec/mocks/object_reference.rb +81 -23
- data/rspec-mocks/upstream/lib/rspec/mocks/proxy.rb +135 -41
- data/rspec-mocks/upstream/lib/rspec/mocks/space.rb +33 -16
- data/rspec-mocks/upstream/lib/rspec/mocks/standalone.rb +1 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/syntax.rb +18 -22
- data/rspec-mocks/upstream/lib/rspec/mocks/targets.rb +51 -24
- data/rspec-mocks/upstream/lib/rspec/mocks/test_double.rb +42 -6
- data/rspec-mocks/upstream/lib/rspec/mocks/verifying_double.rb +15 -21
- data/rspec-mocks/upstream/lib/rspec/mocks/{verifying_message_expecation.rb → verifying_message_expectation.rb} +11 -18
- data/rspec-mocks/upstream/lib/rspec/mocks/verifying_proxy.rb +60 -11
- data/rspec-mocks/upstream/lib/rspec/mocks/version.rb +1 -1
- data/rspec-mocks/upstream/lib/rspec/mocks.rb +8 -1
- data/rspec-mocks/upstream/maintenance-branch +1 -1
- data/rspec-mocks/upstream/rspec-mocks.gemspec +14 -6
- data/rspec-mocks/upstream/script/ci_functions.sh +73 -0
- data/rspec-mocks/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-mocks/upstream/script/cucumber.sh +8 -0
- data/rspec-mocks/upstream/script/functions.sh +125 -89
- data/rspec-mocks/upstream/script/legacy_setup.sh +20 -0
- data/rspec-mocks/upstream/script/predicate_functions.sh +162 -0
- data/rspec-mocks/upstream/script/run_build +14 -9
- data/rspec-mocks/upstream/script/run_rubocop +14 -0
- data/rspec-mocks/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/{stubs/diff/lcs/assertions.rb → rspec-mocks/upstream/tmp/.gitkeep} +0 -0
- data/rspec-support/upstream/.github/FUNDING.yml +5 -0
- data/rspec-support/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-support/upstream/.gitignore +4 -0
- data/rspec-support/upstream/.rubocop.yml +33 -1
- data/rspec-support/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-support/upstream/.rubocop_todo.yml +424 -0
- data/rspec-support/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-support/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-support/upstream/CONTRIBUTING.md +86 -0
- data/rspec-support/upstream/Changelog.md +287 -0
- data/rspec-support/upstream/DEVELOPMENT.md +131 -0
- data/rspec-support/upstream/Gemfile +52 -4
- data/rspec-support/upstream/ISSUE_TEMPLATE.md +24 -0
- data/rspec-support/upstream/{LICENSE.txt → LICENSE.md} +3 -2
- data/rspec-support/upstream/README.md +29 -6
- data/rspec-support/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-support/upstream/Rakefile +9 -5
- data/rspec-support/upstream/benchmarks/caller_vs_caller_locations.rb +19 -0
- data/rspec-support/upstream/benchmarks/caller_vs_caller_locations_vs_raise.rb +153 -0
- data/rspec-support/upstream/benchmarks/class_exec_vs_klass_exec.rb +43 -0
- data/rspec-support/upstream/benchmarks/map_hash.rb +70 -0
- data/rspec-support/upstream/benchmarks/ripper.rb +44 -0
- data/rspec-support/upstream/benchmarks/skip_frames_for_caller_filter.rb +27 -0
- data/rspec-support/upstream/lib/rspec/support/caller_filter.rb +35 -15
- data/rspec-support/upstream/lib/rspec/support/comparable_version.rb +46 -0
- data/rspec-support/upstream/lib/rspec/support/differ.rb +35 -34
- data/rspec-support/upstream/lib/rspec/support/directory_maker.rb +3 -1
- data/rspec-support/upstream/lib/rspec/support/encoded_string.rb +103 -11
- data/rspec-support/upstream/lib/rspec/support/fuzzy_matcher.rb +5 -5
- data/rspec-support/upstream/lib/rspec/support/matcher_definition.rb +11 -0
- data/rspec-support/upstream/lib/rspec/support/method_signature_verifier.rb +192 -26
- data/rspec-support/upstream/lib/rspec/support/mutex.rb +73 -0
- data/rspec-support/upstream/lib/rspec/support/object_formatter.rb +275 -0
- data/rspec-support/upstream/lib/rspec/support/recursive_const_methods.rb +1 -1
- data/rspec-support/upstream/lib/rspec/support/reentrant_mutex.rb +78 -0
- data/rspec-support/upstream/lib/rspec/support/ruby_features.rb +168 -15
- data/rspec-support/upstream/lib/rspec/support/source/location.rb +21 -0
- data/rspec-support/upstream/lib/rspec/support/source/node.rb +110 -0
- data/rspec-support/upstream/lib/rspec/support/source/token.rb +94 -0
- data/rspec-support/upstream/lib/rspec/support/source.rb +85 -0
- data/rspec-support/upstream/lib/rspec/support/spec/deprecation_helpers.rb +17 -29
- data/rspec-support/upstream/lib/rspec/support/spec/diff_helpers.rb +31 -0
- data/rspec-support/upstream/lib/rspec/support/spec/in_sub_process.rb +41 -17
- data/rspec-support/upstream/lib/rspec/support/spec/library_wide_checks.rb +150 -0
- data/rspec-support/upstream/lib/rspec/support/spec/shell_out.rb +39 -3
- data/rspec-support/upstream/lib/rspec/support/spec/stderr_splitter.rb +27 -4
- data/rspec-support/upstream/lib/rspec/support/spec/string_matcher.rb +45 -0
- data/rspec-support/upstream/lib/rspec/support/spec/with_isolated_directory.rb +5 -1
- data/rspec-support/upstream/lib/rspec/support/spec.rb +17 -7
- data/rspec-support/upstream/lib/rspec/support/version.rb +1 -1
- data/rspec-support/upstream/lib/rspec/support/warnings.rb +3 -3
- data/rspec-support/upstream/lib/rspec/support/with_keywords_when_needed.rb +33 -0
- data/rspec-support/upstream/lib/rspec/support.rb +81 -3
- data/rspec-support/upstream/maintenance-branch +1 -1
- data/rspec-support/upstream/rspec-support.gemspec +10 -4
- data/rspec-support/upstream/script/ci_functions.sh +73 -0
- data/rspec-support/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-support/upstream/script/cucumber.sh +8 -0
- data/rspec-support/upstream/script/functions.sh +125 -89
- data/rspec-support/upstream/script/legacy_setup.sh +20 -0
- data/rspec-support/upstream/script/predicate_functions.sh +162 -0
- data/rspec-support/upstream/script/run_build +14 -9
- data/rspec-support/upstream/script/run_rubocop +14 -0
- data/rspec-support/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/stubs/{diff/lcs/block.rb → coderay.rb} +0 -0
- data/stubs/{diff/lcs/callbacks.rb → drb/acl.rb} +0 -0
- data/stubs/{diff/lcs/change.rb → erb/version.rb} +0 -0
- data/stubs/{diff/lcs/hunk.rb → open3.rb} +0 -0
- data/stubs/{diff/lcs/internals.rb → psych.rb} +0 -0
- data/stubs/{optparse.rb → ripper.rb} +0 -0
- data/stubs/{prettyprint.rb → thread_order.rb} +0 -0
- data/tasks/testing.rake +7 -3
- metadata +270 -61
- data/gemfiles/.bundle/config +0 -2
- data/gemfiles/opal_0.11.gemfile +0 -14
- data/gemfiles/opal_master.gemfile +0 -14
- data/lib-opal/opal/rspec/async/core_ext.rb +0 -23
- data/lib-opal/opal/rspec/async/legacy.rb +0 -49
- data/lib-opal/opal/rspec/fixes/rspec/caller_filter.rb +0 -6
- data/lib-opal/opal/rspec/fixes/rspec/core/example.rb +0 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +0 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +0 -11
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +0 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +0 -21
- data/lib-opal/opal/rspec/fixes/rspec/core/warnings.rb +0 -27
- data/lib-opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +0 -21
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +0 -10
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +0 -21
- data/lib-opal/opal/rspec/fixes/rspec/matchers/pretty.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/mocks/space.rb +0 -41
- data/lib-opal/opal/rspec/fixes/rspec/mocks/test_double.rb +0 -39
- data/lib-opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +0 -29
- data/lib-opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +0 -7
- data/lib-opal/opal/rspec/fixes/rspec/support/spec/stderr_splitter.rb +0 -13
- data/lib-opal/opal/rspec/fixes/rspec/support/spec.rb +0 -1
- data/lib-opal/opal/rspec/fixes/rspec/support/warnings.rb +0 -16
- data/rspec/upstream/License.txt +0 -24
- data/rspec-core/upstream/.travis.yml +0 -35
- data/rspec-core/upstream/benchmarks/sort_by_v_shuffle.rb +0 -83
- data/rspec-core/upstream/features/Upgrade.md +0 -352
- data/rspec-core/upstream/lib/rspec/core/backport_random.rb +0 -336
- data/rspec-expectations/upstream/.travis.yml +0 -35
- data/rspec-expectations/upstream/lib/rspec/matchers/pretty.rb +0 -77
- data/rspec-mocks/upstream/.travis.yml +0 -35
- data/rspec-support/upstream/.travis.yml +0 -35
- data/rspec-support/upstream/lib/rspec/support/os.rb +0 -18
- data/rspec-support/upstream/lib/rspec/support/spec/prevent_load_time_warnings.rb +0 -44
- data/rspec-support/upstream/lib/rspec/support/version_checker.rb +0 -53
- data/stubs/shellwords.rb +0 -0
- data/stubs/uri.rb +0 -0
- data/vendor/spec_runner.js +0 -64
|
@@ -3,13 +3,14 @@ RSpec::Support.require_rspec_support 'matcher_definition'
|
|
|
3
3
|
RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) }
|
|
4
4
|
|
|
5
5
|
%w[
|
|
6
|
-
|
|
6
|
+
english_phrasing
|
|
7
7
|
composable
|
|
8
8
|
built_in
|
|
9
9
|
generated_descriptions
|
|
10
10
|
dsl
|
|
11
11
|
matcher_delegator
|
|
12
12
|
aliased_matcher
|
|
13
|
+
expecteds_for_multiple_diffs
|
|
13
14
|
].each { |file| RSpec::Support.require_rspec_matchers(file) }
|
|
14
15
|
|
|
15
16
|
# RSpec's top level namespace. All of rspec-expectations is contained
|
|
@@ -35,14 +36,14 @@ module RSpec
|
|
|
35
36
|
# expect([]).to be_empty # => [].empty?() | passes
|
|
36
37
|
# expect([]).not_to be_empty # => [].empty?() | fails
|
|
37
38
|
#
|
|
38
|
-
# In
|
|
39
|
+
# In addition to prefixing the predicate matchers with "be_", you can also use "be_a_"
|
|
39
40
|
# and "be_an_", making your specs read much more naturally:
|
|
40
41
|
#
|
|
41
42
|
# expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes
|
|
42
43
|
#
|
|
43
|
-
# expect(3).to be_a_kind_of(
|
|
44
|
-
# expect(3).to be_a_kind_of(Numeric)
|
|
45
|
-
# expect(3).to be_an_instance_of(
|
|
44
|
+
# expect(3).to be_a_kind_of(Integer) # => 3.kind_of?(Numeric) | passes
|
|
45
|
+
# expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes
|
|
46
|
+
# expect(3).to be_an_instance_of(Integer) # => 3.instance_of?(Integer) | passes
|
|
46
47
|
# expect(3).not_to be_an_instance_of(Numeric) # => 3.instance_of?(Numeric) | fails
|
|
47
48
|
#
|
|
48
49
|
# RSpec will also create custom matchers for predicates like `has_key?`. To
|
|
@@ -61,6 +62,26 @@ module RSpec
|
|
|
61
62
|
# RSpec::Matchers.alias_matcher :a_user_who_is_an_admin, :be_an_admin
|
|
62
63
|
# expect(user_list).to include(a_user_who_is_an_admin)
|
|
63
64
|
#
|
|
65
|
+
# ## Alias Matchers
|
|
66
|
+
#
|
|
67
|
+
# With {RSpec::Matchers.alias_matcher}, you can easily create an
|
|
68
|
+
# alternate name for a given matcher.
|
|
69
|
+
#
|
|
70
|
+
# The description will also change according to the new name:
|
|
71
|
+
#
|
|
72
|
+
# RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to
|
|
73
|
+
# sum_to(3).description # => "sum to 3"
|
|
74
|
+
# a_list_that_sums_to(3).description # => "a list that sums to 3"
|
|
75
|
+
#
|
|
76
|
+
# or you can specify a custom description like this:
|
|
77
|
+
#
|
|
78
|
+
# RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description|
|
|
79
|
+
# description.sub("be sorted by", "a list sorted by")
|
|
80
|
+
# end
|
|
81
|
+
#
|
|
82
|
+
# be_sorted_by(:age).description # => "be sorted by age"
|
|
83
|
+
# a_list_sorted_by(:age).description # => "a list sorted by age"
|
|
84
|
+
#
|
|
64
85
|
# ## Custom Matchers
|
|
65
86
|
#
|
|
66
87
|
# When you find that none of the stock matchers provide a natural feeling
|
|
@@ -201,78 +222,88 @@ module RSpec
|
|
|
201
222
|
# expressions, and also uses the noun-phrase wording in the matcher's `description`,
|
|
202
223
|
# for readable failure messages. You can alias your custom matchers in similar fashion
|
|
203
224
|
# using {RSpec::Matchers.alias_matcher}.
|
|
204
|
-
|
|
225
|
+
#
|
|
226
|
+
# ## Negated Matchers
|
|
227
|
+
#
|
|
228
|
+
# Sometimes if you want to test for the opposite using a more descriptive name
|
|
229
|
+
# instead of using `not_to`, you can use {RSpec::Matchers.define_negated_matcher}:
|
|
230
|
+
#
|
|
231
|
+
# RSpec::Matchers.define_negated_matcher :exclude, :include
|
|
232
|
+
# include(1, 2).description # => "include 1 and 2"
|
|
233
|
+
# exclude(1, 2).description # => "exclude 1 and 2"
|
|
234
|
+
#
|
|
235
|
+
# While the most obvious negated form may be to add a `not_` prefix,
|
|
236
|
+
# the failure messages you get with that form can be confusing (e.g.
|
|
237
|
+
# "expected [actual] to not [verb], but did not"). We've found it works
|
|
238
|
+
# best to find a more positive name for the negated form, such as
|
|
239
|
+
# `avoid_changing` rather than `not_change`.
|
|
240
|
+
#
|
|
241
|
+
module Matchers # rubocop:disable Metrics/ModuleLength
|
|
242
|
+
extend ::RSpec::Matchers::DSL
|
|
243
|
+
|
|
244
|
+
# @!macro [attach] alias_matcher
|
|
245
|
+
# @!parse
|
|
246
|
+
# alias $1 $2
|
|
247
|
+
# @!visibility private
|
|
248
|
+
# We define this override here so we can attach a YARD macro to it.
|
|
249
|
+
# It ensures that our docs list all the matcher aliases.
|
|
250
|
+
def self.alias_matcher(*args, &block)
|
|
251
|
+
super(*args, &block)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# @!method self.alias_matcher(new_name, old_name, options={}, &description_override)
|
|
255
|
+
# Extended from {RSpec::Matchers::DSL#alias_matcher}.
|
|
256
|
+
|
|
257
|
+
# @!method self.define(name, &declarations)
|
|
258
|
+
# Extended from {RSpec::Matchers::DSL#define}.
|
|
259
|
+
|
|
260
|
+
# @!method self.define_negated_matcher(negated_name, base_name, &description_override)
|
|
261
|
+
# Extended from {RSpec::Matchers::DSL#define_negated_matcher}.
|
|
262
|
+
|
|
205
263
|
# @method expect
|
|
206
264
|
# Supports `expect(actual).to matcher` syntax by wrapping `actual` in an
|
|
207
265
|
# `ExpectationTarget`.
|
|
208
266
|
# @example
|
|
209
267
|
# expect(actual).to eq(expected)
|
|
210
268
|
# expect(actual).not_to eq(expected)
|
|
211
|
-
# @return [ExpectationTarget]
|
|
212
|
-
# @see ExpectationTarget#to
|
|
213
|
-
# @see ExpectationTarget#not_to
|
|
269
|
+
# @return [Expectations::ExpectationTarget]
|
|
270
|
+
# @see Expectations::ExpectationTarget#to
|
|
271
|
+
# @see Expectations::ExpectationTarget#not_to
|
|
214
272
|
|
|
215
|
-
#
|
|
216
|
-
#
|
|
217
|
-
#
|
|
218
|
-
#
|
|
219
|
-
#
|
|
220
|
-
#
|
|
221
|
-
#
|
|
222
|
-
# @
|
|
223
|
-
#
|
|
224
|
-
#
|
|
225
|
-
#
|
|
226
|
-
#
|
|
227
|
-
#
|
|
228
|
-
# @
|
|
229
|
-
#
|
|
230
|
-
#
|
|
231
|
-
#
|
|
232
|
-
#
|
|
273
|
+
# Allows multiple expectations in the provided block to fail, and then
|
|
274
|
+
# aggregates them into a single exception, rather than aborting on the
|
|
275
|
+
# first expectation failure like normal. This allows you to see all
|
|
276
|
+
# failures from an entire set of expectations without splitting each
|
|
277
|
+
# off into its own example (which may slow things down if the example
|
|
278
|
+
# setup is expensive).
|
|
279
|
+
#
|
|
280
|
+
# @param label [String] label for this aggregation block, which will be
|
|
281
|
+
# included in the aggregated exception message.
|
|
282
|
+
# @param metadata [Hash] additional metadata about this failure aggregation
|
|
283
|
+
# block. If multiple expectations fail, it will be exposed from the
|
|
284
|
+
# {Expectations::MultipleExpectationsNotMetError} exception. Mostly
|
|
285
|
+
# intended for internal RSpec use but you can use it as well.
|
|
286
|
+
# @yield Block containing as many expectation as you want. The block is
|
|
287
|
+
# simply yielded to, so you can trust that anything that works outside
|
|
288
|
+
# the block should work within it.
|
|
289
|
+
# @raise [Expectations::MultipleExpectationsNotMetError] raised when
|
|
290
|
+
# multiple expectations fail.
|
|
291
|
+
# @raise [Expectations::ExpectationNotMetError] raised when a single
|
|
292
|
+
# expectation fails.
|
|
293
|
+
# @raise [Exception] other sorts of exceptions will be raised as normal.
|
|
233
294
|
#
|
|
234
295
|
# @example
|
|
235
|
-
#
|
|
236
|
-
#
|
|
237
|
-
#
|
|
296
|
+
# aggregate_failures("verifying response") do
|
|
297
|
+
# expect(response.status).to eq(200)
|
|
298
|
+
# expect(response.headers).to include("Content-Type" => "text/plain")
|
|
299
|
+
# expect(response.body).to include("Success")
|
|
238
300
|
# end
|
|
239
301
|
#
|
|
240
|
-
#
|
|
241
|
-
#
|
|
242
|
-
#
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
# alias $1 $2
|
|
246
|
-
def self.alias_matcher(new_name, old_name, options={}, &description_override)
|
|
247
|
-
description_override ||= lambda do |old_desc|
|
|
248
|
-
old_desc.gsub(Pretty.split_words(old_name), Pretty.split_words(new_name))
|
|
249
|
-
end
|
|
250
|
-
klass = options.fetch(:klass) { AliasedMatcher }
|
|
251
|
-
|
|
252
|
-
define_method(new_name) do |*args, &block|
|
|
253
|
-
matcher = __send__(old_name, *args, &block)
|
|
254
|
-
klass.new(matcher, description_override)
|
|
255
|
-
end
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
# Defines a negated matcher. The returned matcher's `description` and `failure_message`
|
|
259
|
-
# will be overriden to reflect the phrasing of the new name, and the match logic will
|
|
260
|
-
# be based on the original matcher but negated.
|
|
261
|
-
#
|
|
262
|
-
# @param negated_name [Symbol] the name for the negated matcher
|
|
263
|
-
# @param base_name [Symbol] the name of the original matcher that will be negated
|
|
264
|
-
# @yield [String] optional block that, when given is used to define the overriden
|
|
265
|
-
# description. The yielded arg is the original description. If no block is
|
|
266
|
-
# provided, a default description override is used based on the old and
|
|
267
|
-
# new names.
|
|
268
|
-
#
|
|
269
|
-
# @example
|
|
270
|
-
#
|
|
271
|
-
# RSpec::Matchers.define_negated_matcher :a_value_not_between, :a_value_between
|
|
272
|
-
# a_value_between(3, 5).description # => "a value between 3 and 5"
|
|
273
|
-
# a_value_not_between(3, 5).description # => "a value not between 3 and 5"
|
|
274
|
-
def self.define_negated_matcher(negated_name, base_name, &description_override)
|
|
275
|
-
alias_matcher(negated_name, base_name, :klass => AliasedNegatedMatcher, &description_override)
|
|
302
|
+
# @note The implementation of this feature uses a thread-local variable,
|
|
303
|
+
# which means that if you have an expectation failure in another thread,
|
|
304
|
+
# it'll abort like normal.
|
|
305
|
+
def aggregate_failures(label=nil, metadata={}, &block)
|
|
306
|
+
Expectations::FailureAggregator.new(label, metadata).aggregate(&block)
|
|
276
307
|
end
|
|
277
308
|
|
|
278
309
|
# Passes if actual is truthy (anything but false or nil)
|
|
@@ -285,9 +316,9 @@ module RSpec
|
|
|
285
316
|
def be_falsey
|
|
286
317
|
BuiltIn::BeFalsey.new
|
|
287
318
|
end
|
|
288
|
-
alias_matcher :be_falsy,
|
|
319
|
+
alias_matcher :be_falsy, :be_falsey
|
|
289
320
|
alias_matcher :a_falsey_value, :be_falsey
|
|
290
|
-
alias_matcher :a_falsy_value,
|
|
321
|
+
alias_matcher :a_falsy_value, :be_falsey
|
|
291
322
|
|
|
292
323
|
# Passes if actual is nil
|
|
293
324
|
def be_nil
|
|
@@ -329,8 +360,7 @@ module RSpec
|
|
|
329
360
|
# Passes if actual.instance_of?(expected)
|
|
330
361
|
#
|
|
331
362
|
# @example
|
|
332
|
-
#
|
|
333
|
-
# expect(5).to be_an_instance_of(Fixnum)
|
|
363
|
+
# expect(5).to be_an_instance_of(Integer)
|
|
334
364
|
# expect(5).not_to be_an_instance_of(Numeric)
|
|
335
365
|
# expect(5).not_to be_an_instance_of(Float)
|
|
336
366
|
def be_an_instance_of(expected)
|
|
@@ -342,15 +372,14 @@ module RSpec
|
|
|
342
372
|
# Passes if actual.kind_of?(expected)
|
|
343
373
|
#
|
|
344
374
|
# @example
|
|
345
|
-
#
|
|
346
|
-
# expect(5).to be_a_kind_of(Fixnum)
|
|
375
|
+
# expect(5).to be_a_kind_of(Integer)
|
|
347
376
|
# expect(5).to be_a_kind_of(Numeric)
|
|
348
377
|
# expect(5).not_to be_a_kind_of(Float)
|
|
349
378
|
def be_a_kind_of(expected)
|
|
350
379
|
BuiltIn::BeAKindOf.new(expected)
|
|
351
380
|
end
|
|
352
381
|
alias_method :be_kind_of, :be_a_kind_of
|
|
353
|
-
alias_matcher :a_kind_of,
|
|
382
|
+
alias_matcher :a_kind_of, :be_a_kind_of
|
|
354
383
|
|
|
355
384
|
# Passes if actual.between?(min, max). Works with any Comparable object,
|
|
356
385
|
# including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer,
|
|
@@ -360,7 +389,6 @@ module RSpec
|
|
|
360
389
|
# but you can make it `exclusive` by chaining that off the matcher.
|
|
361
390
|
#
|
|
362
391
|
# @example
|
|
363
|
-
#
|
|
364
392
|
# expect(5).to be_between(1, 10)
|
|
365
393
|
# expect(11).not_to be_between(1, 10)
|
|
366
394
|
# expect(10).not_to be_between(1, 10).exclusive
|
|
@@ -372,14 +400,13 @@ module RSpec
|
|
|
372
400
|
# Passes if actual == expected +/- delta
|
|
373
401
|
#
|
|
374
402
|
# @example
|
|
375
|
-
#
|
|
376
403
|
# expect(result).to be_within(0.5).of(3.0)
|
|
377
404
|
# expect(result).not_to be_within(0.5).of(3.0)
|
|
378
405
|
def be_within(delta)
|
|
379
406
|
BuiltIn::BeWithin.new(delta)
|
|
380
407
|
end
|
|
381
408
|
alias_matcher :a_value_within, :be_within
|
|
382
|
-
alias_matcher :within,
|
|
409
|
+
alias_matcher :within, :be_within
|
|
383
410
|
|
|
384
411
|
# Applied to a proc, specifies that its execution will cause some value to
|
|
385
412
|
# change.
|
|
@@ -407,7 +434,6 @@ module RSpec
|
|
|
407
434
|
# * `by_at_most`
|
|
408
435
|
#
|
|
409
436
|
# @example
|
|
410
|
-
#
|
|
411
437
|
# expect {
|
|
412
438
|
# team.add_player(player)
|
|
413
439
|
# }.to change(roster, :count)
|
|
@@ -454,7 +480,10 @@ module RSpec
|
|
|
454
480
|
# == Notes
|
|
455
481
|
#
|
|
456
482
|
# Evaluates `receiver.message` or `block` before and after it
|
|
457
|
-
# evaluates the block passed to `expect`.
|
|
483
|
+
# evaluates the block passed to `expect`. If the value is the same
|
|
484
|
+
# object, its before/after `hash` value is used to see if it has changed.
|
|
485
|
+
# Therefore, your object needs to properly implement `hash` to work correctly
|
|
486
|
+
# with this matcher.
|
|
458
487
|
#
|
|
459
488
|
# `expect( ... ).not_to change` supports the form that specifies `from`
|
|
460
489
|
# (which specifies what you expect the starting, unchanged value to be)
|
|
@@ -463,8 +492,8 @@ module RSpec
|
|
|
463
492
|
def change(receiver=nil, message=nil, &block)
|
|
464
493
|
BuiltIn::Change.new(receiver, message, &block)
|
|
465
494
|
end
|
|
466
|
-
alias_matcher :a_block_changing,
|
|
467
|
-
alias_matcher :changing,
|
|
495
|
+
alias_matcher :a_block_changing, :change
|
|
496
|
+
alias_matcher :changing, :change
|
|
468
497
|
|
|
469
498
|
# Passes if actual contains all of the expected regardless of order.
|
|
470
499
|
# This works for collections. Pass in multiple args and it will only
|
|
@@ -474,7 +503,6 @@ module RSpec
|
|
|
474
503
|
# but `=~` is not supported with `expect`.
|
|
475
504
|
#
|
|
476
505
|
# @example
|
|
477
|
-
#
|
|
478
506
|
# expect([1, 2, 3]).to contain_exactly(1, 2, 3)
|
|
479
507
|
# expect([1, 2, 3]).to contain_exactly(1, 3, 2)
|
|
480
508
|
#
|
|
@@ -483,7 +511,7 @@ module RSpec
|
|
|
483
511
|
BuiltIn::ContainExactly.new(items)
|
|
484
512
|
end
|
|
485
513
|
alias_matcher :a_collection_containing_exactly, :contain_exactly
|
|
486
|
-
alias_matcher :containing_exactly,
|
|
514
|
+
alias_matcher :containing_exactly, :contain_exactly
|
|
487
515
|
|
|
488
516
|
# Passes if actual covers expected. This works for
|
|
489
517
|
# Ranges. You can also pass in multiple args
|
|
@@ -501,7 +529,7 @@ module RSpec
|
|
|
501
529
|
BuiltIn::Cover.new(*values)
|
|
502
530
|
end
|
|
503
531
|
alias_matcher :a_range_covering, :cover
|
|
504
|
-
alias_matcher :covering,
|
|
532
|
+
alias_matcher :covering, :cover
|
|
505
533
|
|
|
506
534
|
# Matches if the actual value ends with the expected value(s). In the case
|
|
507
535
|
# of a string, matches against the last `expected.length` characters of the
|
|
@@ -509,7 +537,6 @@ module RSpec
|
|
|
509
537
|
# `expected.length` elements of the actual array.
|
|
510
538
|
#
|
|
511
539
|
# @example
|
|
512
|
-
#
|
|
513
540
|
# expect("this string").to end_with "string"
|
|
514
541
|
# expect([0, 1, 2, 3, 4]).to end_with 4
|
|
515
542
|
# expect([0, 2, 3, 4, 4]).to end_with 3, 4
|
|
@@ -517,8 +544,8 @@ module RSpec
|
|
|
517
544
|
BuiltIn::EndWith.new(*expected)
|
|
518
545
|
end
|
|
519
546
|
alias_matcher :a_collection_ending_with, :end_with
|
|
520
|
-
alias_matcher :a_string_ending_with,
|
|
521
|
-
alias_matcher :ending_with,
|
|
547
|
+
alias_matcher :a_string_ending_with, :end_with
|
|
548
|
+
alias_matcher :ending_with, :end_with
|
|
522
549
|
|
|
523
550
|
# Passes if <tt>actual == expected</tt>.
|
|
524
551
|
#
|
|
@@ -526,14 +553,13 @@ module RSpec
|
|
|
526
553
|
# information about equality in Ruby.
|
|
527
554
|
#
|
|
528
555
|
# @example
|
|
529
|
-
#
|
|
530
556
|
# expect(5).to eq(5)
|
|
531
557
|
# expect(5).not_to eq(3)
|
|
532
558
|
def eq(expected)
|
|
533
559
|
BuiltIn::Eq.new(expected)
|
|
534
560
|
end
|
|
535
561
|
alias_matcher :an_object_eq_to, :eq
|
|
536
|
-
alias_matcher :eq_to,
|
|
562
|
+
alias_matcher :eq_to, :eq
|
|
537
563
|
|
|
538
564
|
# Passes if `actual.eql?(expected)`
|
|
539
565
|
#
|
|
@@ -541,14 +567,13 @@ module RSpec
|
|
|
541
567
|
# information about equality in Ruby.
|
|
542
568
|
#
|
|
543
569
|
# @example
|
|
544
|
-
#
|
|
545
570
|
# expect(5).to eql(5)
|
|
546
571
|
# expect(5).not_to eql(3)
|
|
547
572
|
def eql(expected)
|
|
548
573
|
BuiltIn::Eql.new(expected)
|
|
549
574
|
end
|
|
550
575
|
alias_matcher :an_object_eql_to, :eql
|
|
551
|
-
alias_matcher :eql_to,
|
|
576
|
+
alias_matcher :eql_to, :eql
|
|
552
577
|
|
|
553
578
|
# Passes if <tt>actual.equal?(expected)</tt> (object identity).
|
|
554
579
|
#
|
|
@@ -556,14 +581,13 @@ module RSpec
|
|
|
556
581
|
# information about equality in Ruby.
|
|
557
582
|
#
|
|
558
583
|
# @example
|
|
559
|
-
#
|
|
560
|
-
# expect(5).to equal(5) # Fixnums are equal
|
|
584
|
+
# expect(5).to equal(5) # Integers are equal
|
|
561
585
|
# expect("5").not_to equal("5") # Strings that look the same are not the same object
|
|
562
586
|
def equal(expected)
|
|
563
587
|
BuiltIn::Equal.new(expected)
|
|
564
588
|
end
|
|
565
589
|
alias_matcher :an_object_equal_to, :equal
|
|
566
|
-
alias_matcher :equal_to,
|
|
590
|
+
alias_matcher :equal_to, :equal
|
|
567
591
|
|
|
568
592
|
# Passes if `actual.exist?` or `actual.exists?`
|
|
569
593
|
#
|
|
@@ -573,13 +597,12 @@ module RSpec
|
|
|
573
597
|
BuiltIn::Exist.new(*args)
|
|
574
598
|
end
|
|
575
599
|
alias_matcher :an_object_existing, :exist
|
|
576
|
-
alias_matcher :existing,
|
|
600
|
+
alias_matcher :existing, :exist
|
|
577
601
|
|
|
578
602
|
# Passes if actual's attribute values match the expected attributes hash.
|
|
579
603
|
# This works no matter how you define your attribute readers.
|
|
580
604
|
#
|
|
581
605
|
# @example
|
|
582
|
-
#
|
|
583
606
|
# Person = Struct.new(:name, :age)
|
|
584
607
|
# person = Person.new("Bob", 32)
|
|
585
608
|
#
|
|
@@ -589,38 +612,42 @@ module RSpec
|
|
|
589
612
|
# @note It will fail if actual doesn't respond to any of the expected attributes.
|
|
590
613
|
#
|
|
591
614
|
# @example
|
|
592
|
-
#
|
|
593
615
|
# expect(person).to have_attributes(:color => "red")
|
|
594
616
|
def have_attributes(expected)
|
|
595
617
|
BuiltIn::HaveAttributes.new(expected)
|
|
596
618
|
end
|
|
597
619
|
alias_matcher :an_object_having_attributes, :have_attributes
|
|
620
|
+
alias_matcher :having_attributes, :have_attributes
|
|
598
621
|
|
|
599
622
|
# Passes if actual includes expected. This works for
|
|
600
623
|
# collections and Strings. You can also pass in multiple args
|
|
601
624
|
# and it will only pass if all args are found in collection.
|
|
602
625
|
#
|
|
603
626
|
# @example
|
|
604
|
-
#
|
|
605
627
|
# expect([1,2,3]).to include(3)
|
|
606
628
|
# expect([1,2,3]).to include(2,3)
|
|
607
629
|
# expect([1,2,3]).to include(2,3,4) # fails
|
|
608
630
|
# expect([1,2,3]).not_to include(4)
|
|
609
631
|
# expect("spread").to include("read")
|
|
610
632
|
# expect("spread").not_to include("red")
|
|
633
|
+
# expect(:a => 1, :b => 2).to include(:a)
|
|
634
|
+
# expect(:a => 1, :b => 2).to include(:a, :b)
|
|
635
|
+
# expect(:a => 1, :b => 2).to include(:a => 1)
|
|
636
|
+
# expect(:a => 1, :b => 2).to include(:b => 2, :a => 1)
|
|
637
|
+
# expect(:a => 1, :b => 2).to include(:c) # fails
|
|
638
|
+
# expect(:a => 1, :b => 2).not_to include(:a => 2)
|
|
611
639
|
def include(*expected)
|
|
612
640
|
BuiltIn::Include.new(*expected)
|
|
613
641
|
end
|
|
614
642
|
alias_matcher :a_collection_including, :include
|
|
615
|
-
alias_matcher :a_string_including,
|
|
616
|
-
alias_matcher :a_hash_including,
|
|
617
|
-
alias_matcher :including,
|
|
643
|
+
alias_matcher :a_string_including, :include
|
|
644
|
+
alias_matcher :a_hash_including, :include
|
|
645
|
+
alias_matcher :including, :include
|
|
618
646
|
|
|
619
|
-
# Passes if
|
|
620
|
-
#
|
|
647
|
+
# Passes if the provided matcher passes when checked against all
|
|
648
|
+
# elements of the collection.
|
|
621
649
|
#
|
|
622
650
|
# @example
|
|
623
|
-
#
|
|
624
651
|
# expect([1, 3, 5]).to all be_odd
|
|
625
652
|
# expect([1, 3, 6]).to all be_odd # fails
|
|
626
653
|
#
|
|
@@ -642,12 +669,10 @@ module RSpec
|
|
|
642
669
|
# pair of elements.
|
|
643
670
|
#
|
|
644
671
|
# @example
|
|
645
|
-
#
|
|
646
672
|
# expect(email).to match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
|
|
647
673
|
# expect(email).to match("@example.com")
|
|
648
674
|
#
|
|
649
675
|
# @example
|
|
650
|
-
#
|
|
651
676
|
# hash = {
|
|
652
677
|
# :a => {
|
|
653
678
|
# :b => ["foo", 5],
|
|
@@ -659,7 +684,7 @@ module RSpec
|
|
|
659
684
|
# :a => {
|
|
660
685
|
# :b => a_collection_containing_exactly(
|
|
661
686
|
# a_string_starting_with("f"),
|
|
662
|
-
# an_instance_of(
|
|
687
|
+
# an_instance_of(Integer)
|
|
663
688
|
# ),
|
|
664
689
|
# :c => { :d => (a_value < 3) }
|
|
665
690
|
# }
|
|
@@ -672,17 +697,16 @@ module RSpec
|
|
|
672
697
|
def match(expected)
|
|
673
698
|
BuiltIn::Match.new(expected)
|
|
674
699
|
end
|
|
675
|
-
alias_matcher :match_regex,
|
|
700
|
+
alias_matcher :match_regex, :match
|
|
676
701
|
alias_matcher :an_object_matching, :match
|
|
677
|
-
alias_matcher :a_string_matching,
|
|
678
|
-
alias_matcher :matching,
|
|
702
|
+
alias_matcher :a_string_matching, :match
|
|
703
|
+
alias_matcher :matching, :match
|
|
679
704
|
|
|
680
705
|
# An alternate form of `contain_exactly` that accepts
|
|
681
706
|
# the expected contents as a single array arg rather
|
|
682
707
|
# that splatted out as individual items.
|
|
683
708
|
#
|
|
684
709
|
# @example
|
|
685
|
-
#
|
|
686
710
|
# expect(results).to contain_exactly(1, 2)
|
|
687
711
|
# # is identical to:
|
|
688
712
|
# expect(results).to match_array([1, 2])
|
|
@@ -691,13 +715,19 @@ module RSpec
|
|
|
691
715
|
def match_array(items)
|
|
692
716
|
contain_exactly(*items)
|
|
693
717
|
end
|
|
718
|
+
alias_matcher :an_array_matching, :match_array do |desc|
|
|
719
|
+
desc.sub("contain exactly", "an array containing exactly")
|
|
720
|
+
end
|
|
694
721
|
|
|
695
722
|
# With no arg, passes if the block outputs `to_stdout` or `to_stderr`.
|
|
696
|
-
# With a string, passes if the
|
|
697
|
-
# With a regexp or matcher, passes if the
|
|
723
|
+
# With a string, passes if the block outputs that specific string `to_stdout` or `to_stderr`.
|
|
724
|
+
# With a regexp or matcher, passes if the block outputs a string `to_stdout` or `to_stderr` that matches.
|
|
698
725
|
#
|
|
699
|
-
#
|
|
726
|
+
# To capture output from any spawned subprocess as well, use `to_stdout_from_any_process` or
|
|
727
|
+
# `to_stderr_from_any_process`. Output from any process that inherits the main process's corresponding
|
|
728
|
+
# standard stream will be captured.
|
|
700
729
|
#
|
|
730
|
+
# @example
|
|
701
731
|
# expect { print 'foo' }.to output.to_stdout
|
|
702
732
|
# expect { print 'foo' }.to output('foo').to_stdout
|
|
703
733
|
# expect { print 'foo' }.to output(/foo/).to_stdout
|
|
@@ -710,10 +740,15 @@ module RSpec
|
|
|
710
740
|
#
|
|
711
741
|
# expect { do_something }.to_not output.to_stderr
|
|
712
742
|
#
|
|
713
|
-
#
|
|
714
|
-
#
|
|
743
|
+
# expect { system('echo foo') }.to output("foo\n").to_stdout_from_any_process
|
|
744
|
+
# expect { system('echo foo', out: :err) }.to output("foo\n").to_stderr_from_any_process
|
|
745
|
+
#
|
|
746
|
+
# @note `to_stdout` and `to_stderr` work by temporarily replacing `$stdout` or `$stderr`,
|
|
747
|
+
# so they're not able to intercept stream output that explicitly uses `STDOUT`/`STDERR`
|
|
715
748
|
# or that uses a reference to `$stdout`/`$stderr` that was stored before the
|
|
716
|
-
# matcher
|
|
749
|
+
# matcher was used.
|
|
750
|
+
# @note `to_stdout_from_any_process` and `to_stderr_from_any_process` use Tempfiles, and
|
|
751
|
+
# are thus significantly (~30x) slower than `to_stdout` and `to_stderr`.
|
|
717
752
|
def output(expected=nil)
|
|
718
753
|
BuiltIn::Output.new(expected)
|
|
719
754
|
end
|
|
@@ -721,29 +756,30 @@ module RSpec
|
|
|
721
756
|
|
|
722
757
|
# With no args, matches if any error is raised.
|
|
723
758
|
# With a named error, matches only if that specific error is raised.
|
|
724
|
-
# With a named error and
|
|
725
|
-
# With a named error and
|
|
759
|
+
# With a named error and message specified as a String, matches only if both match.
|
|
760
|
+
# With a named error and message specified as a Regexp, matches only if both match.
|
|
726
761
|
# Pass an optional block to perform extra verifications on the exception matched
|
|
727
762
|
#
|
|
728
763
|
# @example
|
|
729
|
-
#
|
|
730
764
|
# expect { do_something_risky }.to raise_error
|
|
731
765
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError)
|
|
732
766
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 }
|
|
767
|
+
# expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 }
|
|
733
768
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky")
|
|
734
769
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/)
|
|
770
|
+
# expect { do_something_risky }.to raise_error("that was too risky")
|
|
735
771
|
#
|
|
736
772
|
# expect { do_something_risky }.not_to raise_error
|
|
737
|
-
def raise_error(error=
|
|
773
|
+
def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block)
|
|
738
774
|
BuiltIn::RaiseError.new(error, message, &block)
|
|
739
775
|
end
|
|
740
|
-
alias_method :raise_exception,
|
|
776
|
+
alias_method :raise_exception, :raise_error
|
|
741
777
|
|
|
742
|
-
alias_matcher :a_block_raising,
|
|
778
|
+
alias_matcher :a_block_raising, :raise_error do |desc|
|
|
743
779
|
desc.sub("raise", "a block raising")
|
|
744
780
|
end
|
|
745
781
|
|
|
746
|
-
alias_matcher :raising,
|
|
782
|
+
alias_matcher :raising, :raise_error do |desc|
|
|
747
783
|
desc.sub("raise", "raising")
|
|
748
784
|
end
|
|
749
785
|
|
|
@@ -751,14 +787,13 @@ module RSpec
|
|
|
751
787
|
# provided. Names can be Strings or Symbols.
|
|
752
788
|
#
|
|
753
789
|
# @example
|
|
754
|
-
#
|
|
755
790
|
# expect("string").to respond_to(:length)
|
|
756
791
|
#
|
|
757
792
|
def respond_to(*names)
|
|
758
793
|
BuiltIn::RespondTo.new(*names)
|
|
759
794
|
end
|
|
760
795
|
alias_matcher :an_object_responding_to, :respond_to
|
|
761
|
-
alias_matcher :responding_to,
|
|
796
|
+
alias_matcher :responding_to, :respond_to
|
|
762
797
|
|
|
763
798
|
# Passes if the submitted block returns true. Yields target to the
|
|
764
799
|
# block.
|
|
@@ -770,14 +805,16 @@ module RSpec
|
|
|
770
805
|
# If you do find yourself in such a situation, you could always write
|
|
771
806
|
# a custom matcher, which would likely make your specs more expressive.
|
|
772
807
|
#
|
|
773
|
-
# @
|
|
808
|
+
# @param description [String] optional description to be used for this matcher.
|
|
774
809
|
#
|
|
810
|
+
# @example
|
|
775
811
|
# expect(5).to satisfy { |n| n > 3 }
|
|
776
|
-
|
|
777
|
-
|
|
812
|
+
# expect(5).to satisfy("be greater than 3") { |n| n > 3 }
|
|
813
|
+
def satisfy(description=nil, &block)
|
|
814
|
+
BuiltIn::Satisfy.new(description, &block)
|
|
778
815
|
end
|
|
779
816
|
alias_matcher :an_object_satisfying, :satisfy
|
|
780
|
-
alias_matcher :satisfying,
|
|
817
|
+
alias_matcher :satisfying, :satisfy
|
|
781
818
|
|
|
782
819
|
# Matches if the actual value starts with the expected value(s). In the
|
|
783
820
|
# case of a string, matches against the first `expected.length` characters
|
|
@@ -785,7 +822,6 @@ module RSpec
|
|
|
785
822
|
# `expected.length` elements of the actual array.
|
|
786
823
|
#
|
|
787
824
|
# @example
|
|
788
|
-
#
|
|
789
825
|
# expect("this string").to start_with "this s"
|
|
790
826
|
# expect([0, 1, 2, 3, 4]).to start_with 0
|
|
791
827
|
# expect([0, 2, 3, 4, 4]).to start_with 0, 1
|
|
@@ -793,8 +829,8 @@ module RSpec
|
|
|
793
829
|
BuiltIn::StartWith.new(*expected)
|
|
794
830
|
end
|
|
795
831
|
alias_matcher :a_collection_starting_with, :start_with
|
|
796
|
-
alias_matcher :a_string_starting_with,
|
|
797
|
-
alias_matcher :starting_with,
|
|
832
|
+
alias_matcher :a_string_starting_with, :start_with
|
|
833
|
+
alias_matcher :starting_with, :start_with
|
|
798
834
|
|
|
799
835
|
# Given no argument, matches if a proc throws any Symbol.
|
|
800
836
|
#
|
|
@@ -804,7 +840,6 @@ module RSpec
|
|
|
804
840
|
# specified Symbol with the specified arg.
|
|
805
841
|
#
|
|
806
842
|
# @example
|
|
807
|
-
#
|
|
808
843
|
# expect { do_something_risky }.to throw_symbol
|
|
809
844
|
# expect { do_something_risky }.to throw_symbol(:that_was_risky)
|
|
810
845
|
# expect { do_something_risky }.to throw_symbol(:that_was_risky, 'culprit')
|
|
@@ -820,7 +855,7 @@ module RSpec
|
|
|
820
855
|
desc.sub("throw", "a block throwing")
|
|
821
856
|
end
|
|
822
857
|
|
|
823
|
-
alias_matcher :throwing,
|
|
858
|
+
alias_matcher :throwing, :throw_symbol do |desc|
|
|
824
859
|
desc.sub("throw", "throwing")
|
|
825
860
|
end
|
|
826
861
|
|
|
@@ -828,25 +863,21 @@ module RSpec
|
|
|
828
863
|
# of whether or not arguments are yielded.
|
|
829
864
|
#
|
|
830
865
|
# @example
|
|
831
|
-
#
|
|
832
866
|
# expect { |b| 5.tap(&b) }.to yield_control
|
|
833
867
|
# expect { |b| "a".to_sym(&b) }.not_to yield_control
|
|
834
868
|
#
|
|
835
869
|
# @note Your expect block must accept a parameter and pass it on to
|
|
836
870
|
# the method-under-test as a block.
|
|
837
|
-
# @note This matcher is not designed for use with methods that yield
|
|
838
|
-
# multiple times.
|
|
839
871
|
def yield_control
|
|
840
872
|
BuiltIn::YieldControl.new
|
|
841
873
|
end
|
|
842
|
-
alias_matcher :a_block_yielding_control,
|
|
843
|
-
alias_matcher :yielding_control,
|
|
874
|
+
alias_matcher :a_block_yielding_control, :yield_control
|
|
875
|
+
alias_matcher :yielding_control, :yield_control
|
|
844
876
|
|
|
845
877
|
# Passes if the method called in the expect block yields with
|
|
846
878
|
# no arguments. Fails if it does not yield, or yields with arguments.
|
|
847
879
|
#
|
|
848
880
|
# @example
|
|
849
|
-
#
|
|
850
881
|
# expect { |b| User.transaction(&b) }.to yield_with_no_args
|
|
851
882
|
# expect { |b| 5.tap(&b) }.not_to yield_with_no_args # because it yields with `5`
|
|
852
883
|
# expect { |b| "a".to_sym(&b) }.not_to yield_with_no_args # because it does not yield
|
|
@@ -858,8 +889,8 @@ module RSpec
|
|
|
858
889
|
def yield_with_no_args
|
|
859
890
|
BuiltIn::YieldWithNoArgs.new
|
|
860
891
|
end
|
|
861
|
-
alias_matcher :a_block_yielding_with_no_args,
|
|
862
|
-
alias_matcher :yielding_with_no_args,
|
|
892
|
+
alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
|
|
893
|
+
alias_matcher :yielding_with_no_args, :yield_with_no_args
|
|
863
894
|
|
|
864
895
|
# Given no arguments, matches if the method called in the expect
|
|
865
896
|
# block yields with arguments (regardless of what they are or how
|
|
@@ -873,10 +904,9 @@ module RSpec
|
|
|
873
904
|
# operator, the matcher will pass.
|
|
874
905
|
#
|
|
875
906
|
# @example
|
|
876
|
-
#
|
|
877
907
|
# expect { |b| 5.tap(&b) }.to yield_with_args # because #tap yields an arg
|
|
878
908
|
# expect { |b| 5.tap(&b) }.to yield_with_args(5) # because 5 == 5
|
|
879
|
-
# expect { |b| 5.tap(&b) }.to yield_with_args(
|
|
909
|
+
# expect { |b| 5.tap(&b) }.to yield_with_args(Integer) # because Integer === 5
|
|
880
910
|
# expect { |b| File.open("f.txt", &b) }.to yield_with_args(/txt/) # because /txt/ === "f.txt"
|
|
881
911
|
#
|
|
882
912
|
# expect { |b| User.transaction(&b) }.not_to yield_with_args # because it yields no args
|
|
@@ -889,8 +919,8 @@ module RSpec
|
|
|
889
919
|
def yield_with_args(*args)
|
|
890
920
|
BuiltIn::YieldWithArgs.new(*args)
|
|
891
921
|
end
|
|
892
|
-
alias_matcher :a_block_yielding_with_args,
|
|
893
|
-
alias_matcher :yielding_with_args,
|
|
922
|
+
alias_matcher :a_block_yielding_with_args, :yield_with_args
|
|
923
|
+
alias_matcher :yielding_with_args, :yield_with_args
|
|
894
924
|
|
|
895
925
|
# Designed for use with methods that repeatedly yield (such as
|
|
896
926
|
# iterators). Passes if the method called in the expect block yields
|
|
@@ -901,7 +931,6 @@ module RSpec
|
|
|
901
931
|
# operator, the matcher will pass.
|
|
902
932
|
#
|
|
903
933
|
# @example
|
|
904
|
-
#
|
|
905
934
|
# expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3)
|
|
906
935
|
# expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2])
|
|
907
936
|
# expect { |b| [1, 2, 3].each(&b) }.not_to yield_successive_args(1, 2)
|
|
@@ -911,8 +940,8 @@ module RSpec
|
|
|
911
940
|
def yield_successive_args(*args)
|
|
912
941
|
BuiltIn::YieldSuccessiveArgs.new(*args)
|
|
913
942
|
end
|
|
914
|
-
alias_matcher :a_block_yielding_successive_args,
|
|
915
|
-
alias_matcher :yielding_successive_args,
|
|
943
|
+
alias_matcher :a_block_yielding_successive_args, :yield_successive_args
|
|
944
|
+
alias_matcher :yielding_successive_args, :yield_successive_args
|
|
916
945
|
|
|
917
946
|
# Delegates to {RSpec::Expectations.configuration}.
|
|
918
947
|
# This is here because rspec-core's `expect_with` option
|
|
@@ -925,8 +954,9 @@ module RSpec
|
|
|
925
954
|
|
|
926
955
|
private
|
|
927
956
|
|
|
928
|
-
BE_PREDICATE_REGEX = /^(be_(?:an?_)?)(.*)/
|
|
957
|
+
BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/
|
|
929
958
|
HAS_REGEX = /^(?:have_)(.*)/
|
|
959
|
+
DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX)
|
|
930
960
|
|
|
931
961
|
def method_missing(method, *args, &block)
|
|
932
962
|
case method.to_s
|
|
@@ -938,6 +968,21 @@ module RSpec
|
|
|
938
968
|
super
|
|
939
969
|
end
|
|
940
970
|
end
|
|
971
|
+
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
|
972
|
+
|
|
973
|
+
if RUBY_VERSION.to_f >= 1.9
|
|
974
|
+
def respond_to_missing?(method, *)
|
|
975
|
+
method =~ DYNAMIC_MATCHER_REGEX || super
|
|
976
|
+
end
|
|
977
|
+
else # for 1.8.7
|
|
978
|
+
# :nocov:
|
|
979
|
+
def respond_to?(method, *)
|
|
980
|
+
method = method.to_s
|
|
981
|
+
method =~ DYNAMIC_MATCHER_REGEX || super
|
|
982
|
+
end
|
|
983
|
+
public :respond_to?
|
|
984
|
+
# :nocov:
|
|
985
|
+
end
|
|
941
986
|
|
|
942
987
|
# @api private
|
|
943
988
|
def self.is_a_matcher?(obj)
|
|
@@ -963,5 +1008,37 @@ module RSpec
|
|
|
963
1008
|
def self.is_a_describable_matcher?(obj)
|
|
964
1009
|
is_a_matcher?(obj) && obj.respond_to?(:description)
|
|
965
1010
|
end
|
|
1011
|
+
|
|
1012
|
+
class << self
|
|
1013
|
+
private
|
|
1014
|
+
|
|
1015
|
+
if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9'
|
|
1016
|
+
# Note that `included` doesn't work for this because it is triggered
|
|
1017
|
+
# _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
|
|
1018
|
+
# than _before_, like `append_features`. It's important we check this before
|
|
1019
|
+
# in order to find the cases where it was already previously included.
|
|
1020
|
+
# @api private
|
|
1021
|
+
def append_features(mod)
|
|
1022
|
+
return super if mod < self # `mod < self` indicates a re-inclusion.
|
|
1023
|
+
|
|
1024
|
+
subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self }
|
|
1025
|
+
return super unless subclasses.any?
|
|
1026
|
+
|
|
1027
|
+
subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor.
|
|
1028
|
+
subclasses = subclasses.map { |s| "`#{s}`" }.join(", ")
|
|
1029
|
+
|
|
1030
|
+
RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \
|
|
1031
|
+
"after previously being included in subclasses (#{subclasses}), " \
|
|
1032
|
+
"which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \
|
|
1033
|
+
"(https://redmine.ruby-lang.org/issues/3351). To work around this, " \
|
|
1034
|
+
"either upgrade to MRI 2.0+, include a dup of the module (e.g. " \
|
|
1035
|
+
"`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \
|
|
1036
|
+
"before it is included in subclasses (#{subclasses}). See " \
|
|
1037
|
+
"https://github.com/rspec/rspec-expectations/issues/814 for more info"
|
|
1038
|
+
|
|
1039
|
+
super
|
|
1040
|
+
end
|
|
1041
|
+
end
|
|
1042
|
+
end
|
|
966
1043
|
end
|
|
967
1044
|
end
|