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
|
@@ -2,8 +2,10 @@ Feature: Using an instance double
|
|
|
2
2
|
|
|
3
3
|
An `instance_double` is the most common type of verifying double. It takes a class name or
|
|
4
4
|
object as its first argument, then verifies that any methods being stubbed would be present
|
|
5
|
-
on an _instance_ of that class.
|
|
6
|
-
|
|
5
|
+
on an _instance_ of that class. In addition, when it receives messages, it verifies that the
|
|
6
|
+
provided arguments are supported by the method signature, both in terms of arity and
|
|
7
|
+
allowed or required keyword arguments, if any. The same argument verification happens
|
|
8
|
+
when you [constrain the arguments](../setting-constraints/matching-arguments) using `with`.
|
|
7
9
|
|
|
8
10
|
For methods handled by `method_missing`, see [dynamic classes](./dynamic-classes).
|
|
9
11
|
|
|
@@ -85,7 +87,7 @@ Feature: Using an instance double
|
|
|
85
87
|
"""
|
|
86
88
|
When I run `rspec -r./spec/spec_helper spec/unit/user_spec.rb`
|
|
87
89
|
Then the output should contain "1 example, 1 failure"
|
|
88
|
-
And the output should contain "ConsoleNotifier does not implement:"
|
|
90
|
+
And the output should contain "ConsoleNotifier class does not implement the instance method:"
|
|
89
91
|
|
|
90
92
|
Scenario: spec fails with dependencies loaded and incorrect arity
|
|
91
93
|
Given a file named "app/models/console_notifier.rb" with:
|
|
@@ -11,13 +11,15 @@ Feature: Any Instance
|
|
|
11
11
|
|
|
12
12
|
These methods add the appropriate stub or expectation to all instances of `Widget`.
|
|
13
13
|
|
|
14
|
+
You can also [configure the responses](../configuring-responses) in the same manner.
|
|
15
|
+
|
|
14
16
|
This feature is sometimes useful when working with legacy code, though in general we
|
|
15
|
-
discourage its use for a number of reasons:
|
|
17
|
+
discourage its use for a number of reasons:
|
|
16
18
|
|
|
17
19
|
* The `rspec-mocks` API is designed for individual object instances, but this feature
|
|
18
|
-
operates on entire classes of objects. As a result there are some
|
|
20
|
+
operates on entire classes of objects. As a result there are some semantically confusing
|
|
19
21
|
edge cases. For example, in `expect_any_instance_of(Widget).to
|
|
20
|
-
receive(:name).twice` it isn't clear whether
|
|
22
|
+
receive(:name).twice` it isn't clear whether a specific instance is expected to
|
|
21
23
|
receive `name` twice, or if two receives total are expected. (It's the former.)
|
|
22
24
|
* Using this feature is often a design smell. It may be that your test is trying to do too
|
|
23
25
|
much or that the object under test is too complex.
|
|
@@ -81,11 +83,11 @@ Feature: Any Instance
|
|
|
81
83
|
"""ruby
|
|
82
84
|
RSpec.describe "allow_any_instance_of" do
|
|
83
85
|
it 'yields the receiver to the block implementation' do
|
|
84
|
-
allow_any_instance_of(
|
|
85
|
-
|
|
86
|
+
allow_any_instance_of(String).to receive(:slice) do |instance, start, length|
|
|
87
|
+
instance[start, length]
|
|
86
88
|
end
|
|
87
89
|
|
|
88
|
-
expect(
|
|
90
|
+
expect('string'.slice(2, 3)).to eq('rin')
|
|
89
91
|
end
|
|
90
92
|
end
|
|
91
93
|
"""
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Feature: Message Chains
|
|
2
2
|
|
|
3
|
-
You can use `receive_message_chain` in place of `receive`
|
|
3
|
+
You can use `receive_message_chain` in place of `receive` in certain circumstances
|
|
4
|
+
to stub a chain of messages:
|
|
4
5
|
|
|
5
6
|
```ruby
|
|
6
7
|
allow(double).to receive_message_chain("foo.bar") { :baz }
|
|
@@ -20,6 +21,12 @@ Feature: Message Chains
|
|
|
20
21
|
allow(Article).to receive_message_chain("recent.published") { [Article.new] }
|
|
21
22
|
```
|
|
22
23
|
|
|
24
|
+
`receive_message_chain` is designed to be used with evaluating a response like `and_return`,
|
|
25
|
+
`and_yield` etc. For legacy reasons, parity with `stub_chain` is supported but its uses are
|
|
26
|
+
not considered good practice. Support for `stub_chain` parity may be removed in future versions.
|
|
27
|
+
|
|
28
|
+
Customisations like `exactly` (i.e. `exactly(2).times`) are not supported.
|
|
29
|
+
|
|
23
30
|
Warning:
|
|
24
31
|
========
|
|
25
32
|
|
|
@@ -30,6 +37,14 @@ Feature: Message Chains
|
|
|
30
37
|
`allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the
|
|
31
38
|
implementation calls `foo.baz.bar`, the stub will not work.
|
|
32
39
|
|
|
40
|
+
|
|
41
|
+
Chaining with `receive_message_chain` creates ambiguity in how the chains should
|
|
42
|
+
be applied and applies design pressure on complex interactions in the implementation
|
|
43
|
+
code. As such `receive_message_chain` is not a perfect replacement for `receive`. (see
|
|
44
|
+
[Issue 921](https://github.com/rspec/rspec-mocks/issues/921) for a more detailed
|
|
45
|
+
explanation). Other mocking methods like `double` and `instance_double` provide a
|
|
46
|
+
better way of testing code with these interactions.
|
|
47
|
+
|
|
33
48
|
Scenario: Use `receive_message_chain` on a double
|
|
34
49
|
Given a file named "receive_message_chain_spec.rb" with:
|
|
35
50
|
"""ruby
|
|
@@ -34,12 +34,14 @@ module RSpec
|
|
|
34
34
|
record :and_throw
|
|
35
35
|
record :and_yield
|
|
36
36
|
record :and_call_original
|
|
37
|
+
record :and_wrap_original
|
|
37
38
|
record :with
|
|
38
39
|
record :once
|
|
39
40
|
record :twice
|
|
40
41
|
record :thrice
|
|
41
42
|
record :exactly
|
|
42
43
|
record :times
|
|
44
|
+
record :time
|
|
43
45
|
record :never
|
|
44
46
|
record :at_least
|
|
45
47
|
record :at_most
|
|
@@ -75,7 +77,7 @@ module RSpec
|
|
|
75
77
|
end
|
|
76
78
|
|
|
77
79
|
def never
|
|
78
|
-
|
|
80
|
+
AnyInstance.error_generator.raise_double_negation_error("expect_any_instance_of(MyClass)") if negated?
|
|
79
81
|
super
|
|
80
82
|
end
|
|
81
83
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
module AnyInstance
|
|
4
|
+
# @private
|
|
5
|
+
class ErrorGenerator < ::RSpec::Mocks::ErrorGenerator
|
|
6
|
+
def raise_second_instance_received_message_error(unfulfilled_expectations)
|
|
7
|
+
__raise "Exactly one instance should have received the following " \
|
|
8
|
+
"message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def raise_does_not_implement_error(klass, method_name)
|
|
12
|
+
__raise "#{klass} does not implement ##{method_name}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance)
|
|
16
|
+
__raise "The message '#{method_name}' was received by #{object_inspect} " \
|
|
17
|
+
"but has already been received by #{invoked_instance}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def raise_not_supported_with_prepend_error(method_name, problem_mod)
|
|
21
|
+
__raise "Using `any_instance` to stub a method (#{method_name}) that has been " \
|
|
22
|
+
"defined on a prepended module (#{problem_mod}) is not supported."
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.error_generator
|
|
27
|
+
@error_generator ||= ErrorGenerator.new
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -35,12 +35,14 @@ module RSpec
|
|
|
35
35
|
me
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
:with => [nil],
|
|
38
|
+
ExpectationInvocationOrder =
|
|
39
|
+
{
|
|
41
40
|
:and_return => [:with, nil],
|
|
42
|
-
:and_raise => [:with, nil]
|
|
43
|
-
}
|
|
41
|
+
:and_raise => [:with, nil],
|
|
42
|
+
}.freeze
|
|
43
|
+
|
|
44
|
+
def invocation_order
|
|
45
|
+
ExpectationInvocationOrder
|
|
44
46
|
end
|
|
45
47
|
end
|
|
46
48
|
end
|
|
@@ -75,9 +75,7 @@ module RSpec
|
|
|
75
75
|
return unless ExpectationChain === instance
|
|
76
76
|
return if @instance_with_expectation.equal?(instance)
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
"Exactly one instance should have received the following " \
|
|
80
|
-
"message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}"
|
|
78
|
+
AnyInstance.error_generator.raise_second_instance_received_message_error(unfulfilled_expectations)
|
|
81
79
|
end
|
|
82
80
|
end
|
|
83
81
|
end
|
|
@@ -18,8 +18,14 @@ module RSpec
|
|
|
18
18
|
@stubs = Hash.new { |hash, key| hash[key] = [] }
|
|
19
19
|
@observed_methods = []
|
|
20
20
|
@played_methods = {}
|
|
21
|
+
@backed_up_method_owner = {}
|
|
21
22
|
@klass = klass
|
|
22
23
|
@expectation_set = false
|
|
24
|
+
|
|
25
|
+
return unless RSpec::Mocks.configuration.verify_partial_doubles?
|
|
26
|
+
RSpec::Mocks.configuration.verifying_double_callbacks.each do |block|
|
|
27
|
+
block.call(ObjectReference.for(klass))
|
|
28
|
+
end
|
|
23
29
|
end
|
|
24
30
|
|
|
25
31
|
# Initializes the recording a stub to be played back against any
|
|
@@ -76,7 +82,7 @@ module RSpec
|
|
|
76
82
|
# @see Methods#unstub
|
|
77
83
|
def unstub(method_name)
|
|
78
84
|
unless @observed_methods.include?(method_name.to_sym)
|
|
79
|
-
|
|
85
|
+
AnyInstance.error_generator.raise_method_not_stubbed_error(method_name)
|
|
80
86
|
end
|
|
81
87
|
message_chains.remove_stub_chains_for!(method_name)
|
|
82
88
|
stubs[method_name].clear
|
|
@@ -91,9 +97,7 @@ module RSpec
|
|
|
91
97
|
return unless @expectation_set
|
|
92
98
|
return if message_chains.all_expectations_fulfilled?
|
|
93
99
|
|
|
94
|
-
|
|
95
|
-
"Exactly one instance should have received the following " \
|
|
96
|
-
"message(s) but didn't: #{message_chains.unfulfilled_expectations.sort.join(', ')}"
|
|
100
|
+
AnyInstance.error_generator.raise_second_instance_received_message_error(message_chains.unfulfilled_expectations)
|
|
97
101
|
end
|
|
98
102
|
|
|
99
103
|
# @private
|
|
@@ -192,9 +196,30 @@ module RSpec
|
|
|
192
196
|
return unless @klass.instance_method(method_name).owner == @klass
|
|
193
197
|
|
|
194
198
|
alias_method_name = build_alias_method_name(method_name)
|
|
195
|
-
@klass.class_exec do
|
|
199
|
+
@klass.class_exec(@backed_up_method_owner) do |backed_up_method_owner|
|
|
196
200
|
remove_method method_name
|
|
197
|
-
|
|
201
|
+
|
|
202
|
+
# A @klass can have methods implemented (see Method#owner) in @klass
|
|
203
|
+
# or inherited from a superclass. In ruby 2.2 and earlier, we can copy
|
|
204
|
+
# a method regardless of the 'owner' and restore it to @klass after
|
|
205
|
+
# because a call to 'super' from @klass's copied method would end up
|
|
206
|
+
# calling the original class's superclass's method.
|
|
207
|
+
#
|
|
208
|
+
# With the commit below, available starting in 2.3.0, ruby changed
|
|
209
|
+
# this behavior and a call to 'super' from the method copied to @klass
|
|
210
|
+
# will call @klass's superclass method, which is the original
|
|
211
|
+
# implementer of this method! This leads to very strange errors
|
|
212
|
+
# if @klass's copied method calls 'super', since it would end up
|
|
213
|
+
# calling itself, the original method implemented in @klass's
|
|
214
|
+
# superclass.
|
|
215
|
+
#
|
|
216
|
+
# For ruby 2.3 and above, we need to only restore methods that
|
|
217
|
+
# @klass originally owned.
|
|
218
|
+
#
|
|
219
|
+
# https://github.com/ruby/ruby/commit/c8854d2ca4be9ee6946e6d17b0e17d9ef130ee81
|
|
220
|
+
if RUBY_VERSION < "2.3" || backed_up_method_owner[method_name.to_sym] == self
|
|
221
|
+
alias_method method_name, alias_method_name
|
|
222
|
+
end
|
|
198
223
|
remove_method alias_method_name
|
|
199
224
|
end
|
|
200
225
|
end
|
|
@@ -206,10 +231,13 @@ module RSpec
|
|
|
206
231
|
end
|
|
207
232
|
|
|
208
233
|
def backup_method!(method_name)
|
|
234
|
+
return unless public_protected_or_private_method_defined?(method_name)
|
|
235
|
+
|
|
209
236
|
alias_method_name = build_alias_method_name(method_name)
|
|
237
|
+
@backed_up_method_owner[method_name.to_sym] ||= @klass.instance_method(method_name).owner
|
|
210
238
|
@klass.class_exec do
|
|
211
239
|
alias_method alias_method_name, method_name
|
|
212
|
-
end
|
|
240
|
+
end
|
|
213
241
|
end
|
|
214
242
|
|
|
215
243
|
def public_protected_or_private_method_defined?(method_name)
|
|
@@ -219,10 +247,9 @@ module RSpec
|
|
|
219
247
|
def observe!(method_name)
|
|
220
248
|
allow_no_prepended_module_definition_of(method_name)
|
|
221
249
|
|
|
222
|
-
if RSpec::Mocks.configuration.verify_partial_doubles?
|
|
250
|
+
if RSpec::Mocks.configuration.verify_partial_doubles? && !Mocks.configuration.temporarily_suppress_partial_double_verification
|
|
223
251
|
unless public_protected_or_private_method_defined?(method_name)
|
|
224
|
-
|
|
225
|
-
"#{@klass} does not implement ##{method_name}"
|
|
252
|
+
AnyInstance.error_generator.raise_does_not_implement_error(@klass, method_name)
|
|
226
253
|
end
|
|
227
254
|
end
|
|
228
255
|
|
|
@@ -234,6 +261,7 @@ module RSpec
|
|
|
234
261
|
recorder.playback!(self, method_name)
|
|
235
262
|
__send__(method_name, *args, &blk)
|
|
236
263
|
end
|
|
264
|
+
@klass.__send__(:ruby2_keywords, method_name) if @klass.respond_to?(:ruby2_keywords, true)
|
|
237
265
|
end
|
|
238
266
|
|
|
239
267
|
def mark_invoked!(method_name)
|
|
@@ -242,7 +270,9 @@ module RSpec
|
|
|
242
270
|
@klass.__send__(:define_method, method_name) do |*_args, &_blk|
|
|
243
271
|
invoked_instance = recorder.instance_that_received(method_name)
|
|
244
272
|
inspect = "#<#{self.class}:#{object_id} #{instance_variables.map { |name| "#{name}=#{instance_variable_get name}" }.join(', ')}>"
|
|
245
|
-
|
|
273
|
+
AnyInstance.error_generator.raise_message_already_received_by_other_instance_error(
|
|
274
|
+
method_name, inspect, invoked_instance
|
|
275
|
+
)
|
|
246
276
|
end
|
|
247
277
|
end
|
|
248
278
|
|
|
@@ -252,9 +282,7 @@ module RSpec
|
|
|
252
282
|
problem_mod = prepended_modules.find { |mod| mod.method_defined?(method_name) }
|
|
253
283
|
return unless problem_mod
|
|
254
284
|
|
|
255
|
-
|
|
256
|
-
"Using `any_instance` to stub a method (#{method_name}) that has been " \
|
|
257
|
-
"defined on a prepended module (#{problem_mod}) is not supported."
|
|
285
|
+
AnyInstance.error_generator.raise_not_supported_with_prepend_error(method_name, problem_mod)
|
|
258
286
|
end
|
|
259
287
|
else
|
|
260
288
|
def allow_no_prepended_module_definition_of(_method_name)
|
|
@@ -25,18 +25,24 @@ module RSpec
|
|
|
25
25
|
stub
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
:with => [nil],
|
|
28
|
+
InvocationOrder =
|
|
29
|
+
{
|
|
31
30
|
:and_return => [:with, nil],
|
|
32
31
|
:and_raise => [:with, nil],
|
|
33
|
-
:and_yield => [:with, nil],
|
|
34
|
-
:
|
|
35
|
-
|
|
32
|
+
:and_yield => [:with, :and_yield, nil],
|
|
33
|
+
:and_throw => [:with, nil],
|
|
34
|
+
:and_call_original => [:with, nil],
|
|
35
|
+
:and_wrap_original => [:with, nil]
|
|
36
|
+
}.freeze
|
|
37
|
+
|
|
38
|
+
EmptyInvocationOrder = {}.freeze
|
|
39
|
+
|
|
40
|
+
def invocation_order
|
|
41
|
+
InvocationOrder
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
def verify_invocation_order(rspec_method_name, *_args, &_block)
|
|
39
|
-
return if invocation_order[
|
|
45
|
+
return if invocation_order.fetch(rspec_method_name, [nil]).include?(last_message)
|
|
40
46
|
raise NoMethodError, "Undefined method #{rspec_method_name}"
|
|
41
47
|
end
|
|
42
48
|
end
|
|
@@ -44,29 +44,72 @@ module RSpec
|
|
|
44
44
|
# @see #args_match?
|
|
45
45
|
def initialize(*expected_args)
|
|
46
46
|
@expected_args = expected_args
|
|
47
|
-
|
|
48
|
-
@matchers = case expected_args.first
|
|
49
|
-
when ArgumentMatchers::AnyArgsMatcher then Array
|
|
50
|
-
when ArgumentMatchers::NoArgsMatcher then []
|
|
51
|
-
else expected_args
|
|
52
|
-
end
|
|
47
|
+
ensure_expected_args_valid!
|
|
53
48
|
end
|
|
49
|
+
ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
|
|
54
50
|
|
|
55
51
|
# @api public
|
|
56
|
-
# @param [Array]
|
|
52
|
+
# @param [Array] actual_args
|
|
57
53
|
#
|
|
58
54
|
# Matches each element in the `expected_args` against the element in the same
|
|
59
55
|
# position of the arguments passed to `new`.
|
|
60
56
|
#
|
|
61
57
|
# @see #initialize
|
|
62
|
-
def args_match?(*
|
|
63
|
-
|
|
58
|
+
def args_match?(*actual_args)
|
|
59
|
+
expected_args = resolve_expected_args_based_on(actual_args)
|
|
60
|
+
|
|
61
|
+
return false if expected_args.size != actual_args.size
|
|
62
|
+
|
|
63
|
+
if RUBY_VERSION >= "3"
|
|
64
|
+
# if both arguments end with Hashes, and if one is a keyword hash and the other is not, they don't match
|
|
65
|
+
if Hash === expected_args.last && Hash === actual_args.last
|
|
66
|
+
if !Hash.ruby2_keywords_hash?(actual_args.last) && Hash.ruby2_keywords_hash?(expected_args.last)
|
|
67
|
+
return false
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
Support::FuzzyMatcher.values_match?(expected_args, actual_args)
|
|
73
|
+
end
|
|
74
|
+
ruby2_keywords :args_match? if respond_to?(:ruby2_keywords, true)
|
|
75
|
+
|
|
76
|
+
# @private
|
|
77
|
+
# Resolves abstract arg placeholders like `no_args` and `any_args` into
|
|
78
|
+
# a more concrete arg list based on the provided `actual_args`.
|
|
79
|
+
def resolve_expected_args_based_on(actual_args)
|
|
80
|
+
return [] if [ArgumentMatchers::NoArgsMatcher::INSTANCE] == expected_args
|
|
81
|
+
|
|
82
|
+
any_args_index = expected_args.index { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a }
|
|
83
|
+
return expected_args unless any_args_index
|
|
84
|
+
|
|
85
|
+
replace_any_args_with_splat_of_anything(any_args_index, actual_args.count)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def replace_any_args_with_splat_of_anything(before_count, actual_args_count)
|
|
91
|
+
any_args_count = actual_args_count - expected_args.count + 1
|
|
92
|
+
after_count = expected_args.count - before_count - 1
|
|
93
|
+
|
|
94
|
+
any_args = 1.upto(any_args_count).map { ArgumentMatchers::AnyArgMatcher::INSTANCE }
|
|
95
|
+
expected_args.first(before_count) + any_args + expected_args.last(after_count)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def ensure_expected_args_valid!
|
|
99
|
+
if expected_args.count { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } > 1
|
|
100
|
+
raise ArgumentError, "`any_args` can only be passed to " \
|
|
101
|
+
"`with` once but you have passed it multiple times."
|
|
102
|
+
elsif expected_args.count > 1 && expected_args.any? { |a| ArgumentMatchers::NoArgsMatcher::INSTANCE == a }
|
|
103
|
+
raise ArgumentError, "`no_args` can only be passed as a " \
|
|
104
|
+
"singleton argument to `with` (i.e. `with(no_args)`), " \
|
|
105
|
+
"but you have passed additional arguments."
|
|
106
|
+
end
|
|
64
107
|
end
|
|
65
108
|
|
|
66
109
|
# Value that will match all argument lists.
|
|
67
110
|
#
|
|
68
111
|
# @private
|
|
69
|
-
MATCH_ALL = new(ArgumentMatchers::AnyArgsMatcher
|
|
112
|
+
MATCH_ALL = new(ArgumentMatchers::AnyArgsMatcher::INSTANCE)
|
|
70
113
|
end
|
|
71
114
|
end
|
|
72
115
|
end
|
|
@@ -14,38 +14,38 @@ module RSpec
|
|
|
14
14
|
#
|
|
15
15
|
# @see ArgumentListMatcher
|
|
16
16
|
module ArgumentMatchers
|
|
17
|
-
#
|
|
18
|
-
# `expect(object).to receive(:message)`
|
|
17
|
+
# Acts like an arg splat, matching any number of args at any point in an arg list.
|
|
19
18
|
#
|
|
20
19
|
# @example
|
|
20
|
+
# expect(object).to receive(:message).with(1, 2, any_args)
|
|
21
21
|
#
|
|
22
|
-
#
|
|
22
|
+
# # matches any of these:
|
|
23
|
+
# object.message(1, 2)
|
|
24
|
+
# object.message(1, 2, 3)
|
|
25
|
+
# object.message(1, 2, 3, 4)
|
|
23
26
|
def any_args
|
|
24
|
-
AnyArgsMatcher
|
|
27
|
+
AnyArgsMatcher::INSTANCE
|
|
25
28
|
end
|
|
26
29
|
|
|
27
30
|
# Matches any argument at all.
|
|
28
31
|
#
|
|
29
32
|
# @example
|
|
30
|
-
#
|
|
31
33
|
# expect(object).to receive(:message).with(anything)
|
|
32
34
|
def anything
|
|
33
|
-
AnyArgMatcher
|
|
35
|
+
AnyArgMatcher::INSTANCE
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
# Matches no arguments.
|
|
37
39
|
#
|
|
38
40
|
# @example
|
|
39
|
-
#
|
|
40
41
|
# expect(object).to receive(:message).with(no_args)
|
|
41
42
|
def no_args
|
|
42
|
-
NoArgsMatcher
|
|
43
|
+
NoArgsMatcher::INSTANCE
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
# Matches if the actual argument responds to the specified messages.
|
|
46
47
|
#
|
|
47
48
|
# @example
|
|
48
|
-
#
|
|
49
49
|
# expect(object).to receive(:message).with(duck_type(:hello))
|
|
50
50
|
# expect(object).to receive(:message).with(duck_type(:hello, :goodbye))
|
|
51
51
|
def duck_type(*args)
|
|
@@ -55,17 +55,15 @@ module RSpec
|
|
|
55
55
|
# Matches a boolean value.
|
|
56
56
|
#
|
|
57
57
|
# @example
|
|
58
|
-
#
|
|
59
58
|
# expect(object).to receive(:message).with(boolean())
|
|
60
59
|
def boolean
|
|
61
|
-
BooleanMatcher
|
|
60
|
+
BooleanMatcher::INSTANCE
|
|
62
61
|
end
|
|
63
62
|
|
|
64
63
|
# Matches a hash that includes the specified key(s) or key/value pairs.
|
|
65
64
|
# Ignores any additional keys.
|
|
66
65
|
#
|
|
67
66
|
# @example
|
|
68
|
-
#
|
|
69
67
|
# expect(object).to receive(:message).with(hash_including(:key => val))
|
|
70
68
|
# expect(object).to receive(:message).with(hash_including(:key))
|
|
71
69
|
# expect(object).to receive(:message).with(hash_including(:key, :key2 => val2))
|
|
@@ -77,7 +75,6 @@ module RSpec
|
|
|
77
75
|
# Ignores duplicates and additional values
|
|
78
76
|
#
|
|
79
77
|
# @example
|
|
80
|
-
#
|
|
81
78
|
# expect(object).to receive(:message).with(array_including(1,2,3))
|
|
82
79
|
# expect(object).to receive(:message).with(array_including([1,2,3]))
|
|
83
80
|
def array_including(*args)
|
|
@@ -88,7 +85,6 @@ module RSpec
|
|
|
88
85
|
# Matches a hash that doesn't include the specified key(s) or key/value.
|
|
89
86
|
#
|
|
90
87
|
# @example
|
|
91
|
-
#
|
|
92
88
|
# expect(object).to receive(:message).with(hash_excluding(:key => val))
|
|
93
89
|
# expect(object).to receive(:message).with(hash_excluding(:key))
|
|
94
90
|
# expect(object).to receive(:message).with(hash_excluding(:key, :key2 => :val2))
|
|
@@ -101,7 +97,6 @@ module RSpec
|
|
|
101
97
|
# Matches if `arg.instance_of?(klass)`
|
|
102
98
|
#
|
|
103
99
|
# @example
|
|
104
|
-
#
|
|
105
100
|
# expect(object).to receive(:message).with(instance_of(Thing))
|
|
106
101
|
def instance_of(klass)
|
|
107
102
|
InstanceOf.new(klass)
|
|
@@ -110,8 +105,8 @@ module RSpec
|
|
|
110
105
|
alias_method :an_instance_of, :instance_of
|
|
111
106
|
|
|
112
107
|
# Matches if `arg.kind_of?(klass)`
|
|
113
|
-
# @example
|
|
114
108
|
#
|
|
109
|
+
# @example
|
|
115
110
|
# expect(object).to receive(:message).with(kind_of(Thing))
|
|
116
111
|
def kind_of(klass)
|
|
117
112
|
KindOf.new(klass)
|
|
@@ -121,20 +116,37 @@ module RSpec
|
|
|
121
116
|
|
|
122
117
|
# @private
|
|
123
118
|
def self.anythingize_lonely_keys(*args)
|
|
124
|
-
hash = args.last
|
|
125
|
-
args.each { | arg | hash[arg] = AnyArgMatcher
|
|
119
|
+
hash = Hash === args.last ? args.delete_at(-1) : {}
|
|
120
|
+
args.each { | arg | hash[arg] = AnyArgMatcher::INSTANCE }
|
|
126
121
|
hash
|
|
127
122
|
end
|
|
128
123
|
|
|
124
|
+
# Intended to be subclassed by stateless, immutable argument matchers.
|
|
125
|
+
# Provides a `<klass name>::INSTANCE` constant for accessing a global
|
|
126
|
+
# singleton instance of the matcher. There is no need to construct
|
|
127
|
+
# multiple instance since there is no state. It also facilities the
|
|
128
|
+
# special case logic we need for some of these matchers, by making it
|
|
129
|
+
# easy to do comparisons like: `[klass::INSTANCE] == args` rather than
|
|
130
|
+
# `args.count == 1 && klass === args.first`.
|
|
131
|
+
#
|
|
132
|
+
# @private
|
|
133
|
+
class SingletonMatcher
|
|
134
|
+
private_class_method :new
|
|
135
|
+
|
|
136
|
+
def self.inherited(subklass)
|
|
137
|
+
subklass.const_set(:INSTANCE, subklass.send(:new))
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
129
141
|
# @private
|
|
130
|
-
class AnyArgsMatcher
|
|
142
|
+
class AnyArgsMatcher < SingletonMatcher
|
|
131
143
|
def description
|
|
132
|
-
"any args"
|
|
144
|
+
"*(any args)"
|
|
133
145
|
end
|
|
134
146
|
end
|
|
135
147
|
|
|
136
148
|
# @private
|
|
137
|
-
class AnyArgMatcher
|
|
149
|
+
class AnyArgMatcher < SingletonMatcher
|
|
138
150
|
def ===(_other)
|
|
139
151
|
true
|
|
140
152
|
end
|
|
@@ -145,14 +157,14 @@ module RSpec
|
|
|
145
157
|
end
|
|
146
158
|
|
|
147
159
|
# @private
|
|
148
|
-
class NoArgsMatcher
|
|
160
|
+
class NoArgsMatcher < SingletonMatcher
|
|
149
161
|
def description
|
|
150
162
|
"no args"
|
|
151
163
|
end
|
|
152
164
|
end
|
|
153
165
|
|
|
154
166
|
# @private
|
|
155
|
-
class BooleanMatcher
|
|
167
|
+
class BooleanMatcher < SingletonMatcher
|
|
156
168
|
def ===(value)
|
|
157
169
|
true == value || false == value
|
|
158
170
|
end
|
|
@@ -177,7 +189,20 @@ module RSpec
|
|
|
177
189
|
end
|
|
178
190
|
|
|
179
191
|
def description(name)
|
|
180
|
-
"#{name}(#{
|
|
192
|
+
"#{name}(#{formatted_expected_hash.inspect.sub(/^\{/, "").sub(/\}$/, "")})"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
private
|
|
196
|
+
|
|
197
|
+
def formatted_expected_hash
|
|
198
|
+
Hash[
|
|
199
|
+
@expected.map do |k, v|
|
|
200
|
+
k = RSpec::Support.rspec_description_for_object(k)
|
|
201
|
+
v = RSpec::Support.rspec_description_for_object(v)
|
|
202
|
+
|
|
203
|
+
[k, v]
|
|
204
|
+
end
|
|
205
|
+
]
|
|
181
206
|
end
|
|
182
207
|
end
|
|
183
208
|
|
|
@@ -210,11 +235,26 @@ module RSpec
|
|
|
210
235
|
end
|
|
211
236
|
|
|
212
237
|
def ===(actual)
|
|
213
|
-
|
|
238
|
+
actual = actual.uniq
|
|
239
|
+
@expected.uniq.all? do |expected_element|
|
|
240
|
+
actual.any? do |actual_element|
|
|
241
|
+
RSpec::Support::FuzzyMatcher.values_match?(expected_element, actual_element)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
rescue NoMethodError
|
|
245
|
+
false
|
|
214
246
|
end
|
|
215
247
|
|
|
216
248
|
def description
|
|
217
|
-
"array_including(#{
|
|
249
|
+
"array_including(#{formatted_expected_values})"
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
private
|
|
253
|
+
|
|
254
|
+
def formatted_expected_values
|
|
255
|
+
@expected.map do |x|
|
|
256
|
+
RSpec::Support.rspec_description_for_object(x)
|
|
257
|
+
end.join(", ")
|
|
218
258
|
end
|
|
219
259
|
end
|
|
220
260
|
|