opal-rspec 0.8.0 → 1.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (682) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +7 -7
  3. data/.gitmodules +6 -0
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile +13 -0
  6. data/README.md +63 -59
  7. data/diff-lcs/spec/files_to_exclude.txt +1 -0
  8. data/diff-lcs/spec/requires.rb +4 -0
  9. data/diff-lcs/upstream/.autotest +5 -0
  10. data/diff-lcs/upstream/.fasterer.yml +3 -0
  11. data/{stubs/diff/lcs.rb → diff-lcs/upstream/.gemtest} +0 -0
  12. data/diff-lcs/upstream/.github/workflows/ci.yml +64 -0
  13. data/diff-lcs/upstream/.github/workflows/codeql-analysis.yml +70 -0
  14. data/diff-lcs/upstream/.gitignore +20 -0
  15. data/diff-lcs/upstream/.hoerc +52 -0
  16. data/diff-lcs/upstream/.rspec +1 -0
  17. data/diff-lcs/upstream/.standard.yml +6 -0
  18. data/diff-lcs/upstream/Code-of-Conduct.md +74 -0
  19. data/diff-lcs/upstream/Contributing.md +119 -0
  20. data/diff-lcs/upstream/Gemfile +28 -0
  21. data/diff-lcs/upstream/History.md +407 -0
  22. data/diff-lcs/upstream/License.md +41 -0
  23. data/diff-lcs/upstream/Manifest.txt +59 -0
  24. data/diff-lcs/upstream/README.rdoc +84 -0
  25. data/diff-lcs/upstream/Rakefile +127 -0
  26. data/diff-lcs/upstream/bin/htmldiff +35 -0
  27. data/diff-lcs/upstream/bin/ldiff +9 -0
  28. data/diff-lcs/upstream/diff-lcs.gemspec +48 -0
  29. data/diff-lcs/upstream/docs/COPYING.txt +339 -0
  30. data/diff-lcs/upstream/docs/artistic.txt +127 -0
  31. data/diff-lcs/upstream/lib/diff/lcs/array.rb +7 -0
  32. data/diff-lcs/upstream/lib/diff/lcs/backports.rb +9 -0
  33. data/diff-lcs/upstream/lib/diff/lcs/block.rb +37 -0
  34. data/diff-lcs/upstream/lib/diff/lcs/callbacks.rb +327 -0
  35. data/diff-lcs/upstream/lib/diff/lcs/change.rb +174 -0
  36. data/diff-lcs/upstream/lib/diff/lcs/htmldiff.rb +158 -0
  37. data/diff-lcs/upstream/lib/diff/lcs/hunk.rb +363 -0
  38. data/diff-lcs/upstream/lib/diff/lcs/internals.rb +308 -0
  39. data/diff-lcs/upstream/lib/diff/lcs/ldiff.rb +173 -0
  40. data/diff-lcs/upstream/lib/diff/lcs/string.rb +5 -0
  41. data/diff-lcs/upstream/lib/diff/lcs.rb +741 -0
  42. data/diff-lcs/upstream/lib/diff-lcs.rb +3 -0
  43. data/diff-lcs/upstream/spec/change_spec.rb +89 -0
  44. data/diff-lcs/upstream/spec/diff_spec.rb +51 -0
  45. data/diff-lcs/upstream/spec/fixtures/aX +1 -0
  46. data/diff-lcs/upstream/spec/fixtures/bXaX +1 -0
  47. data/diff-lcs/upstream/spec/fixtures/ds1.csv +50 -0
  48. data/diff-lcs/upstream/spec/fixtures/ds2.csv +51 -0
  49. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff +4 -0
  50. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-c +7 -0
  51. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-e +3 -0
  52. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-f +3 -0
  53. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-u +5 -0
  54. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef +4 -0
  55. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-c +15 -0
  56. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-e +3 -0
  57. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-f +3 -0
  58. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-u +9 -0
  59. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2 +7 -0
  60. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-c +20 -0
  61. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-d +7 -0
  62. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-e +7 -0
  63. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-f +7 -0
  64. data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-u +16 -0
  65. data/diff-lcs/upstream/spec/fixtures/new-chef +4 -0
  66. data/diff-lcs/upstream/spec/fixtures/new-chef2 +17 -0
  67. data/diff-lcs/upstream/spec/fixtures/old-chef +4 -0
  68. data/diff-lcs/upstream/spec/fixtures/old-chef2 +14 -0
  69. data/diff-lcs/upstream/spec/hunk_spec.rb +83 -0
  70. data/diff-lcs/upstream/spec/issues_spec.rb +160 -0
  71. data/diff-lcs/upstream/spec/lcs_spec.rb +56 -0
  72. data/diff-lcs/upstream/spec/ldiff_spec.rb +89 -0
  73. data/diff-lcs/upstream/spec/patch_spec.rb +416 -0
  74. data/diff-lcs/upstream/spec/sdiff_spec.rb +216 -0
  75. data/diff-lcs/upstream/spec/spec_helper.rb +376 -0
  76. data/diff-lcs/upstream/spec/traverse_balanced_spec.rb +312 -0
  77. data/diff-lcs/upstream/spec/traverse_sequences_spec.rb +137 -0
  78. data/lib/opal/rspec/runner.rb +11 -0
  79. data/lib/opal/rspec/sprockets.rb +6 -0
  80. data/lib/opal/rspec/version.rb +1 -1
  81. data/lib/opal/rspec.rb +1 -2
  82. data/lib-opal/opal/rspec/async/configuration.rb +39 -0
  83. data/lib-opal/opal/rspec/async/example.rb +80 -168
  84. data/lib-opal/opal/rspec/async/example_group.rb +71 -81
  85. data/lib-opal/opal/rspec/async/hooks.rb +98 -8
  86. data/lib-opal/opal/rspec/async/memoized_helpers.rb +32 -0
  87. data/lib-opal/opal/rspec/async/reporter.rb +6 -3
  88. data/lib-opal/opal/rspec/async/runner.rb +33 -24
  89. data/lib-opal/opal/rspec/async.rb +4 -1
  90. data/lib-opal/opal/rspec/browser.rb +0 -8
  91. data/lib-opal/opal/rspec/browser_early.rb +5 -0
  92. data/lib-opal/opal/rspec/fixes/diff-lcs/hunk.rb +164 -0
  93. data/lib-opal/opal/rspec/fixes/diff-lcs/lcs.rb +112 -0
  94. data/lib-opal/opal/rspec/fixes/diff-lcs.rb +2 -0
  95. data/lib-opal/opal/rspec/fixes/opal.rb +4 -17
  96. data/lib-opal/opal/rspec/fixes/rspec/core/example_status_persister.rb +11 -0
  97. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +3 -12
  98. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/exception_presenter.rb +28 -0
  99. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +0 -32
  100. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/snippet_extractor.rb +17 -0
  101. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/syntax_highlighter.rb +17 -0
  102. data/lib-opal/opal/rspec/fixes/rspec/core/formatters.rb +3 -4
  103. data/lib-opal/opal/rspec/fixes/rspec/core/metadata.rb +24 -8
  104. data/lib-opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +3 -20
  105. data/lib-opal/opal/rspec/fixes/rspec/core/notifications.rb +0 -2
  106. data/lib-opal/opal/rspec/fixes/rspec/core.rb +1 -2
  107. data/lib-opal/opal/rspec/fixes/rspec/expectations.rb +0 -1
  108. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/base_matcher.rb +26 -0
  109. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in.rb +1 -3
  110. data/lib-opal/opal/rspec/fixes/rspec/matchers/expecteds_for_multiple_diffs.rb +13 -0
  111. data/lib-opal/opal/rspec/fixes/rspec/matchers.rb +1 -1
  112. data/lib-opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +26 -10
  113. data/lib-opal/opal/rspec/fixes/rspec/mocks/proxy.rb +19 -0
  114. data/lib-opal/opal/rspec/fixes/rspec/mocks.rb +1 -3
  115. data/lib-opal/opal/rspec/fixes/rspec/support/differ.rb +29 -0
  116. data/lib-opal/opal/rspec/fixes/rspec/support/encoded_string.rb +9 -5
  117. data/lib-opal/opal/rspec/fixes/rspec/support/ruby_features.rb +22 -0
  118. data/lib-opal/opal/rspec/fixes/rspec/support/source.rb +15 -0
  119. data/lib-opal/opal/rspec/fixes/rspec/support.rb +3 -3
  120. data/lib-opal/opal/rspec/fixes/rspec.rb +0 -1
  121. data/lib-opal/opal/rspec/fixes.rb +1 -0
  122. data/lib-opal/opal/rspec/formatter/html_printer.rb +1 -1
  123. data/lib-opal/opal/rspec/pre_require_fixes.rb +1 -5
  124. data/lib-opal/opal/rspec/requires.rb +32 -19
  125. data/lib-opal/opal/rspec/sprockets_runner.rb.erb +1 -0
  126. data/lib-opal/opal/rspec.rb +3 -0
  127. data/opal-rspec.gemspec +1 -1
  128. data/rspec/upstream/.document +1 -1
  129. data/rspec/upstream/.github/FUNDING.yml +5 -0
  130. data/rspec/upstream/.gitignore +1 -0
  131. data/rspec/upstream/LICENSE.md +27 -0
  132. data/rspec/upstream/README.md +26 -26
  133. data/rspec/upstream/Rakefile +1 -1
  134. data/rspec/upstream/certs/rspec.pem +32 -20
  135. data/rspec/upstream/certs/samphippen.asc +18 -0
  136. data/rspec/upstream/code_of_conduct.md +59 -0
  137. data/rspec/upstream/lib/rspec/version.rb +1 -1
  138. data/rspec/upstream/rspec.gemspec +7 -2
  139. data/rspec-core/upstream/.document +1 -1
  140. data/rspec-core/upstream/.github/FUNDING.yml +5 -0
  141. data/rspec-core/upstream/.github/workflows/ci.yml +150 -0
  142. data/rspec-core/upstream/.gitignore +2 -0
  143. data/rspec-core/upstream/.rspec +1 -0
  144. data/rspec-core/upstream/.rubocop.yml +64 -12
  145. data/rspec-core/upstream/.rubocop_rspec_base.yml +224 -38
  146. data/rspec-core/upstream/.rubocop_todo.yml +1031 -0
  147. data/rspec-core/upstream/.yardopts +2 -1
  148. data/rspec-core/upstream/BUILD_DETAIL.md +149 -0
  149. data/rspec-core/upstream/CODE_OF_CONDUCT.md +59 -0
  150. data/rspec-core/upstream/CONTRIBUTING.md +86 -0
  151. data/rspec-core/upstream/Changelog.md +721 -2
  152. data/rspec-core/upstream/DEV-README.md +2 -2
  153. data/rspec-core/upstream/DEVELOPMENT.md +131 -0
  154. data/rspec-core/upstream/Filtering.md +173 -0
  155. data/rspec-core/upstream/Gemfile +78 -9
  156. data/rspec-core/upstream/ISSUE_TEMPLATE.md +24 -0
  157. data/rspec-core/upstream/{License.txt → LICENSE.md} +6 -5
  158. data/rspec-core/upstream/README.md +165 -24
  159. data/rspec-core/upstream/REPORT_TEMPLATE.md +43 -0
  160. data/rspec-core/upstream/Rakefile +1 -1
  161. data/rspec-core/upstream/benchmarks/allocations/1000_groups_1_example.rb +124 -0
  162. data/rspec-core/upstream/benchmarks/allocations/1_group_1000_examples.rb +63 -0
  163. data/rspec-core/upstream/benchmarks/allocations/helper.rb +30 -0
  164. data/rspec-core/upstream/benchmarks/allocations/running_1000_groups_1_example.rb +100 -0
  165. data/rspec-core/upstream/benchmarks/allocations/running_1_group_1000_examples.rb +60 -0
  166. data/rspec-core/upstream/benchmarks/capture_block_vs_yield.rb +208 -0
  167. data/rspec-core/upstream/benchmarks/flat_map_vs_inject.rb +55 -0
  168. data/rspec-core/upstream/benchmarks/hash_functions.rb +74 -0
  169. data/rspec-core/upstream/benchmarks/keys_each_vs_each_key.rb +43 -0
  170. data/rspec-core/upstream/benchmarks/module_inclusion_filtering.rb +89 -0
  171. data/rspec-core/upstream/benchmarks/precalculate_absolute_file_path_or_not.rb +29 -0
  172. data/rspec-core/upstream/benchmarks/shuffle_vs_sort_by_for_random_ordering.rb +131 -0
  173. data/rspec-core/upstream/benchmarks/singleton_example_groups/helper.rb +122 -0
  174. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks.rb +28 -0
  175. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks_module_inclusions_and_shared_context_inclusions.rb +35 -0
  176. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_module_inclusions.rb +28 -0
  177. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_no_config_hooks_or_inclusions.rb +22 -0
  178. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_shared_context_inclusions.rb +28 -0
  179. data/rspec-core/upstream/benchmarks/threadsafe_let_block.rb +312 -0
  180. data/rspec-core/upstream/cucumber.yml +7 -2
  181. data/rspec-core/upstream/features/.nav +5 -1
  182. data/rspec-core/upstream/features/README.md +2 -2
  183. data/rspec-core/upstream/features/clear_examples.feature +106 -0
  184. data/rspec-core/upstream/features/command_line/bisect.feature +178 -0
  185. data/rspec-core/upstream/features/command_line/example_matches_name_option.feature +131 -0
  186. data/rspec-core/upstream/features/command_line/example_name_option.feature +2 -0
  187. data/rspec-core/upstream/features/command_line/fail_fast.feature +21 -4
  188. data/rspec-core/upstream/features/command_line/init.feature +2 -2
  189. data/rspec-core/upstream/features/command_line/line_number_appended_to_path.feature +2 -2
  190. data/rspec-core/upstream/features/command_line/only_failures.feature +113 -0
  191. data/rspec-core/upstream/features/command_line/order.md +8 -1
  192. data/rspec-core/upstream/features/command_line/pattern_option.feature +6 -3
  193. data/rspec-core/upstream/features/command_line/rake_task.feature +3 -3
  194. data/rspec-core/upstream/features/command_line/randomization.feature +5 -2
  195. data/rspec-core/upstream/features/command_line/ruby.feature +6 -2
  196. data/rspec-core/upstream/features/command_line/tag.feature +13 -11
  197. data/rspec-core/upstream/features/command_line/warnings_option.feature +20 -3
  198. data/rspec-core/upstream/features/configuration/backtrace_exclusion_patterns.feature +45 -29
  199. data/rspec-core/upstream/features/configuration/color.feature +22 -0
  200. data/rspec-core/upstream/features/configuration/custom_settings.feature +9 -13
  201. data/rspec-core/upstream/features/configuration/default_path.feature +1 -1
  202. data/rspec-core/upstream/features/configuration/enable_global_dsl.feature +15 -1
  203. data/rspec-core/upstream/features/configuration/error_exit_code.feature +52 -0
  204. data/rspec-core/upstream/features/configuration/fail_fast.feature +42 -12
  205. data/rspec-core/upstream/features/configuration/fail_if_no_examples.feature +31 -0
  206. data/rspec-core/upstream/features/configuration/failure_exit_code.feature +26 -0
  207. data/rspec-core/upstream/features/configuration/overriding_global_ordering.feature +1 -1
  208. data/rspec-core/upstream/features/configuration/pattern.feature +1 -1
  209. data/rspec-core/upstream/features/configuration/profile.feature +25 -0
  210. data/rspec-core/upstream/features/configuration/read_options_from_file.feature +25 -19
  211. data/rspec-core/upstream/features/configuration/run_all_when_everything_filtered.feature +4 -0
  212. data/rspec-core/upstream/features/core_standalone.feature +2 -0
  213. data/rspec-core/upstream/features/example_groups/basic_structure.feature +1 -0
  214. data/rspec-core/upstream/features/example_groups/shared_context.feature +55 -5
  215. data/rspec-core/upstream/features/example_groups/shared_examples.feature +59 -15
  216. data/rspec-core/upstream/features/expectation_framework_integration/aggregating_failures.feature +602 -0
  217. data/rspec-core/upstream/features/expectation_framework_integration/configure_expectation_framework.feature +13 -5
  218. data/rspec-core/upstream/features/filtering/filter_run_when_matching.feature +75 -0
  219. data/rspec-core/upstream/features/formatters/configurable_colors.feature +23 -4
  220. data/rspec-core/upstream/features/helper_methods/let.feature +3 -0
  221. data/rspec-core/upstream/features/helper_methods/modules.feature +6 -0
  222. data/rspec-core/upstream/features/hooks/around_hooks.feature +36 -6
  223. data/rspec-core/upstream/features/hooks/before_and_after_hooks.feature +47 -5
  224. data/rspec-core/upstream/features/hooks/filtering.feature +199 -4
  225. data/rspec-core/upstream/features/hooks/when_first_matching_example_defined.feature +70 -0
  226. data/rspec-core/upstream/features/metadata/current_scope.feature +87 -0
  227. data/rspec-core/upstream/features/metadata/described_class.feature +12 -5
  228. data/rspec-core/upstream/features/metadata/user_defined.feature +3 -3
  229. data/rspec-core/upstream/features/mock_framework_integration/use_any_framework.feature +1 -1
  230. data/rspec-core/upstream/features/mock_framework_integration/use_flexmock.feature +5 -5
  231. data/rspec-core/upstream/features/mock_framework_integration/use_mocha.feature +5 -5
  232. data/rspec-core/upstream/features/mock_framework_integration/use_rr.feature +5 -5
  233. data/rspec-core/upstream/features/mock_framework_integration/use_rspec.feature +6 -6
  234. data/rspec-core/upstream/features/pending_and_skipped_examples/pending_examples.feature +8 -7
  235. data/rspec-core/upstream/features/pending_and_skipped_examples/skipped_examples.feature +49 -22
  236. data/rspec-core/upstream/features/step_definitions/additional_cli_steps.rb +142 -12
  237. data/rspec-core/upstream/features/step_definitions/core_standalone_steps.rb +6 -2
  238. data/rspec-core/upstream/features/subject/implicit_subject.feature +3 -2
  239. data/rspec-core/upstream/features/subject/one_liner_syntax.feature +9 -5
  240. data/rspec-core/upstream/features/support/diff_lcs_versions.rb +17 -0
  241. data/rspec-core/upstream/features/support/env.rb +20 -7
  242. data/rspec-core/upstream/features/support/jruby.rb +8 -0
  243. data/rspec-core/upstream/features/support/require_expect_syntax_in_aruba_specs.rb +6 -3
  244. data/rspec-core/upstream/features/support/rubinius.rb +5 -1
  245. data/rspec-core/upstream/features/support/ruby_27_support.rb +7 -0
  246. data/rspec-core/upstream/features/support/send_sigint_during_bisect.rb +21 -0
  247. data/rspec-core/upstream/lib/rspec/autorun.rb +1 -0
  248. data/rspec-core/upstream/lib/rspec/core/backtrace_formatter.rb +3 -4
  249. data/rspec-core/upstream/lib/rspec/core/bisect/coordinator.rb +62 -0
  250. data/rspec-core/upstream/lib/rspec/core/bisect/example_minimizer.rb +173 -0
  251. data/rspec-core/upstream/lib/rspec/core/bisect/fork_runner.rb +138 -0
  252. data/rspec-core/upstream/lib/rspec/core/bisect/server.rb +61 -0
  253. data/rspec-core/upstream/lib/rspec/core/bisect/shell_command.rb +126 -0
  254. data/rspec-core/upstream/lib/rspec/core/bisect/shell_runner.rb +73 -0
  255. data/rspec-core/upstream/lib/rspec/core/bisect/utilities.rb +69 -0
  256. data/rspec-core/upstream/lib/rspec/core/configuration.rb +1157 -212
  257. data/rspec-core/upstream/lib/rspec/core/configuration_options.rb +82 -22
  258. data/rspec-core/upstream/lib/rspec/core/did_you_mean.rb +46 -0
  259. data/rspec-core/upstream/lib/rspec/core/drb.rb +10 -1
  260. data/rspec-core/upstream/lib/rspec/core/dsl.rb +10 -5
  261. data/rspec-core/upstream/lib/rspec/core/example.rb +271 -107
  262. data/rspec-core/upstream/lib/rspec/core/example_group.rb +426 -127
  263. data/rspec-core/upstream/lib/rspec/core/example_status_persister.rb +235 -0
  264. data/rspec-core/upstream/lib/rspec/core/filter_manager.rb +76 -104
  265. data/rspec-core/upstream/lib/rspec/core/flat_map.rb +6 -4
  266. data/rspec-core/upstream/lib/rspec/core/formatters/base_bisect_formatter.rb +45 -0
  267. data/rspec-core/upstream/lib/rspec/core/formatters/base_formatter.rb +7 -4
  268. data/rspec-core/upstream/lib/rspec/core/formatters/base_text_formatter.rb +15 -16
  269. data/rspec-core/upstream/lib/rspec/core/formatters/bisect_drb_formatter.rb +29 -0
  270. data/rspec-core/upstream/lib/rspec/core/formatters/bisect_progress_formatter.rb +157 -0
  271. data/rspec-core/upstream/lib/rspec/core/formatters/console_codes.rb +28 -16
  272. data/rspec-core/upstream/lib/rspec/core/formatters/deprecation_formatter.rb +14 -13
  273. data/rspec-core/upstream/lib/rspec/core/formatters/documentation_formatter.rb +47 -13
  274. data/rspec-core/upstream/lib/rspec/core/formatters/exception_presenter.rb +525 -0
  275. data/rspec-core/upstream/lib/rspec/core/formatters/failure_list_formatter.rb +23 -0
  276. data/rspec-core/upstream/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
  277. data/rspec-core/upstream/lib/rspec/core/formatters/helpers.rb +40 -9
  278. data/rspec-core/upstream/lib/rspec/core/formatters/html_formatter.rb +20 -16
  279. data/rspec-core/upstream/lib/rspec/core/formatters/html_printer.rb +27 -18
  280. data/rspec-core/upstream/lib/rspec/core/formatters/html_snippet_extractor.rb +120 -0
  281. data/rspec-core/upstream/lib/rspec/core/formatters/json_formatter.rb +15 -7
  282. data/rspec-core/upstream/lib/rspec/core/formatters/profile_formatter.rb +10 -7
  283. data/rspec-core/upstream/lib/rspec/core/formatters/progress_formatter.rb +1 -0
  284. data/rspec-core/upstream/lib/rspec/core/formatters/protocol.rb +62 -43
  285. data/rspec-core/upstream/lib/rspec/core/formatters/snippet_extractor.rb +115 -85
  286. data/rspec-core/upstream/lib/rspec/core/formatters/syntax_highlighter.rb +91 -0
  287. data/rspec-core/upstream/lib/rspec/core/formatters.rb +71 -32
  288. data/rspec-core/upstream/lib/rspec/core/hooks.rb +303 -248
  289. data/rspec-core/upstream/lib/rspec/core/invocations.rb +87 -0
  290. data/rspec-core/upstream/lib/rspec/core/memoized_helpers.rb +155 -47
  291. data/rspec-core/upstream/lib/rspec/core/metadata.rb +102 -41
  292. data/rspec-core/upstream/lib/rspec/core/metadata_filter.rb +209 -49
  293. data/rspec-core/upstream/lib/rspec/core/minitest_assertions_adapter.rb +5 -2
  294. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
  295. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/mocha.rb +8 -8
  296. data/rspec-core/upstream/lib/rspec/core/notifications.rb +180 -201
  297. data/rspec-core/upstream/lib/rspec/core/option_parser.rb +159 -58
  298. data/rspec-core/upstream/lib/rspec/core/ordering.rb +40 -26
  299. data/rspec-core/upstream/lib/rspec/core/output_wrapper.rb +29 -0
  300. data/rspec-core/upstream/lib/rspec/core/pending.rb +19 -25
  301. data/rspec-core/upstream/lib/rspec/core/profiler.rb +34 -0
  302. data/rspec-core/upstream/lib/rspec/core/project_initializer/.rspec +0 -1
  303. data/rspec-core/upstream/lib/rspec/core/project_initializer/spec/spec_helper.rb +31 -22
  304. data/rspec-core/upstream/lib/rspec/core/project_initializer.rb +1 -1
  305. data/rspec-core/upstream/lib/rspec/core/rake_task.rb +73 -72
  306. data/rspec-core/upstream/lib/rspec/core/reporter.rb +134 -18
  307. data/rspec-core/upstream/lib/rspec/core/ruby_project.rb +13 -5
  308. data/rspec-core/upstream/lib/rspec/core/runner.rb +99 -45
  309. data/rspec-core/upstream/lib/rspec/core/sandbox.rb +37 -0
  310. data/rspec-core/upstream/lib/rspec/core/set.rb +54 -0
  311. data/rspec-core/upstream/lib/rspec/core/shared_example_group.rb +126 -37
  312. data/rspec-core/upstream/lib/rspec/core/shell_escape.rb +49 -0
  313. data/rspec-core/upstream/lib/rspec/core/test_unit_assertions_adapter.rb +3 -3
  314. data/rspec-core/upstream/lib/rspec/core/version.rb +1 -1
  315. data/rspec-core/upstream/lib/rspec/core/warnings.rb +2 -2
  316. data/rspec-core/upstream/lib/rspec/core/world.rb +164 -60
  317. data/rspec-core/upstream/lib/rspec/core.rb +64 -21
  318. data/rspec-core/upstream/maintenance-branch +1 -1
  319. data/rspec-core/upstream/rspec-core.gemspec +16 -11
  320. data/rspec-core/upstream/script/ci_functions.sh +73 -0
  321. data/rspec-core/upstream/script/clone_all_rspec_repos +2 -2
  322. data/rspec-core/upstream/script/cucumber.sh +8 -0
  323. data/rspec-core/upstream/script/custom_build_functions.sh +22 -0
  324. data/rspec-core/upstream/script/functions.sh +125 -89
  325. data/rspec-core/upstream/script/legacy_setup.sh +20 -0
  326. data/rspec-core/upstream/script/predicate_functions.sh +162 -0
  327. data/rspec-core/upstream/script/rspec_with_simplecov +6 -6
  328. data/rspec-core/upstream/script/run_build +14 -9
  329. data/rspec-core/upstream/script/run_rubocop +14 -0
  330. data/rspec-core/upstream/script/update_rubygems_and_install_bundler +20 -0
  331. data/rspec-expectations/upstream/.document +1 -1
  332. data/rspec-expectations/upstream/.github/FUNDING.yml +5 -0
  333. data/rspec-expectations/upstream/.github/workflows/ci.yml +150 -0
  334. data/rspec-expectations/upstream/.gitignore +2 -0
  335. data/rspec-expectations/upstream/.rubocop.yml +126 -2
  336. data/rspec-expectations/upstream/.rubocop_rspec_base.yml +224 -38
  337. data/rspec-expectations/upstream/.rubocop_todo.yml +335 -0
  338. data/rspec-expectations/upstream/.yardopts +1 -1
  339. data/rspec-expectations/upstream/BUILD_DETAIL.md +149 -0
  340. data/rspec-expectations/upstream/CODE_OF_CONDUCT.md +59 -0
  341. data/rspec-expectations/upstream/CONTRIBUTING.md +86 -0
  342. data/rspec-expectations/upstream/Changelog.md +454 -4
  343. data/rspec-expectations/upstream/DEV-README.md +3 -3
  344. data/rspec-expectations/upstream/DEVELOPMENT.md +131 -0
  345. data/rspec-expectations/upstream/Gemfile +77 -9
  346. data/rspec-expectations/upstream/ISSUE_TEMPLATE.md +24 -0
  347. data/{rspec-mocks/upstream/License.txt → rspec-expectations/upstream/LICENSE.md} +5 -4
  348. data/rspec-expectations/upstream/README.md +73 -31
  349. data/rspec-expectations/upstream/REPORT_TEMPLATE.md +43 -0
  350. data/rspec-expectations/upstream/Rakefile +13 -10
  351. data/rspec-expectations/upstream/Should.md +13 -5
  352. data/rspec-expectations/upstream/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +1 -2
  353. data/rspec-expectations/upstream/benchmarks/caller_vs_raise_for_backtrace.rb +77 -0
  354. data/rspec-expectations/upstream/benchmarks/count_vs_select_size.rb +68 -0
  355. data/rspec-expectations/upstream/benchmarks/default_messages_as_methods_v_blocks.rb +1 -1
  356. data/rspec-expectations/upstream/benchmarks/gsub_vs_tr_single_character.rb +28 -0
  357. data/rspec-expectations/upstream/benchmarks/include_matcher.rb +249 -0
  358. data/rspec-expectations/upstream/benchmarks/include_v_superclass.rb +0 -1
  359. data/rspec-expectations/upstream/benchmarks/match_array/failing_with_duplicate_items.rb +1 -1
  360. data/rspec-expectations/upstream/benchmarks/output_stringio_vs_tempfile.rb +31 -0
  361. data/rspec-expectations/upstream/benchmarks/set_vs_array_include.rb +1 -3
  362. data/rspec-expectations/upstream/cucumber.yml +9 -4
  363. data/rspec-expectations/upstream/features/.nav +1 -0
  364. data/rspec-expectations/upstream/features/aggregating_failures.feature +56 -0
  365. data/rspec-expectations/upstream/features/built_in_matchers/README.md +3 -3
  366. data/rspec-expectations/upstream/features/built_in_matchers/all.feature +3 -2
  367. data/rspec-expectations/upstream/features/built_in_matchers/be_within.feature +1 -1
  368. data/rspec-expectations/upstream/features/built_in_matchers/change.feature +8 -6
  369. data/rspec-expectations/upstream/features/built_in_matchers/comparisons.feature +33 -1
  370. data/rspec-expectations/upstream/features/built_in_matchers/contain_exactly.feature +1 -0
  371. data/rspec-expectations/upstream/features/built_in_matchers/cover.feature +3 -3
  372. data/rspec-expectations/upstream/features/built_in_matchers/exist.feature +1 -1
  373. data/rspec-expectations/upstream/features/built_in_matchers/have_attributes.feature +1 -2
  374. data/rspec-expectations/upstream/features/built_in_matchers/include.feature +74 -17
  375. data/rspec-expectations/upstream/features/built_in_matchers/match.feature +2 -2
  376. data/rspec-expectations/upstream/features/built_in_matchers/output.feature +67 -4
  377. data/rspec-expectations/upstream/features/built_in_matchers/predicates.feature +56 -19
  378. data/rspec-expectations/upstream/features/built_in_matchers/raise_error.feature +16 -2
  379. data/rspec-expectations/upstream/features/built_in_matchers/respond_to.feature +191 -3
  380. data/rspec-expectations/upstream/features/built_in_matchers/satisfy.feature +17 -8
  381. data/rspec-expectations/upstream/features/built_in_matchers/throw_symbol.feature +1 -1
  382. data/rspec-expectations/upstream/features/built_in_matchers/types.feature +34 -34
  383. data/rspec-expectations/upstream/features/built_in_matchers/yield.feature +2 -2
  384. data/rspec-expectations/upstream/features/composing_matchers.feature +4 -4
  385. data/rspec-expectations/upstream/features/custom_matchers/define_block_matcher.feature +78 -0
  386. data/rspec-expectations/upstream/features/custom_matchers/define_diffable_matcher.feature +115 -3
  387. data/rspec-expectations/upstream/features/custom_matchers/define_matcher.feature +173 -21
  388. data/rspec-expectations/upstream/features/custom_matchers/define_matcher_with_fluent_interface.feature +21 -2
  389. data/rspec-expectations/upstream/features/define_negated_matcher.feature +2 -1
  390. data/rspec-expectations/upstream/features/diffing.feature +29 -1
  391. data/rspec-expectations/upstream/features/implicit_docstrings.feature +8 -8
  392. data/rspec-expectations/upstream/features/step_definitions/additional_cli_steps.rb +11 -7
  393. data/rspec-expectations/upstream/features/support/diff_lcs_versions.rb +25 -0
  394. data/rspec-expectations/upstream/features/support/disallow_certain_apis.rb +3 -3
  395. data/rspec-expectations/upstream/features/support/env.rb +11 -11
  396. data/rspec-expectations/upstream/features/support/rubinius.rb +1 -1
  397. data/rspec-expectations/upstream/features/support/ruby_features.rb +39 -0
  398. data/rspec-expectations/upstream/features/syntax_configuration.feature +9 -9
  399. data/rspec-expectations/upstream/features/test_frameworks/minitest.feature +69 -2
  400. data/rspec-expectations/upstream/lib/rspec/expectations/block_snippet_extractor.rb +253 -0
  401. data/rspec-expectations/upstream/lib/rspec/expectations/configuration.rb +84 -1
  402. data/rspec-expectations/upstream/lib/rspec/expectations/expectation_target.rb +82 -38
  403. data/rspec-expectations/upstream/lib/rspec/expectations/fail_with.rb +11 -6
  404. data/rspec-expectations/upstream/lib/rspec/expectations/failure_aggregator.rb +212 -0
  405. data/rspec-expectations/upstream/lib/rspec/expectations/handler.rb +27 -12
  406. data/rspec-expectations/upstream/lib/rspec/expectations/minitest_integration.rb +43 -2
  407. data/rspec-expectations/upstream/lib/rspec/expectations/syntax.rb +5 -5
  408. data/rspec-expectations/upstream/lib/rspec/expectations/version.rb +1 -1
  409. data/rspec-expectations/upstream/lib/rspec/expectations.rb +15 -1
  410. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/all.rb +1 -0
  411. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/base_matcher.rb +77 -11
  412. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be.rb +28 -114
  413. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_between.rb +1 -1
  414. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_instance_of.rb +5 -1
  415. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_kind_of.rb +5 -1
  416. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_within.rb +4 -4
  417. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/change.rb +168 -55
  418. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/compound.rb +61 -29
  419. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/contain_exactly.rb +73 -12
  420. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/count_expectation.rb +169 -0
  421. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eq.rb +3 -38
  422. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eql.rb +2 -2
  423. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/equal.rb +3 -3
  424. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/exist.rb +7 -3
  425. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/has.rb +90 -24
  426. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/have_attributes.rb +37 -7
  427. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/include.rb +124 -23
  428. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/match.rb +79 -2
  429. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/operators.rb +14 -5
  430. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/output.rb +56 -1
  431. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/raise_error.rb +126 -29
  432. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/respond_to.rb +118 -9
  433. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/satisfy.rb +28 -7
  434. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/{start_and_end_with.rb → start_or_end_with.rb} +20 -8
  435. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/throw_symbol.rb +11 -5
  436. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/yield.rb +110 -155
  437. data/rspec-expectations/upstream/lib/rspec/matchers/built_in.rb +4 -3
  438. data/rspec-expectations/upstream/lib/rspec/matchers/composable.rb +23 -35
  439. data/rspec-expectations/upstream/lib/rspec/matchers/dsl.rb +179 -26
  440. data/rspec-expectations/upstream/lib/rspec/matchers/english_phrasing.rb +58 -0
  441. data/rspec-expectations/upstream/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +82 -0
  442. data/rspec-expectations/upstream/lib/rspec/matchers/fail_matchers.rb +42 -0
  443. data/rspec-expectations/upstream/lib/rspec/matchers/generated_descriptions.rb +1 -2
  444. data/rspec-expectations/upstream/lib/rspec/matchers/matcher_delegator.rb +2 -0
  445. data/rspec-expectations/upstream/lib/rspec/matchers/matcher_protocol.rb +72 -66
  446. data/rspec-expectations/upstream/lib/rspec/matchers.rb +227 -150
  447. data/rspec-expectations/upstream/maintenance-branch +1 -1
  448. data/rspec-expectations/upstream/rspec-expectations.gemspec +13 -8
  449. data/rspec-expectations/upstream/script/ci_functions.sh +73 -0
  450. data/rspec-expectations/upstream/script/clone_all_rspec_repos +2 -2
  451. data/rspec-expectations/upstream/script/cucumber.sh +8 -0
  452. data/rspec-expectations/upstream/script/functions.sh +125 -89
  453. data/rspec-expectations/upstream/script/legacy_setup.sh +20 -0
  454. data/rspec-expectations/upstream/script/predicate_functions.sh +162 -0
  455. data/rspec-expectations/upstream/script/run_build +14 -9
  456. data/rspec-expectations/upstream/script/run_rubocop +14 -0
  457. data/rspec-expectations/upstream/script/update_rubygems_and_install_bundler +20 -0
  458. data/rspec-mocks/upstream/.document +1 -1
  459. data/rspec-mocks/upstream/.github/FUNDING.yml +5 -0
  460. data/rspec-mocks/upstream/.github/workflows/ci.yml +150 -0
  461. data/rspec-mocks/upstream/.gitignore +2 -0
  462. data/rspec-mocks/upstream/.rubocop.yml +28 -9
  463. data/rspec-mocks/upstream/.rubocop_rspec_base.yml +224 -38
  464. data/rspec-mocks/upstream/.rubocop_todo.yml +573 -0
  465. data/rspec-mocks/upstream/.yardopts +1 -1
  466. data/rspec-mocks/upstream/BUILD_DETAIL.md +149 -0
  467. data/rspec-mocks/upstream/CODE_OF_CONDUCT.md +59 -0
  468. data/rspec-mocks/upstream/CONTRIBUTING.md +86 -0
  469. data/rspec-mocks/upstream/Changelog.md +398 -3
  470. data/rspec-mocks/upstream/DEV-README.md +3 -3
  471. data/rspec-mocks/upstream/DEVELOPMENT.md +131 -0
  472. data/rspec-mocks/upstream/Gemfile +77 -10
  473. data/rspec-mocks/upstream/ISSUE_TEMPLATE.md +24 -0
  474. data/{rspec-expectations/upstream/License.txt → rspec-mocks/upstream/LICENSE.md} +5 -4
  475. data/rspec-mocks/upstream/README.md +83 -17
  476. data/rspec-mocks/upstream/REPORT_TEMPLATE.md +43 -0
  477. data/rspec-mocks/upstream/Rakefile +3 -3
  478. data/rspec-mocks/upstream/benchmarks/accessing_configuration_via_method_vs_cache.rb +52 -0
  479. data/rspec-mocks/upstream/benchmarks/allocations/1_object_1000_mocks.rb +76 -0
  480. data/rspec-mocks/upstream/benchmarks/allocations/helper.rb +17 -0
  481. data/rspec-mocks/upstream/benchmarks/each_value_v_values_each.rb +4 -5
  482. data/rspec-mocks/upstream/benchmarks/find_original_method_early.rb +1 -1
  483. data/rspec-mocks/upstream/benchmarks/method_defined_at_any_visibility.rb +3 -3
  484. data/rspec-mocks/upstream/benchmarks/thread_safety.rb +1 -1
  485. data/rspec-mocks/upstream/benchmarks/transfer_nested_constants.rb +1 -1
  486. data/rspec-mocks/upstream/cucumber.yml +8 -1
  487. data/rspec-mocks/upstream/features/.nav +2 -0
  488. data/rspec-mocks/upstream/features/basics/allowing_messages.feature +1 -1
  489. data/rspec-mocks/upstream/features/basics/expecting_messages.feature +40 -1
  490. data/rspec-mocks/upstream/features/basics/null_object_doubles.feature +1 -1
  491. data/rspec-mocks/upstream/features/basics/partial_test_doubles.feature +1 -1
  492. data/rspec-mocks/upstream/features/basics/scope.feature +5 -5
  493. data/rspec-mocks/upstream/features/basics/spies.feature +17 -30
  494. data/rspec-mocks/upstream/features/basics/test_doubles.feature +4 -4
  495. data/rspec-mocks/upstream/features/configuring_responses/README.md +2 -0
  496. data/rspec-mocks/upstream/features/configuring_responses/calling_the_original_implementation.feature +2 -2
  497. data/rspec-mocks/upstream/features/configuring_responses/mixed_responses.feature +25 -0
  498. data/rspec-mocks/upstream/features/configuring_responses/raising_an_error.feature +1 -0
  499. data/rspec-mocks/upstream/features/configuring_responses/wrapping_the_original_implementation.feature +3 -3
  500. data/rspec-mocks/upstream/features/configuring_responses/yielding.feature +2 -2
  501. data/rspec-mocks/upstream/features/mutating_constants/README.md +1 -1
  502. data/rspec-mocks/upstream/features/old_syntax/any_instance.feature +3 -3
  503. data/rspec-mocks/upstream/features/old_syntax/should_receive.feature +3 -1
  504. data/rspec-mocks/upstream/features/outside_rspec/any_test_framework.feature +116 -0
  505. data/rspec-mocks/upstream/features/outside_rspec/minitest.feature +202 -46
  506. data/rspec-mocks/upstream/features/outside_rspec/standalone.feature +5 -5
  507. data/rspec-mocks/upstream/features/setting_constraints/matching_arguments.feature +54 -27
  508. data/rspec-mocks/upstream/features/setting_constraints/message_order.feature +2 -2
  509. data/rspec-mocks/upstream/features/setting_constraints/receive_counts.feature +18 -0
  510. data/rspec-mocks/upstream/features/step_definitions/additional_cli_steps.rb +4 -4
  511. data/rspec-mocks/upstream/features/support/disallow_certain_apis.rb +3 -2
  512. data/rspec-mocks/upstream/features/support/env.rb +12 -12
  513. data/rspec-mocks/upstream/features/support/rubinius.rb +1 -1
  514. data/rspec-mocks/upstream/features/verifying_doubles/README.md +2 -2
  515. data/rspec-mocks/upstream/features/verifying_doubles/class_doubles.feature +1 -1
  516. data/rspec-mocks/upstream/features/verifying_doubles/dynamic_classes.feature +41 -5
  517. data/rspec-mocks/upstream/features/verifying_doubles/instance_doubles.feature +5 -3
  518. data/rspec-mocks/upstream/features/working_with_legacy_code/any_instance.feature +8 -6
  519. data/rspec-mocks/upstream/features/working_with_legacy_code/message_chains.feature +16 -1
  520. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/chain.rb +3 -1
  521. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
  522. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expect_chain_chain.rb +1 -5
  523. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expectation_chain.rb +7 -5
  524. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/message_chains.rb +1 -3
  525. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/recorder.rb +42 -14
  526. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain.rb +13 -7
  527. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain_chain.rb +1 -5
  528. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance.rb +1 -0
  529. data/rspec-mocks/upstream/lib/rspec/mocks/argument_list_matcher.rb +53 -10
  530. data/rspec-mocks/upstream/lib/rspec/mocks/argument_matchers.rb +66 -26
  531. data/rspec-mocks/upstream/lib/rspec/mocks/configuration.rb +59 -4
  532. data/rspec-mocks/upstream/lib/rspec/mocks/error_generator.rb +235 -108
  533. data/rspec-mocks/upstream/lib/rspec/mocks/example_methods.rb +82 -27
  534. data/rspec-mocks/upstream/lib/rspec/mocks/instance_method_stasher.rb +12 -1
  535. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/have_received.rb +30 -17
  536. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive.rb +28 -1
  537. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_message_chain.rb +17 -1
  538. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_messages.rb +6 -0
  539. data/rspec-mocks/upstream/lib/rspec/mocks/message_chain.rb +0 -4
  540. data/rspec-mocks/upstream/lib/rspec/mocks/message_expectation.rb +430 -304
  541. data/rspec-mocks/upstream/lib/rspec/mocks/method_double.rb +46 -15
  542. data/rspec-mocks/upstream/lib/rspec/mocks/method_reference.rb +78 -19
  543. data/rspec-mocks/upstream/lib/rspec/mocks/minitest_integration.rb +68 -0
  544. data/rspec-mocks/upstream/lib/rspec/mocks/mutate_const.rb +23 -8
  545. data/rspec-mocks/upstream/lib/rspec/mocks/object_reference.rb +81 -23
  546. data/rspec-mocks/upstream/lib/rspec/mocks/proxy.rb +135 -41
  547. data/rspec-mocks/upstream/lib/rspec/mocks/space.rb +33 -16
  548. data/rspec-mocks/upstream/lib/rspec/mocks/standalone.rb +1 -1
  549. data/rspec-mocks/upstream/lib/rspec/mocks/syntax.rb +18 -22
  550. data/rspec-mocks/upstream/lib/rspec/mocks/targets.rb +51 -24
  551. data/rspec-mocks/upstream/lib/rspec/mocks/test_double.rb +42 -6
  552. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_double.rb +15 -21
  553. data/rspec-mocks/upstream/lib/rspec/mocks/{verifying_message_expecation.rb → verifying_message_expectation.rb} +11 -18
  554. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_proxy.rb +60 -11
  555. data/rspec-mocks/upstream/lib/rspec/mocks/version.rb +1 -1
  556. data/rspec-mocks/upstream/lib/rspec/mocks.rb +8 -1
  557. data/rspec-mocks/upstream/maintenance-branch +1 -1
  558. data/rspec-mocks/upstream/rspec-mocks.gemspec +14 -6
  559. data/rspec-mocks/upstream/script/ci_functions.sh +73 -0
  560. data/rspec-mocks/upstream/script/clone_all_rspec_repos +2 -2
  561. data/rspec-mocks/upstream/script/cucumber.sh +8 -0
  562. data/rspec-mocks/upstream/script/functions.sh +125 -89
  563. data/rspec-mocks/upstream/script/legacy_setup.sh +20 -0
  564. data/rspec-mocks/upstream/script/predicate_functions.sh +162 -0
  565. data/rspec-mocks/upstream/script/run_build +14 -9
  566. data/rspec-mocks/upstream/script/run_rubocop +14 -0
  567. data/rspec-mocks/upstream/script/update_rubygems_and_install_bundler +20 -0
  568. data/{stubs/diff/lcs/assertions.rb → rspec-mocks/upstream/tmp/.gitkeep} +0 -0
  569. data/rspec-support/upstream/.github/FUNDING.yml +5 -0
  570. data/rspec-support/upstream/.github/workflows/ci.yml +150 -0
  571. data/rspec-support/upstream/.gitignore +4 -0
  572. data/rspec-support/upstream/.rubocop.yml +33 -1
  573. data/rspec-support/upstream/.rubocop_rspec_base.yml +224 -38
  574. data/rspec-support/upstream/.rubocop_todo.yml +424 -0
  575. data/rspec-support/upstream/BUILD_DETAIL.md +149 -0
  576. data/rspec-support/upstream/CODE_OF_CONDUCT.md +59 -0
  577. data/rspec-support/upstream/CONTRIBUTING.md +86 -0
  578. data/rspec-support/upstream/Changelog.md +287 -0
  579. data/rspec-support/upstream/DEVELOPMENT.md +131 -0
  580. data/rspec-support/upstream/Gemfile +52 -4
  581. data/rspec-support/upstream/ISSUE_TEMPLATE.md +24 -0
  582. data/rspec-support/upstream/{LICENSE.txt → LICENSE.md} +3 -2
  583. data/rspec-support/upstream/README.md +29 -6
  584. data/rspec-support/upstream/REPORT_TEMPLATE.md +43 -0
  585. data/rspec-support/upstream/Rakefile +9 -5
  586. data/rspec-support/upstream/benchmarks/caller_vs_caller_locations.rb +19 -0
  587. data/rspec-support/upstream/benchmarks/caller_vs_caller_locations_vs_raise.rb +153 -0
  588. data/rspec-support/upstream/benchmarks/class_exec_vs_klass_exec.rb +43 -0
  589. data/rspec-support/upstream/benchmarks/map_hash.rb +70 -0
  590. data/rspec-support/upstream/benchmarks/ripper.rb +44 -0
  591. data/rspec-support/upstream/benchmarks/skip_frames_for_caller_filter.rb +27 -0
  592. data/rspec-support/upstream/lib/rspec/support/caller_filter.rb +35 -15
  593. data/rspec-support/upstream/lib/rspec/support/comparable_version.rb +46 -0
  594. data/rspec-support/upstream/lib/rspec/support/differ.rb +35 -34
  595. data/rspec-support/upstream/lib/rspec/support/directory_maker.rb +3 -1
  596. data/rspec-support/upstream/lib/rspec/support/encoded_string.rb +103 -11
  597. data/rspec-support/upstream/lib/rspec/support/fuzzy_matcher.rb +5 -5
  598. data/rspec-support/upstream/lib/rspec/support/matcher_definition.rb +11 -0
  599. data/rspec-support/upstream/lib/rspec/support/method_signature_verifier.rb +192 -26
  600. data/rspec-support/upstream/lib/rspec/support/mutex.rb +73 -0
  601. data/rspec-support/upstream/lib/rspec/support/object_formatter.rb +275 -0
  602. data/rspec-support/upstream/lib/rspec/support/recursive_const_methods.rb +1 -1
  603. data/rspec-support/upstream/lib/rspec/support/reentrant_mutex.rb +78 -0
  604. data/rspec-support/upstream/lib/rspec/support/ruby_features.rb +168 -15
  605. data/rspec-support/upstream/lib/rspec/support/source/location.rb +21 -0
  606. data/rspec-support/upstream/lib/rspec/support/source/node.rb +110 -0
  607. data/rspec-support/upstream/lib/rspec/support/source/token.rb +94 -0
  608. data/rspec-support/upstream/lib/rspec/support/source.rb +85 -0
  609. data/rspec-support/upstream/lib/rspec/support/spec/deprecation_helpers.rb +17 -29
  610. data/rspec-support/upstream/lib/rspec/support/spec/diff_helpers.rb +31 -0
  611. data/rspec-support/upstream/lib/rspec/support/spec/in_sub_process.rb +41 -17
  612. data/rspec-support/upstream/lib/rspec/support/spec/library_wide_checks.rb +150 -0
  613. data/rspec-support/upstream/lib/rspec/support/spec/shell_out.rb +39 -3
  614. data/rspec-support/upstream/lib/rspec/support/spec/stderr_splitter.rb +27 -4
  615. data/rspec-support/upstream/lib/rspec/support/spec/string_matcher.rb +45 -0
  616. data/rspec-support/upstream/lib/rspec/support/spec/with_isolated_directory.rb +5 -1
  617. data/rspec-support/upstream/lib/rspec/support/spec.rb +17 -7
  618. data/rspec-support/upstream/lib/rspec/support/version.rb +1 -1
  619. data/rspec-support/upstream/lib/rspec/support/warnings.rb +3 -3
  620. data/rspec-support/upstream/lib/rspec/support/with_keywords_when_needed.rb +33 -0
  621. data/rspec-support/upstream/lib/rspec/support.rb +81 -3
  622. data/rspec-support/upstream/maintenance-branch +1 -1
  623. data/rspec-support/upstream/rspec-support.gemspec +10 -4
  624. data/rspec-support/upstream/script/ci_functions.sh +73 -0
  625. data/rspec-support/upstream/script/clone_all_rspec_repos +2 -2
  626. data/rspec-support/upstream/script/cucumber.sh +8 -0
  627. data/rspec-support/upstream/script/functions.sh +125 -89
  628. data/rspec-support/upstream/script/legacy_setup.sh +20 -0
  629. data/rspec-support/upstream/script/predicate_functions.sh +162 -0
  630. data/rspec-support/upstream/script/run_build +14 -9
  631. data/rspec-support/upstream/script/run_rubocop +14 -0
  632. data/rspec-support/upstream/script/update_rubygems_and_install_bundler +20 -0
  633. data/stubs/{diff/lcs/block.rb → coderay.rb} +0 -0
  634. data/stubs/{diff/lcs/callbacks.rb → drb/acl.rb} +0 -0
  635. data/stubs/{diff/lcs/change.rb → erb/version.rb} +0 -0
  636. data/stubs/{diff/lcs/hunk.rb → open3.rb} +0 -0
  637. data/stubs/{diff/lcs/internals.rb → psych.rb} +0 -0
  638. data/stubs/{optparse.rb → ripper.rb} +0 -0
  639. data/stubs/{prettyprint.rb → thread_order.rb} +0 -0
  640. data/tasks/testing.rake +7 -3
  641. metadata +272 -63
  642. data/gemfiles/.bundle/config +0 -2
  643. data/gemfiles/opal_0.11.gemfile +0 -14
  644. data/gemfiles/opal_master.gemfile +0 -14
  645. data/lib-opal/opal/rspec/async/core_ext.rb +0 -23
  646. data/lib-opal/opal/rspec/async/legacy.rb +0 -49
  647. data/lib-opal/opal/rspec/fixes/rspec/caller_filter.rb +0 -6
  648. data/lib-opal/opal/rspec/fixes/rspec/core/example.rb +0 -20
  649. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +0 -20
  650. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +0 -11
  651. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +0 -15
  652. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +0 -15
  653. data/lib-opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +0 -20
  654. data/lib-opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +0 -21
  655. data/lib-opal/opal/rspec/fixes/rspec/core/warnings.rb +0 -27
  656. data/lib-opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +0 -21
  657. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +0 -10
  658. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +0 -15
  659. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +0 -21
  660. data/lib-opal/opal/rspec/fixes/rspec/matchers/pretty.rb +0 -15
  661. data/lib-opal/opal/rspec/fixes/rspec/mocks/space.rb +0 -41
  662. data/lib-opal/opal/rspec/fixes/rspec/mocks/test_double.rb +0 -39
  663. data/lib-opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +0 -29
  664. data/lib-opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +0 -7
  665. data/lib-opal/opal/rspec/fixes/rspec/support/spec/stderr_splitter.rb +0 -13
  666. data/lib-opal/opal/rspec/fixes/rspec/support/spec.rb +0 -1
  667. data/lib-opal/opal/rspec/fixes/rspec/support/warnings.rb +0 -16
  668. data/rspec/upstream/License.txt +0 -24
  669. data/rspec-core/upstream/.travis.yml +0 -35
  670. data/rspec-core/upstream/benchmarks/sort_by_v_shuffle.rb +0 -83
  671. data/rspec-core/upstream/features/Upgrade.md +0 -352
  672. data/rspec-core/upstream/lib/rspec/core/backport_random.rb +0 -336
  673. data/rspec-expectations/upstream/.travis.yml +0 -35
  674. data/rspec-expectations/upstream/lib/rspec/matchers/pretty.rb +0 -77
  675. data/rspec-mocks/upstream/.travis.yml +0 -35
  676. data/rspec-support/upstream/.travis.yml +0 -35
  677. data/rspec-support/upstream/lib/rspec/support/os.rb +0 -18
  678. data/rspec-support/upstream/lib/rspec/support/spec/prevent_load_time_warnings.rb +0 -44
  679. data/rspec-support/upstream/lib/rspec/support/version_checker.rb +0 -53
  680. data/stubs/shellwords.rb +0 -0
  681. data/stubs/uri.rb +0 -0
  682. data/vendor/spec_runner.js +0 -64
@@ -1,8 +1,10 @@
1
+ RSpec::Support.require_rspec_support 'mutex'
2
+
1
3
  module RSpec
2
4
  module Mocks
3
5
  # A message expectation that only allows concrete return values to be set
4
6
  # for a message. While this same effect can be achieved using a standard
5
- # MessageExpecation, this version is much faster and so can be used as an
7
+ # MessageExpectation, this version is much faster and so can be used as an
6
8
  # optimization.
7
9
  #
8
10
  # @private
@@ -26,55 +28,21 @@ module RSpec
26
28
  end
27
29
 
28
30
  def verify_messages_received
29
- InsertOntoBacktrace.line(@backtrace_line) do
30
- unless @received
31
- @error_generator.raise_expectation_error(@message, 1, ArgumentListMatcher::MATCH_ALL, 0, nil)
32
- end
33
- end
31
+ return if @received
32
+ @error_generator.raise_expectation_error(
33
+ @message, 1, ArgumentListMatcher::MATCH_ALL, 0, nil, [], @backtrace_line
34
+ )
35
+ end
36
+
37
+ def unadvise(_)
34
38
  end
35
39
  end
36
40
 
37
- # @private
41
+ # Represents an individual method stub or message expectation. The methods
42
+ # defined here can be used to configure how it behaves. The methods return
43
+ # `self` so that they can be chained together to form a fluent interface.
38
44
  class MessageExpectation
39
- # @private
40
- attr_accessor :error_generator, :implementation
41
- attr_reader :message
42
- attr_reader :orig_object
43
- attr_writer :expected_received_count, :expected_from, :argument_list_matcher
44
- protected :expected_received_count=, :expected_from=, :error_generator, :error_generator=, :implementation=
45
-
46
- # rubocop:disable Style/ParameterLists
47
- # @private
48
- def initialize(error_generator, expectation_ordering, expected_from, method_double,
49
- type=:expectation, opts={}, &implementation_block)
50
- @error_generator = error_generator
51
- @error_generator.opts = opts
52
- @expected_from = expected_from
53
- @method_double = method_double
54
- @orig_object = @method_double.object
55
- @message = @method_double.method_name
56
- @actual_received_count = 0
57
- @expected_received_count = type == :expectation ? 1 : :any
58
- @argument_list_matcher = ArgumentListMatcher::MATCH_ALL
59
- @order_group = expectation_ordering
60
- @order_group.register(self) unless type == :stub
61
- @expectation_type = type
62
- @ordered = false
63
- @at_least = @at_most = @exactly = nil
64
- @args_to_yield = []
65
- @failed_fast = nil
66
- @eval_context = nil
67
- @yield_receiver_to_implementation_block = false
68
-
69
- @implementation = Implementation.new
70
- self.inner_implementation_action = implementation_block
71
- end
72
- # rubocop:enable Style/ParameterLists
73
-
74
- # @private
75
- def expected_args
76
- @argument_list_matcher.expected_args
77
- end
45
+ # @!group Configuring Responses
78
46
 
79
47
  # @overload and_return(value)
80
48
  # @overload and_return(first_value, second_value)
@@ -85,10 +53,10 @@ module RSpec
85
53
  # etc.
86
54
  #
87
55
  # If the message is received more times than there are values, the last
88
- # value is received for every subsequent call.
56
+ # value is returned for every subsequent call.
89
57
  #
58
+ # @return [nil] No further chaining is supported after this.
90
59
  # @example
91
- #
92
60
  # allow(counter).to receive(:count).and_return(1)
93
61
  # counter.count # => 1
94
62
  # counter.count # => 1
@@ -101,6 +69,7 @@ module RSpec
101
69
  # counter.count # => 3
102
70
  # # etc
103
71
  def and_return(first_value, *values)
72
+ raise_already_invoked_error_if_necessary(__method__)
104
73
  if negative?
105
74
  raise "`and_return` is not supported with negative message expectations"
106
75
  end
@@ -116,13 +85,46 @@ module RSpec
116
85
  nil
117
86
  end
118
87
 
119
- def and_yield_receiver_to_implementation
120
- @yield_receiver_to_implementation_block = true
121
- self
122
- end
88
+ # Tells the object to invoke a Proc when it receives the message. Given
89
+ # more than one value, the result of the first Proc is returned the first
90
+ # time the message is received, the result of the second Proc is returned
91
+ # the next time, etc, etc.
92
+ #
93
+ # If the message is received more times than there are Procs, the result of
94
+ # the last Proc is returned for every subsequent call.
95
+ #
96
+ # @return [nil] No further chaining is supported after this.
97
+ # @example
98
+ # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout })
99
+ # api.get_foo # => raises ApiTimeout
100
+ # api.get_foo # => raises ApiTimeout
101
+ #
102
+ # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }, -> { raise ApiTimeout }, -> { :a_foo })
103
+ # api.get_foo # => raises ApiTimeout
104
+ # api.get_foo # => rasies ApiTimeout
105
+ # api.get_foo # => :a_foo
106
+ # api.get_foo # => :a_foo
107
+ # api.get_foo # => :a_foo
108
+ # # etc
109
+ def and_invoke(first_proc, *procs)
110
+ raise_already_invoked_error_if_necessary(__method__)
111
+ if negative?
112
+ raise "`and_invoke` is not supported with negative message expectations"
113
+ end
114
+
115
+ if block_given?
116
+ raise ArgumentError, "Implementation blocks aren't supported with `and_invoke`"
117
+ end
118
+
119
+ procs.unshift(first_proc)
120
+ if procs.any? { |p| !p.respond_to?(:call) }
121
+ raise ArgumentError, "Arguments to `and_invoke` must be callable."
122
+ end
123
+
124
+ @expected_received_count = [@expected_received_count, procs.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least)
125
+ self.terminal_implementation_action = AndInvokeImplementation.new(procs)
123
126
 
124
- def yield_receiver_to_implementation_block?
125
- @yield_receiver_to_implementation_block
127
+ nil
126
128
  end
127
129
 
128
130
  # Tells the object to delegate to the original unmodified method
@@ -130,16 +132,19 @@ module RSpec
130
132
  #
131
133
  # @note This is only available on partial doubles.
132
134
  #
135
+ # @return [nil] No further chaining is supported after this.
133
136
  # @example
134
- #
135
137
  # expect(counter).to receive(:increment).and_call_original
136
138
  # original_count = counter.count
137
139
  # counter.increment
138
140
  # expect(counter.count).to eq(original_count + 1)
139
141
  def and_call_original
140
- and_wrap_original do |original, *args, &block|
141
- original.call(*args, &block)
142
+ block = lambda do |original, *args, &b|
143
+ original.call(*args, &b)
142
144
  end
145
+ block = block.ruby2_keywords if block.respond_to?(:ruby2_keywords)
146
+
147
+ wrap_original(__method__, &block)
143
148
  end
144
149
 
145
150
  # Decorates the stubbed method with the supplied block. The original
@@ -149,20 +154,13 @@ module RSpec
149
154
  #
150
155
  # @note This is only available on partial doubles.
151
156
  #
157
+ # @return [nil] No further chaining is supported after this.
152
158
  # @example
153
- #
154
159
  # expect(api).to receive(:large_list).and_wrap_original do |original_method, *args, &block|
155
160
  # original_method.call(*args, &block).first(10)
156
161
  # end
157
- #
158
162
  def and_wrap_original(&block)
159
- if RSpec::Mocks::TestDouble === @method_double.object
160
- @error_generator.raise_only_valid_on_a_partial_double(:and_call_original)
161
- else
162
- warn_about_stub_override if implementation.inner_action
163
- @implementation = AndWrapOriginalImplementation.new(@method_double.original_method, block)
164
- @yield_receiver_to_implementation_block = false
165
- end
163
+ wrap_original(__method__, &block)
166
164
  end
167
165
 
168
166
  # @overload and_raise
@@ -172,8 +170,8 @@ module RSpec
172
170
  #
173
171
  # Tells the object to raise an exception when the message is received.
174
172
  #
173
+ # @return [nil] No further chaining is supported after this.
175
174
  # @note
176
- #
177
175
  # When you pass an exception class, the MessageExpectation will raise
178
176
  # an instance of it, creating it with `exception` and passing `message`
179
177
  # if specified. If the exception class initializer requires more than
@@ -181,17 +179,13 @@ module RSpec
181
179
  # otherwise this method will raise an ArgumentError exception.
182
180
  #
183
181
  # @example
184
- #
185
182
  # allow(car).to receive(:go).and_raise
186
183
  # allow(car).to receive(:go).and_raise(OutOfGas)
187
184
  # allow(car).to receive(:go).and_raise(OutOfGas, "At least 2 oz of gas needed to drive")
188
185
  # allow(car).to receive(:go).and_raise(OutOfGas.new(2, :oz))
189
- def and_raise(exception=RuntimeError, message=nil)
190
- if exception.respond_to?(:exception)
191
- exception = message ? exception.exception(message) : exception.exception
192
- end
193
-
194
- self.terminal_implementation_action = Proc.new { raise exception }
186
+ def and_raise(*args)
187
+ raise_already_invoked_error_if_necessary(__method__)
188
+ self.terminal_implementation_action = Proc.new { raise(*args) }
195
189
  nil
196
190
  end
197
191
 
@@ -201,11 +195,12 @@ module RSpec
201
195
  # Tells the object to throw a symbol (with the object if that form is
202
196
  # used) when the message is received.
203
197
  #
198
+ # @return [nil] No further chaining is supported after this.
204
199
  # @example
205
- #
206
200
  # allow(car).to receive(:go).and_throw(:out_of_gas)
207
201
  # allow(car).to receive(:go).and_throw(:out_of_gas, :level => 0.1)
208
202
  def and_throw(*args)
203
+ raise_already_invoked_error_if_necessary(__method__)
209
204
  self.terminal_implementation_action = Proc.new { throw(*args) }
210
205
  nil
211
206
  end
@@ -213,167 +208,33 @@ module RSpec
213
208
  # Tells the object to yield one or more args to a block when the message
214
209
  # is received.
215
210
  #
211
+ # @return [MessageExpectation] self, to support further chaining.
216
212
  # @example
217
- #
218
213
  # stream.stub(:open).and_yield(StringIO.new)
219
214
  def and_yield(*args, &block)
215
+ raise_already_invoked_error_if_necessary(__method__)
220
216
  yield @eval_context = Object.new if block
217
+
218
+ # Initialize args to yield now that it's being used, see also: comment
219
+ # in constructor.
220
+ @args_to_yield ||= []
221
+
221
222
  @args_to_yield << args
222
223
  self.initial_implementation_action = AndYieldImplementation.new(@args_to_yield, @eval_context, @error_generator)
223
224
  self
224
225
  end
226
+ # @!endgroup
225
227
 
226
- # @private
227
- def matches?(message, *args)
228
- @message == message && @argument_list_matcher.args_match?(*args)
229
- end
230
-
231
- # @private
232
- def safe_invoke(parent_stub, *args, &block)
233
- invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block)
234
- end
235
-
236
- # @private
237
- def invoke(parent_stub, *args, &block)
238
- invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block)
239
- end
240
-
241
- # @private
242
- def invoke_without_incrementing_received_count(parent_stub, *args, &block)
243
- invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block)
244
- end
245
-
246
- # @private
247
- def negative?
248
- @expected_received_count == 0 && !@at_least
249
- end
250
-
251
- # @private
252
- def called_max_times?
253
- @expected_received_count != :any &&
254
- !@at_least &&
255
- @expected_received_count > 0 &&
256
- @actual_received_count >= @expected_received_count
257
- end
258
-
259
- # @private
260
- def matches_name_but_not_args(message, *args)
261
- @message == message && !@argument_list_matcher.args_match?(*args)
262
- end
263
-
264
- # @private
265
- def verify_messages_received
266
- InsertOntoBacktrace.line(@expected_from) do
267
- generate_error unless expected_messages_received? || failed_fast?
268
- end
269
- end
270
-
271
- # @private
272
- def expected_messages_received?
273
- ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count?
274
- end
275
-
276
- def ensure_expected_ordering_received!
277
- @order_group.verify_invocation_order(self) if @ordered
278
- true
279
- end
280
-
281
- # @private
282
- def ignoring_args?
283
- @expected_received_count == :any
284
- end
285
-
286
- # @private
287
- def matches_at_least_count?
288
- @at_least && @actual_received_count >= @expected_received_count
289
- end
290
-
291
- # @private
292
- def matches_at_most_count?
293
- @at_most && @actual_received_count <= @expected_received_count
294
- end
295
-
296
- # @private
297
- def matches_exact_count?
298
- @expected_received_count == @actual_received_count
299
- end
300
-
301
- # @private
302
- def similar_messages
303
- @similar_messages ||= []
304
- end
305
-
306
- # @private
307
- def advise(*args)
308
- similar_messages << args
309
- end
310
-
311
- # @private
312
- def generate_error
313
- if similar_messages.empty?
314
- @error_generator.raise_expectation_error(@message, @expected_received_count, @argument_list_matcher, @actual_received_count, expectation_count_type, *expected_args)
315
- else
316
- @error_generator.raise_similar_message_args_error(self, *@similar_messages)
317
- end
318
- end
319
-
320
- def expectation_count_type
321
- return :at_least if @at_least
322
- return :at_most if @at_most
323
- nil
324
- end
325
-
326
- # @private
327
- def description
328
- @error_generator.describe_expectation(@message, @expected_received_count, @actual_received_count, *expected_args)
329
- end
330
-
331
- def raise_out_of_order_error
332
- @error_generator.raise_out_of_order_error @message
333
- end
334
-
335
- # Constrains a stub or message expectation to invocations with specific
336
- # arguments.
337
- #
338
- # With a stub, if the message might be received with other args as well,
339
- # you should stub a default value first, and then stub or mock the same
340
- # message using `with` to constrain to specific arguments.
341
- #
342
- # A message expectation will fail if the message is received with different
343
- # arguments.
344
- #
345
- # @example
346
- #
347
- # allow(cart).to receive(:add) { :failure }
348
- # allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
349
- # cart.add(Book.new(:isbn => 1234567890))
350
- # # => :failure
351
- # cart.add(Book.new(:isbn => 1934356379))
352
- # # => :success
353
- #
354
- # expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
355
- # cart.add(Book.new(:isbn => 1234567890))
356
- # # => failed expectation
357
- # cart.add(Book.new(:isbn => 1934356379))
358
- # # => passes
359
- def with(*args, &block)
360
- if args.empty?
361
- raise ArgumentError,
362
- "`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments."
363
- end
364
-
365
- self.inner_implementation_action = block
366
- @argument_list_matcher = ArgumentListMatcher.new(*args)
367
- self
368
- end
228
+ # @!group Constraining Receive Counts
369
229
 
370
230
  # Constrain a message expectation to be received a specific number of
371
231
  # times.
372
232
  #
233
+ # @return [MessageExpectation] self, to support further chaining.
373
234
  # @example
374
- #
375
235
  # expect(dealer).to receive(:deal_card).exactly(10).times
376
236
  def exactly(n, &block)
237
+ raise_already_invoked_error_if_necessary(__method__)
377
238
  self.inner_implementation_action = block
378
239
  set_expected_received_count :exactly, n
379
240
  self
@@ -382,10 +243,11 @@ module RSpec
382
243
  # Constrain a message expectation to be received at least a specific
383
244
  # number of times.
384
245
  #
246
+ # @return [MessageExpectation] self, to support further chaining.
385
247
  # @example
386
- #
387
248
  # expect(dealer).to receive(:deal_card).at_least(9).times
388
249
  def at_least(n, &block)
250
+ raise_already_invoked_error_if_necessary(__method__)
389
251
  set_expected_received_count :at_least, n
390
252
 
391
253
  if n == 0
@@ -400,10 +262,11 @@ module RSpec
400
262
  # Constrain a message expectation to be received at most a specific
401
263
  # number of times.
402
264
  #
265
+ # @return [MessageExpectation] self, to support further chaining.
403
266
  # @example
404
- #
405
267
  # expect(dealer).to receive(:deal_card).at_most(10).times
406
268
  def at_most(n, &block)
269
+ raise_already_invoked_error_if_necessary(__method__)
407
270
  self.inner_implementation_action = block
408
271
  set_expected_received_count :at_most, n
409
272
  self
@@ -411,8 +274,8 @@ module RSpec
411
274
 
412
275
  # Syntactic sugar for `exactly`, `at_least` and `at_most`
413
276
  #
277
+ # @return [MessageExpectation] self, to support further chaining.
414
278
  # @example
415
- #
416
279
  # expect(dealer).to receive(:deal_card).exactly(10).times
417
280
  # expect(dealer).to receive(:deal_card).at_least(10).times
418
281
  # expect(dealer).to receive(:deal_card).at_most(10).times
@@ -420,22 +283,23 @@ module RSpec
420
283
  self.inner_implementation_action = block
421
284
  self
422
285
  end
286
+ alias time times
423
287
 
424
288
  # Expect a message not to be received at all.
425
289
  #
290
+ # @return [MessageExpectation] self, to support further chaining.
426
291
  # @example
427
- #
428
292
  # expect(car).to receive(:stop).never
429
293
  def never
430
- ErrorGenerator.raise_double_negation_error("expect(obj)") if negative?
294
+ error_generator.raise_double_negation_error("expect(obj)") if negative?
431
295
  @expected_received_count = 0
432
296
  self
433
297
  end
434
298
 
435
299
  # Expect a message to be received exactly one time.
436
300
  #
301
+ # @return [MessageExpectation] self, to support further chaining.
437
302
  # @example
438
- #
439
303
  # expect(car).to receive(:go).once
440
304
  def once(&block)
441
305
  self.inner_implementation_action = block
@@ -445,8 +309,8 @@ module RSpec
445
309
 
446
310
  # Expect a message to be received exactly two times.
447
311
  #
312
+ # @return [MessageExpectation] self, to support further chaining.
448
313
  # @example
449
- #
450
314
  # expect(car).to receive(:go).twice
451
315
  def twice(&block)
452
316
  self.inner_implementation_action = block
@@ -456,23 +320,70 @@ module RSpec
456
320
 
457
321
  # Expect a message to be received exactly three times.
458
322
  #
323
+ # @return [MessageExpectation] self, to support further chaining.
459
324
  # @example
460
- #
461
325
  # expect(car).to receive(:go).thrice
462
326
  def thrice(&block)
463
327
  self.inner_implementation_action = block
464
328
  set_expected_received_count :exactly, 3
465
329
  self
466
330
  end
331
+ # @!endgroup
467
332
 
468
- # Expect messages to be received in a specific order.
333
+ # @!group Other Constraints
334
+
335
+ # Constrains a stub or message expectation to invocations with specific
336
+ # arguments.
469
337
  #
338
+ # With a stub, if the message might be received with other args as well,
339
+ # you should stub a default value first, and then stub or mock the same
340
+ # message using `with` to constrain to specific arguments.
341
+ #
342
+ # A message expectation will fail if the message is received with different
343
+ # arguments.
344
+ #
345
+ # @return [MessageExpectation] self, to support further chaining.
470
346
  # @example
347
+ # allow(cart).to receive(:add) { :failure }
348
+ # allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
349
+ # cart.add(Book.new(:isbn => 1234567890))
350
+ # # => :failure
351
+ # cart.add(Book.new(:isbn => 1934356379))
352
+ # # => :success
353
+ #
354
+ # expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
355
+ # cart.add(Book.new(:isbn => 1234567890))
356
+ # # => failed expectation
357
+ # cart.add(Book.new(:isbn => 1934356379))
358
+ # # => passes
359
+ def with(*args, &block)
360
+ raise_already_invoked_error_if_necessary(__method__)
361
+ if args.empty?
362
+ raise ArgumentError,
363
+ "`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments."
364
+ end
365
+
366
+ self.inner_implementation_action = block
367
+ @argument_list_matcher = ArgumentListMatcher.new(*args)
368
+ self
369
+ end
370
+ ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true)
371
+
372
+ # Expect messages to be received in a specific order.
471
373
  #
374
+ # @return [MessageExpectation] self, to support further chaining.
375
+ # @example
472
376
  # expect(api).to receive(:prepare).ordered
473
377
  # expect(api).to receive(:run).ordered
474
378
  # expect(api).to receive(:finish).ordered
475
379
  def ordered(&block)
380
+ if type == :stub
381
+ RSpec.warning(
382
+ "`allow(...).to receive(..).ordered` is not supported and will " \
383
+ "have no effect, use `and_return(*ordered_values)` instead."
384
+ )
385
+ end
386
+
476
387
  self.inner_implementation_action = block
477
388
  additional_expected_calls.times do
478
389
  @order_group.register(self)
@@ -481,94 +392,301 @@ module RSpec
481
392
  self
482
393
  end
483
394
 
484
- # @private
485
- def additional_expected_calls
486
- return 0 if @expectation_type == :stub || !@exactly
487
- @expected_received_count - 1
395
+ # @return [String] a nice representation of the message expectation
396
+ def to_s
397
+ args_description = error_generator.method_call_args_description(@argument_list_matcher.expected_args, "", "") { true }
398
+ args_description = "(#{args_description})" unless args_description.start_with?("(")
399
+ "#<#{self.class} #{error_generator.intro}.#{message}#{args_description}>"
488
400
  end
401
+ alias inspect to_s
489
402
 
490
403
  # @private
491
- def ordered?
492
- @ordered
493
- end
404
+ # Contains the parts of `MessageExpectation` that aren't part of
405
+ # rspec-mocks' public API. The class is very big and could really use
406
+ # some collaborators it delegates to for this stuff but for now this was
407
+ # the simplest way to split the public from private stuff to make it
408
+ # easier to publish the docs for the APIs we want published.
409
+ module ImplementationDetails
410
+ attr_accessor :error_generator, :implementation
411
+ attr_reader :message
412
+ attr_reader :orig_object
413
+ attr_writer :expected_received_count, :expected_from, :argument_list_matcher
414
+ protected :expected_received_count=, :expected_from=, :error_generator=, :implementation=
415
+
416
+ # @private
417
+ attr_reader :type
418
+
419
+ # rubocop:disable Metrics/ParameterLists
420
+ def initialize(error_generator, expectation_ordering, expected_from, method_double,
421
+ type=:expectation, opts={}, &implementation_block)
422
+ @type = type
423
+ @error_generator = error_generator
424
+ @error_generator.opts = error_generator.opts.merge(opts)
425
+ @expected_from = expected_from
426
+ @method_double = method_double
427
+ @orig_object = @method_double.object
428
+ @message = @method_double.method_name
429
+ @actual_received_count = 0
430
+ @actual_received_count_write_mutex = Support::Mutex.new
431
+ @expected_received_count = type == :expectation ? 1 : :any
432
+ @argument_list_matcher = ArgumentListMatcher::MATCH_ALL
433
+ @order_group = expectation_ordering
434
+ @order_group.register(self) unless type == :stub
435
+ @expectation_type = type
436
+ @ordered = false
437
+ @at_least = @at_most = @exactly = nil
438
+
439
+ # Initialized to nil so that we don't allocate an array for every
440
+ # mock or stub. See also comment in `and_yield`.
441
+ @args_to_yield = nil
442
+ @eval_context = nil
443
+ @yield_receiver_to_implementation_block = false
494
444
 
495
- # @private
496
- def negative_expectation_for?(message)
497
- @message == message && negative?
498
- end
445
+ @implementation = Implementation.new
446
+ self.inner_implementation_action = implementation_block
447
+ end
448
+ # rubocop:enable Metrics/ParameterLists
499
449
 
500
- # @private
501
- def actual_received_count_matters?
502
- @at_least || @at_most || @exactly
503
- end
450
+ def expected_args
451
+ @argument_list_matcher.expected_args
452
+ end
504
453
 
505
- # @private
506
- def increase_actual_received_count!
507
- @actual_received_count += 1
508
- end
454
+ def and_yield_receiver_to_implementation
455
+ @yield_receiver_to_implementation_block = true
456
+ self
457
+ end
509
458
 
510
- private
459
+ def yield_receiver_to_implementation_block?
460
+ @yield_receiver_to_implementation_block
461
+ end
511
462
 
512
- def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block)
513
- args.unshift(orig_object) if yield_receiver_to_implementation_block?
463
+ def matches?(message, *args)
464
+ @message == message && @argument_list_matcher.args_match?(*args)
465
+ end
466
+ ruby2_keywords :matches? if respond_to?(:ruby2_keywords, true)
514
467
 
515
- if negative? || (allowed_to_fail && (@exactly || @at_most) && (@actual_received_count == @expected_received_count))
516
- @actual_received_count += increment
517
- @failed_fast = true
518
- # args are the args we actually received, @argument_list_matcher is the
519
- # list of args we were expecting
520
- @error_generator.raise_expectation_error(@message, @expected_received_count, @argument_list_matcher, @actual_received_count, expectation_count_type, *args)
468
+ def safe_invoke(parent_stub, *args, &block)
469
+ invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block)
521
470
  end
471
+ ruby2_keywords :safe_invoke if respond_to?(:ruby2_keywords, true)
522
472
 
523
- @order_group.handle_order_constraint self
473
+ def invoke(parent_stub, *args, &block)
474
+ invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block)
475
+ end
476
+ ruby2_keywords :invoke if respond_to?(:ruby2_keywords, true)
477
+
478
+ def invoke_without_incrementing_received_count(parent_stub, *args, &block)
479
+ invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block)
480
+ end
481
+ ruby2_keywords :invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true)
482
+
483
+ def negative?
484
+ @expected_received_count == 0 && !@at_least
485
+ end
486
+
487
+ def called_max_times?
488
+ @expected_received_count != :any &&
489
+ !@at_least &&
490
+ @expected_received_count > 0 &&
491
+ @actual_received_count >= @expected_received_count
492
+ end
493
+
494
+ def matches_name_but_not_args(message, *args)
495
+ @message == message && !@argument_list_matcher.args_match?(*args)
496
+ end
497
+
498
+ def verify_messages_received
499
+ return if expected_messages_received?
500
+ generate_error
501
+ end
502
+
503
+ def expected_messages_received?
504
+ ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count?
505
+ end
506
+
507
+ def ensure_expected_ordering_received!
508
+ @order_group.verify_invocation_order(self) if @ordered
509
+ true
510
+ end
511
+
512
+ def ignoring_args?
513
+ @expected_received_count == :any
514
+ end
515
+
516
+ def matches_at_least_count?
517
+ @at_least && @actual_received_count >= @expected_received_count
518
+ end
519
+
520
+ def matches_at_most_count?
521
+ @at_most && @actual_received_count <= @expected_received_count
522
+ end
523
+
524
+ def matches_exact_count?
525
+ @expected_received_count == @actual_received_count
526
+ end
527
+
528
+ def similar_messages
529
+ @similar_messages ||= []
530
+ end
531
+
532
+ def advise(*args)
533
+ similar_messages << args
534
+ end
535
+
536
+ def unadvise(args)
537
+ similar_messages.delete_if { |message| args.include?(message) }
538
+ end
539
+
540
+ def generate_error
541
+ if similar_messages.empty?
542
+ @error_generator.raise_expectation_error(
543
+ @message, @expected_received_count, @argument_list_matcher,
544
+ @actual_received_count, expectation_count_type, expected_args,
545
+ @expected_from, exception_source_id
546
+ )
547
+ else
548
+ @error_generator.raise_similar_message_args_error(
549
+ self, @similar_messages, @expected_from
550
+ )
551
+ end
552
+ end
553
+
554
+ def raise_unexpected_message_args_error(args_for_multiple_calls)
555
+ @error_generator.raise_unexpected_message_args_error(self, args_for_multiple_calls, exception_source_id)
556
+ end
557
+
558
+ def expectation_count_type
559
+ return :at_least if @at_least
560
+ return :at_most if @at_most
561
+ nil
562
+ end
563
+
564
+ def description_for(verb)
565
+ @error_generator.describe_expectation(
566
+ verb, @message, @expected_received_count,
567
+ @actual_received_count, expected_args
568
+ )
569
+ end
570
+
571
+ def raise_out_of_order_error
572
+ @error_generator.raise_out_of_order_error @message
573
+ end
574
+
575
+ def additional_expected_calls
576
+ return 0 if @expectation_type == :stub || !@exactly
577
+ @expected_received_count - 1
578
+ end
579
+
580
+ def ordered?
581
+ @ordered
582
+ end
583
+
584
+ def negative_expectation_for?(message)
585
+ @message == message && negative?
586
+ end
587
+
588
+ def actual_received_count_matters?
589
+ @at_least || @at_most || @exactly
590
+ end
591
+
592
+ def increase_actual_received_count!
593
+ @actual_received_count_write_mutex.synchronize do
594
+ @actual_received_count += 1
595
+ end
596
+ end
597
+
598
+ private
599
+
600
+ def exception_source_id
601
+ @exception_source_id ||= "#{self.class.name} #{__id__}"
602
+ end
603
+
604
+ def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block)
605
+ args.unshift(orig_object) if yield_receiver_to_implementation_block?
606
+
607
+ if negative? || (allowed_to_fail && (@exactly || @at_most) && (@actual_received_count == @expected_received_count))
608
+ # args are the args we actually received, @argument_list_matcher is the
609
+ # list of args we were expecting
610
+ @error_generator.raise_expectation_error(
611
+ @message, @expected_received_count,
612
+ @argument_list_matcher,
613
+ @actual_received_count + increment,
614
+ expectation_count_type, args, nil, exception_source_id
615
+ )
616
+ end
617
+
618
+ @order_group.handle_order_constraint self
524
619
 
525
- begin
526
620
  if implementation.present?
527
621
  implementation.call(*args, &block)
528
622
  elsif parent_stub
529
623
  parent_stub.invoke(nil, *args, &block)
530
624
  end
531
625
  ensure
532
- @actual_received_count += increment
626
+ @actual_received_count_write_mutex.synchronize do
627
+ @actual_received_count += increment
628
+ end
533
629
  end
534
- end
630
+ ruby2_keywords :invoke_incrementing_actual_calls_by if respond_to?(:ruby2_keywords, true)
535
631
 
536
- def failed_fast?
537
- @failed_fast
538
- end
632
+ def has_been_invoked?
633
+ @actual_received_count > 0
634
+ end
539
635
 
540
- def set_expected_received_count(relativity, n)
541
- @at_least = (relativity == :at_least)
542
- @at_most = (relativity == :at_most)
543
- @exactly = (relativity == :exactly)
544
- @expected_received_count = case n
545
- when Numeric then n
546
- when :once then 1
547
- when :twice then 2
548
- when :thrice then 3
549
- end
550
- end
636
+ def raise_already_invoked_error_if_necessary(calling_customization)
637
+ return unless has_been_invoked?
551
638
 
552
- def initial_implementation_action=(action)
553
- implementation.initial_action = action
554
- end
639
+ error_generator.raise_already_invoked_error(message, calling_customization)
640
+ end
555
641
 
556
- def inner_implementation_action=(action)
557
- return unless action
558
- warn_about_stub_override if implementation.inner_action
559
- implementation.inner_action = action
560
- end
642
+ def set_expected_received_count(relativity, n)
643
+ raise "`count` is not supported with negative message expectations" if negative?
644
+ @at_least = (relativity == :at_least)
645
+ @at_most = (relativity == :at_most)
646
+ @exactly = (relativity == :exactly)
647
+ @expected_received_count = case n
648
+ when Numeric then n
649
+ when :once then 1
650
+ when :twice then 2
651
+ when :thrice then 3
652
+ end
653
+ end
561
654
 
562
- def terminal_implementation_action=(action)
563
- implementation.terminal_action = action
564
- end
655
+ def initial_implementation_action=(action)
656
+ implementation.initial_action = action
657
+ end
565
658
 
566
- def warn_about_stub_override
567
- RSpec.warning(
568
- "You're overriding a previous stub implementation of `#{@message}`. " \
569
- "Called from #{CallerFilter.first_non_rspec_line}."
570
- )
659
+ def inner_implementation_action=(action)
660
+ return unless action
661
+ warn_about_stub_override if implementation.inner_action
662
+ implementation.inner_action = action
663
+ end
664
+
665
+ def terminal_implementation_action=(action)
666
+ implementation.terminal_action = action
667
+ end
668
+
669
+ def warn_about_stub_override
670
+ RSpec.warning(
671
+ "You're overriding a previous stub implementation of `#{@message}`. " \
672
+ "Called from #{CallerFilter.first_non_rspec_line}."
673
+ )
674
+ end
675
+
676
+ def wrap_original(method_name, &block)
677
+ if RSpec::Mocks::TestDouble === @method_double.object
678
+ @error_generator.raise_only_valid_on_a_partial_double(method_name)
679
+ else
680
+ warn_about_stub_override if implementation.inner_action
681
+ @implementation = AndWrapOriginalImplementation.new(@method_double.original_implementation_callable, block)
682
+ @yield_receiver_to_implementation_block = false
683
+ end
684
+
685
+ nil
686
+ end
571
687
  end
688
+
689
+ include ImplementationDetails
572
690
  end
573
691
 
574
692
  # Handles the implementation of an `and_yield` declaration.
@@ -592,7 +710,7 @@ module RSpec
592
710
  @error_generator.raise_wrong_arity_error(args, block_signature)
593
711
  end
594
712
 
595
- value = @eval_context ? @eval_context.instance_exec(*args, &block) : block.call(*args)
713
+ value = @eval_context ? @eval_context.instance_exec(*args, &block) : yield(*args)
596
714
  end
597
715
  value
598
716
  end
@@ -614,6 +732,24 @@ module RSpec
614
732
  end
615
733
  end
616
734
 
735
+ # Handles the implementation of an `and_invoke` implementation.
736
+ # @private
737
+ class AndInvokeImplementation
738
+ def initialize(procs_to_invoke)
739
+ @procs_to_invoke = procs_to_invoke
740
+ end
741
+
742
+ def call(*args, &block)
743
+ proc = if @procs_to_invoke.size > 1
744
+ @procs_to_invoke.shift
745
+ else
746
+ @procs_to_invoke.first
747
+ end
748
+
749
+ proc.call(*args, &block)
750
+ end
751
+ end
752
+
617
753
  # Represents a configured implementation. Takes into account
618
754
  # any number of sub-implementations.
619
755
  # @private
@@ -625,6 +761,7 @@ module RSpec
625
761
  action.call(*args, &block)
626
762
  end.last
627
763
  end
764
+ ruby2_keywords :call if respond_to?(:ruby2_keywords, true)
628
765
 
629
766
  def present?
630
767
  actions.any?
@@ -670,6 +807,7 @@ module RSpec
670
807
  def call(*args, &block)
671
808
  @block.call(@method, *args, &block)
672
809
  end
810
+ ruby2_keywords :call if respond_to?(:ruby2_keywords, true)
673
811
 
674
812
  private
675
813
 
@@ -678,17 +816,5 @@ module RSpec
678
816
  "to call the original implementation, and cannot be modified further."
679
817
  end
680
818
  end
681
-
682
- # Insert original locations into stacktraces
683
- #
684
- # @private
685
- class InsertOntoBacktrace
686
- def self.line(location)
687
- yield
688
- rescue RSpec::Mocks::MockExpectationError => error
689
- error.backtrace.insert(0, location)
690
- Kernel.raise error
691
- end
692
- end
693
819
  end
694
820
  end