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.
Files changed (683) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +7 -7
  3. data/.gitmodules +6 -0
  4. data/CHANGELOG.md +16 -1
  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/document_io.rb +1 -1
  123. data/lib-opal/opal/rspec/formatter/html_printer.rb +1 -1
  124. data/lib-opal/opal/rspec/pre_require_fixes.rb +1 -5
  125. data/lib-opal/opal/rspec/requires.rb +32 -19
  126. data/lib-opal/opal/rspec/sprockets_runner.rb.erb +1 -0
  127. data/lib-opal/opal/rspec.rb +3 -0
  128. data/opal-rspec.gemspec +1 -1
  129. data/rspec/upstream/.document +1 -1
  130. data/rspec/upstream/.github/FUNDING.yml +5 -0
  131. data/rspec/upstream/.gitignore +1 -0
  132. data/rspec/upstream/LICENSE.md +27 -0
  133. data/rspec/upstream/README.md +26 -26
  134. data/rspec/upstream/Rakefile +1 -1
  135. data/rspec/upstream/certs/rspec.pem +32 -20
  136. data/rspec/upstream/certs/samphippen.asc +18 -0
  137. data/rspec/upstream/code_of_conduct.md +59 -0
  138. data/rspec/upstream/lib/rspec/version.rb +1 -1
  139. data/rspec/upstream/rspec.gemspec +7 -2
  140. data/rspec-core/upstream/.document +1 -1
  141. data/rspec-core/upstream/.github/FUNDING.yml +5 -0
  142. data/rspec-core/upstream/.github/workflows/ci.yml +150 -0
  143. data/rspec-core/upstream/.gitignore +2 -0
  144. data/rspec-core/upstream/.rspec +1 -0
  145. data/rspec-core/upstream/.rubocop.yml +64 -12
  146. data/rspec-core/upstream/.rubocop_rspec_base.yml +224 -38
  147. data/rspec-core/upstream/.rubocop_todo.yml +1031 -0
  148. data/rspec-core/upstream/.yardopts +2 -1
  149. data/rspec-core/upstream/BUILD_DETAIL.md +149 -0
  150. data/rspec-core/upstream/CODE_OF_CONDUCT.md +59 -0
  151. data/rspec-core/upstream/CONTRIBUTING.md +86 -0
  152. data/rspec-core/upstream/Changelog.md +721 -2
  153. data/rspec-core/upstream/DEV-README.md +2 -2
  154. data/rspec-core/upstream/DEVELOPMENT.md +131 -0
  155. data/rspec-core/upstream/Filtering.md +173 -0
  156. data/rspec-core/upstream/Gemfile +78 -9
  157. data/rspec-core/upstream/ISSUE_TEMPLATE.md +24 -0
  158. data/rspec-core/upstream/{License.txt → LICENSE.md} +6 -5
  159. data/rspec-core/upstream/README.md +165 -24
  160. data/rspec-core/upstream/REPORT_TEMPLATE.md +43 -0
  161. data/rspec-core/upstream/Rakefile +1 -1
  162. data/rspec-core/upstream/benchmarks/allocations/1000_groups_1_example.rb +124 -0
  163. data/rspec-core/upstream/benchmarks/allocations/1_group_1000_examples.rb +63 -0
  164. data/rspec-core/upstream/benchmarks/allocations/helper.rb +30 -0
  165. data/rspec-core/upstream/benchmarks/allocations/running_1000_groups_1_example.rb +100 -0
  166. data/rspec-core/upstream/benchmarks/allocations/running_1_group_1000_examples.rb +60 -0
  167. data/rspec-core/upstream/benchmarks/capture_block_vs_yield.rb +208 -0
  168. data/rspec-core/upstream/benchmarks/flat_map_vs_inject.rb +55 -0
  169. data/rspec-core/upstream/benchmarks/hash_functions.rb +74 -0
  170. data/rspec-core/upstream/benchmarks/keys_each_vs_each_key.rb +43 -0
  171. data/rspec-core/upstream/benchmarks/module_inclusion_filtering.rb +89 -0
  172. data/rspec-core/upstream/benchmarks/precalculate_absolute_file_path_or_not.rb +29 -0
  173. data/rspec-core/upstream/benchmarks/shuffle_vs_sort_by_for_random_ordering.rb +131 -0
  174. data/rspec-core/upstream/benchmarks/singleton_example_groups/helper.rb +122 -0
  175. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks.rb +28 -0
  176. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks_module_inclusions_and_shared_context_inclusions.rb +35 -0
  177. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_module_inclusions.rb +28 -0
  178. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_no_config_hooks_or_inclusions.rb +22 -0
  179. data/rspec-core/upstream/benchmarks/singleton_example_groups/with_shared_context_inclusions.rb +28 -0
  180. data/rspec-core/upstream/benchmarks/threadsafe_let_block.rb +312 -0
  181. data/rspec-core/upstream/cucumber.yml +7 -2
  182. data/rspec-core/upstream/features/.nav +5 -1
  183. data/rspec-core/upstream/features/README.md +2 -2
  184. data/rspec-core/upstream/features/clear_examples.feature +106 -0
  185. data/rspec-core/upstream/features/command_line/bisect.feature +178 -0
  186. data/rspec-core/upstream/features/command_line/example_matches_name_option.feature +131 -0
  187. data/rspec-core/upstream/features/command_line/example_name_option.feature +2 -0
  188. data/rspec-core/upstream/features/command_line/fail_fast.feature +21 -4
  189. data/rspec-core/upstream/features/command_line/init.feature +2 -2
  190. data/rspec-core/upstream/features/command_line/line_number_appended_to_path.feature +2 -2
  191. data/rspec-core/upstream/features/command_line/only_failures.feature +113 -0
  192. data/rspec-core/upstream/features/command_line/order.md +8 -1
  193. data/rspec-core/upstream/features/command_line/pattern_option.feature +6 -3
  194. data/rspec-core/upstream/features/command_line/rake_task.feature +3 -3
  195. data/rspec-core/upstream/features/command_line/randomization.feature +5 -2
  196. data/rspec-core/upstream/features/command_line/ruby.feature +6 -2
  197. data/rspec-core/upstream/features/command_line/tag.feature +13 -11
  198. data/rspec-core/upstream/features/command_line/warnings_option.feature +20 -3
  199. data/rspec-core/upstream/features/configuration/backtrace_exclusion_patterns.feature +45 -29
  200. data/rspec-core/upstream/features/configuration/color.feature +22 -0
  201. data/rspec-core/upstream/features/configuration/custom_settings.feature +9 -13
  202. data/rspec-core/upstream/features/configuration/default_path.feature +1 -1
  203. data/rspec-core/upstream/features/configuration/enable_global_dsl.feature +15 -1
  204. data/rspec-core/upstream/features/configuration/error_exit_code.feature +52 -0
  205. data/rspec-core/upstream/features/configuration/fail_fast.feature +42 -12
  206. data/rspec-core/upstream/features/configuration/fail_if_no_examples.feature +31 -0
  207. data/rspec-core/upstream/features/configuration/failure_exit_code.feature +26 -0
  208. data/rspec-core/upstream/features/configuration/overriding_global_ordering.feature +1 -1
  209. data/rspec-core/upstream/features/configuration/pattern.feature +1 -1
  210. data/rspec-core/upstream/features/configuration/profile.feature +25 -0
  211. data/rspec-core/upstream/features/configuration/read_options_from_file.feature +25 -19
  212. data/rspec-core/upstream/features/configuration/run_all_when_everything_filtered.feature +4 -0
  213. data/rspec-core/upstream/features/core_standalone.feature +2 -0
  214. data/rspec-core/upstream/features/example_groups/basic_structure.feature +1 -0
  215. data/rspec-core/upstream/features/example_groups/shared_context.feature +55 -5
  216. data/rspec-core/upstream/features/example_groups/shared_examples.feature +59 -15
  217. data/rspec-core/upstream/features/expectation_framework_integration/aggregating_failures.feature +602 -0
  218. data/rspec-core/upstream/features/expectation_framework_integration/configure_expectation_framework.feature +13 -5
  219. data/rspec-core/upstream/features/filtering/filter_run_when_matching.feature +75 -0
  220. data/rspec-core/upstream/features/formatters/configurable_colors.feature +23 -4
  221. data/rspec-core/upstream/features/helper_methods/let.feature +3 -0
  222. data/rspec-core/upstream/features/helper_methods/modules.feature +6 -0
  223. data/rspec-core/upstream/features/hooks/around_hooks.feature +36 -6
  224. data/rspec-core/upstream/features/hooks/before_and_after_hooks.feature +47 -5
  225. data/rspec-core/upstream/features/hooks/filtering.feature +199 -4
  226. data/rspec-core/upstream/features/hooks/when_first_matching_example_defined.feature +70 -0
  227. data/rspec-core/upstream/features/metadata/current_scope.feature +87 -0
  228. data/rspec-core/upstream/features/metadata/described_class.feature +12 -5
  229. data/rspec-core/upstream/features/metadata/user_defined.feature +3 -3
  230. data/rspec-core/upstream/features/mock_framework_integration/use_any_framework.feature +1 -1
  231. data/rspec-core/upstream/features/mock_framework_integration/use_flexmock.feature +5 -5
  232. data/rspec-core/upstream/features/mock_framework_integration/use_mocha.feature +5 -5
  233. data/rspec-core/upstream/features/mock_framework_integration/use_rr.feature +5 -5
  234. data/rspec-core/upstream/features/mock_framework_integration/use_rspec.feature +6 -6
  235. data/rspec-core/upstream/features/pending_and_skipped_examples/pending_examples.feature +8 -7
  236. data/rspec-core/upstream/features/pending_and_skipped_examples/skipped_examples.feature +49 -22
  237. data/rspec-core/upstream/features/step_definitions/additional_cli_steps.rb +142 -12
  238. data/rspec-core/upstream/features/step_definitions/core_standalone_steps.rb +6 -2
  239. data/rspec-core/upstream/features/subject/implicit_subject.feature +3 -2
  240. data/rspec-core/upstream/features/subject/one_liner_syntax.feature +9 -5
  241. data/rspec-core/upstream/features/support/diff_lcs_versions.rb +17 -0
  242. data/rspec-core/upstream/features/support/env.rb +20 -7
  243. data/rspec-core/upstream/features/support/jruby.rb +8 -0
  244. data/rspec-core/upstream/features/support/require_expect_syntax_in_aruba_specs.rb +6 -3
  245. data/rspec-core/upstream/features/support/rubinius.rb +5 -1
  246. data/rspec-core/upstream/features/support/ruby_27_support.rb +7 -0
  247. data/rspec-core/upstream/features/support/send_sigint_during_bisect.rb +21 -0
  248. data/rspec-core/upstream/lib/rspec/autorun.rb +1 -0
  249. data/rspec-core/upstream/lib/rspec/core/backtrace_formatter.rb +3 -4
  250. data/rspec-core/upstream/lib/rspec/core/bisect/coordinator.rb +62 -0
  251. data/rspec-core/upstream/lib/rspec/core/bisect/example_minimizer.rb +173 -0
  252. data/rspec-core/upstream/lib/rspec/core/bisect/fork_runner.rb +138 -0
  253. data/rspec-core/upstream/lib/rspec/core/bisect/server.rb +61 -0
  254. data/rspec-core/upstream/lib/rspec/core/bisect/shell_command.rb +126 -0
  255. data/rspec-core/upstream/lib/rspec/core/bisect/shell_runner.rb +73 -0
  256. data/rspec-core/upstream/lib/rspec/core/bisect/utilities.rb +69 -0
  257. data/rspec-core/upstream/lib/rspec/core/configuration.rb +1157 -212
  258. data/rspec-core/upstream/lib/rspec/core/configuration_options.rb +82 -22
  259. data/rspec-core/upstream/lib/rspec/core/did_you_mean.rb +46 -0
  260. data/rspec-core/upstream/lib/rspec/core/drb.rb +10 -1
  261. data/rspec-core/upstream/lib/rspec/core/dsl.rb +10 -5
  262. data/rspec-core/upstream/lib/rspec/core/example.rb +271 -107
  263. data/rspec-core/upstream/lib/rspec/core/example_group.rb +426 -127
  264. data/rspec-core/upstream/lib/rspec/core/example_status_persister.rb +235 -0
  265. data/rspec-core/upstream/lib/rspec/core/filter_manager.rb +76 -104
  266. data/rspec-core/upstream/lib/rspec/core/flat_map.rb +6 -4
  267. data/rspec-core/upstream/lib/rspec/core/formatters/base_bisect_formatter.rb +45 -0
  268. data/rspec-core/upstream/lib/rspec/core/formatters/base_formatter.rb +7 -4
  269. data/rspec-core/upstream/lib/rspec/core/formatters/base_text_formatter.rb +15 -16
  270. data/rspec-core/upstream/lib/rspec/core/formatters/bisect_drb_formatter.rb +29 -0
  271. data/rspec-core/upstream/lib/rspec/core/formatters/bisect_progress_formatter.rb +157 -0
  272. data/rspec-core/upstream/lib/rspec/core/formatters/console_codes.rb +28 -16
  273. data/rspec-core/upstream/lib/rspec/core/formatters/deprecation_formatter.rb +14 -13
  274. data/rspec-core/upstream/lib/rspec/core/formatters/documentation_formatter.rb +47 -13
  275. data/rspec-core/upstream/lib/rspec/core/formatters/exception_presenter.rb +525 -0
  276. data/rspec-core/upstream/lib/rspec/core/formatters/failure_list_formatter.rb +23 -0
  277. data/rspec-core/upstream/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
  278. data/rspec-core/upstream/lib/rspec/core/formatters/helpers.rb +40 -9
  279. data/rspec-core/upstream/lib/rspec/core/formatters/html_formatter.rb +20 -16
  280. data/rspec-core/upstream/lib/rspec/core/formatters/html_printer.rb +27 -18
  281. data/rspec-core/upstream/lib/rspec/core/formatters/html_snippet_extractor.rb +120 -0
  282. data/rspec-core/upstream/lib/rspec/core/formatters/json_formatter.rb +15 -7
  283. data/rspec-core/upstream/lib/rspec/core/formatters/profile_formatter.rb +10 -7
  284. data/rspec-core/upstream/lib/rspec/core/formatters/progress_formatter.rb +1 -0
  285. data/rspec-core/upstream/lib/rspec/core/formatters/protocol.rb +62 -43
  286. data/rspec-core/upstream/lib/rspec/core/formatters/snippet_extractor.rb +115 -85
  287. data/rspec-core/upstream/lib/rspec/core/formatters/syntax_highlighter.rb +91 -0
  288. data/rspec-core/upstream/lib/rspec/core/formatters.rb +71 -32
  289. data/rspec-core/upstream/lib/rspec/core/hooks.rb +303 -248
  290. data/rspec-core/upstream/lib/rspec/core/invocations.rb +87 -0
  291. data/rspec-core/upstream/lib/rspec/core/memoized_helpers.rb +155 -47
  292. data/rspec-core/upstream/lib/rspec/core/metadata.rb +102 -41
  293. data/rspec-core/upstream/lib/rspec/core/metadata_filter.rb +209 -49
  294. data/rspec-core/upstream/lib/rspec/core/minitest_assertions_adapter.rb +5 -2
  295. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
  296. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/mocha.rb +8 -8
  297. data/rspec-core/upstream/lib/rspec/core/notifications.rb +180 -201
  298. data/rspec-core/upstream/lib/rspec/core/option_parser.rb +159 -58
  299. data/rspec-core/upstream/lib/rspec/core/ordering.rb +40 -26
  300. data/rspec-core/upstream/lib/rspec/core/output_wrapper.rb +29 -0
  301. data/rspec-core/upstream/lib/rspec/core/pending.rb +19 -25
  302. data/rspec-core/upstream/lib/rspec/core/profiler.rb +34 -0
  303. data/rspec-core/upstream/lib/rspec/core/project_initializer/.rspec +0 -1
  304. data/rspec-core/upstream/lib/rspec/core/project_initializer/spec/spec_helper.rb +31 -22
  305. data/rspec-core/upstream/lib/rspec/core/project_initializer.rb +1 -1
  306. data/rspec-core/upstream/lib/rspec/core/rake_task.rb +73 -72
  307. data/rspec-core/upstream/lib/rspec/core/reporter.rb +134 -18
  308. data/rspec-core/upstream/lib/rspec/core/ruby_project.rb +13 -5
  309. data/rspec-core/upstream/lib/rspec/core/runner.rb +99 -45
  310. data/rspec-core/upstream/lib/rspec/core/sandbox.rb +37 -0
  311. data/rspec-core/upstream/lib/rspec/core/set.rb +54 -0
  312. data/rspec-core/upstream/lib/rspec/core/shared_example_group.rb +126 -37
  313. data/rspec-core/upstream/lib/rspec/core/shell_escape.rb +49 -0
  314. data/rspec-core/upstream/lib/rspec/core/test_unit_assertions_adapter.rb +3 -3
  315. data/rspec-core/upstream/lib/rspec/core/version.rb +1 -1
  316. data/rspec-core/upstream/lib/rspec/core/warnings.rb +2 -2
  317. data/rspec-core/upstream/lib/rspec/core/world.rb +164 -60
  318. data/rspec-core/upstream/lib/rspec/core.rb +64 -21
  319. data/rspec-core/upstream/maintenance-branch +1 -1
  320. data/rspec-core/upstream/rspec-core.gemspec +16 -11
  321. data/rspec-core/upstream/script/ci_functions.sh +73 -0
  322. data/rspec-core/upstream/script/clone_all_rspec_repos +2 -2
  323. data/rspec-core/upstream/script/cucumber.sh +8 -0
  324. data/rspec-core/upstream/script/custom_build_functions.sh +22 -0
  325. data/rspec-core/upstream/script/functions.sh +125 -89
  326. data/rspec-core/upstream/script/legacy_setup.sh +20 -0
  327. data/rspec-core/upstream/script/predicate_functions.sh +162 -0
  328. data/rspec-core/upstream/script/rspec_with_simplecov +6 -6
  329. data/rspec-core/upstream/script/run_build +14 -9
  330. data/rspec-core/upstream/script/run_rubocop +14 -0
  331. data/rspec-core/upstream/script/update_rubygems_and_install_bundler +20 -0
  332. data/rspec-expectations/upstream/.document +1 -1
  333. data/rspec-expectations/upstream/.github/FUNDING.yml +5 -0
  334. data/rspec-expectations/upstream/.github/workflows/ci.yml +150 -0
  335. data/rspec-expectations/upstream/.gitignore +2 -0
  336. data/rspec-expectations/upstream/.rubocop.yml +126 -2
  337. data/rspec-expectations/upstream/.rubocop_rspec_base.yml +224 -38
  338. data/rspec-expectations/upstream/.rubocop_todo.yml +335 -0
  339. data/rspec-expectations/upstream/.yardopts +1 -1
  340. data/rspec-expectations/upstream/BUILD_DETAIL.md +149 -0
  341. data/rspec-expectations/upstream/CODE_OF_CONDUCT.md +59 -0
  342. data/rspec-expectations/upstream/CONTRIBUTING.md +86 -0
  343. data/rspec-expectations/upstream/Changelog.md +454 -4
  344. data/rspec-expectations/upstream/DEV-README.md +3 -3
  345. data/rspec-expectations/upstream/DEVELOPMENT.md +131 -0
  346. data/rspec-expectations/upstream/Gemfile +77 -9
  347. data/rspec-expectations/upstream/ISSUE_TEMPLATE.md +24 -0
  348. data/{rspec-mocks/upstream/License.txt → rspec-expectations/upstream/LICENSE.md} +5 -4
  349. data/rspec-expectations/upstream/README.md +73 -31
  350. data/rspec-expectations/upstream/REPORT_TEMPLATE.md +43 -0
  351. data/rspec-expectations/upstream/Rakefile +13 -10
  352. data/rspec-expectations/upstream/Should.md +13 -5
  353. data/rspec-expectations/upstream/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +1 -2
  354. data/rspec-expectations/upstream/benchmarks/caller_vs_raise_for_backtrace.rb +77 -0
  355. data/rspec-expectations/upstream/benchmarks/count_vs_select_size.rb +68 -0
  356. data/rspec-expectations/upstream/benchmarks/default_messages_as_methods_v_blocks.rb +1 -1
  357. data/rspec-expectations/upstream/benchmarks/gsub_vs_tr_single_character.rb +28 -0
  358. data/rspec-expectations/upstream/benchmarks/include_matcher.rb +249 -0
  359. data/rspec-expectations/upstream/benchmarks/include_v_superclass.rb +0 -1
  360. data/rspec-expectations/upstream/benchmarks/match_array/failing_with_duplicate_items.rb +1 -1
  361. data/rspec-expectations/upstream/benchmarks/output_stringio_vs_tempfile.rb +31 -0
  362. data/rspec-expectations/upstream/benchmarks/set_vs_array_include.rb +1 -3
  363. data/rspec-expectations/upstream/cucumber.yml +9 -4
  364. data/rspec-expectations/upstream/features/.nav +1 -0
  365. data/rspec-expectations/upstream/features/aggregating_failures.feature +56 -0
  366. data/rspec-expectations/upstream/features/built_in_matchers/README.md +3 -3
  367. data/rspec-expectations/upstream/features/built_in_matchers/all.feature +3 -2
  368. data/rspec-expectations/upstream/features/built_in_matchers/be_within.feature +1 -1
  369. data/rspec-expectations/upstream/features/built_in_matchers/change.feature +8 -6
  370. data/rspec-expectations/upstream/features/built_in_matchers/comparisons.feature +33 -1
  371. data/rspec-expectations/upstream/features/built_in_matchers/contain_exactly.feature +1 -0
  372. data/rspec-expectations/upstream/features/built_in_matchers/cover.feature +3 -3
  373. data/rspec-expectations/upstream/features/built_in_matchers/exist.feature +1 -1
  374. data/rspec-expectations/upstream/features/built_in_matchers/have_attributes.feature +1 -2
  375. data/rspec-expectations/upstream/features/built_in_matchers/include.feature +74 -17
  376. data/rspec-expectations/upstream/features/built_in_matchers/match.feature +2 -2
  377. data/rspec-expectations/upstream/features/built_in_matchers/output.feature +67 -4
  378. data/rspec-expectations/upstream/features/built_in_matchers/predicates.feature +56 -19
  379. data/rspec-expectations/upstream/features/built_in_matchers/raise_error.feature +16 -2
  380. data/rspec-expectations/upstream/features/built_in_matchers/respond_to.feature +191 -3
  381. data/rspec-expectations/upstream/features/built_in_matchers/satisfy.feature +17 -8
  382. data/rspec-expectations/upstream/features/built_in_matchers/throw_symbol.feature +1 -1
  383. data/rspec-expectations/upstream/features/built_in_matchers/types.feature +34 -34
  384. data/rspec-expectations/upstream/features/built_in_matchers/yield.feature +2 -2
  385. data/rspec-expectations/upstream/features/composing_matchers.feature +4 -4
  386. data/rspec-expectations/upstream/features/custom_matchers/define_block_matcher.feature +78 -0
  387. data/rspec-expectations/upstream/features/custom_matchers/define_diffable_matcher.feature +115 -3
  388. data/rspec-expectations/upstream/features/custom_matchers/define_matcher.feature +173 -21
  389. data/rspec-expectations/upstream/features/custom_matchers/define_matcher_with_fluent_interface.feature +21 -2
  390. data/rspec-expectations/upstream/features/define_negated_matcher.feature +2 -1
  391. data/rspec-expectations/upstream/features/diffing.feature +29 -1
  392. data/rspec-expectations/upstream/features/implicit_docstrings.feature +8 -8
  393. data/rspec-expectations/upstream/features/step_definitions/additional_cli_steps.rb +11 -7
  394. data/rspec-expectations/upstream/features/support/diff_lcs_versions.rb +25 -0
  395. data/rspec-expectations/upstream/features/support/disallow_certain_apis.rb +3 -3
  396. data/rspec-expectations/upstream/features/support/env.rb +11 -11
  397. data/rspec-expectations/upstream/features/support/rubinius.rb +1 -1
  398. data/rspec-expectations/upstream/features/support/ruby_features.rb +39 -0
  399. data/rspec-expectations/upstream/features/syntax_configuration.feature +9 -9
  400. data/rspec-expectations/upstream/features/test_frameworks/minitest.feature +69 -2
  401. data/rspec-expectations/upstream/lib/rspec/expectations/block_snippet_extractor.rb +253 -0
  402. data/rspec-expectations/upstream/lib/rspec/expectations/configuration.rb +84 -1
  403. data/rspec-expectations/upstream/lib/rspec/expectations/expectation_target.rb +82 -38
  404. data/rspec-expectations/upstream/lib/rspec/expectations/fail_with.rb +11 -6
  405. data/rspec-expectations/upstream/lib/rspec/expectations/failure_aggregator.rb +212 -0
  406. data/rspec-expectations/upstream/lib/rspec/expectations/handler.rb +27 -12
  407. data/rspec-expectations/upstream/lib/rspec/expectations/minitest_integration.rb +43 -2
  408. data/rspec-expectations/upstream/lib/rspec/expectations/syntax.rb +5 -5
  409. data/rspec-expectations/upstream/lib/rspec/expectations/version.rb +1 -1
  410. data/rspec-expectations/upstream/lib/rspec/expectations.rb +15 -1
  411. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/all.rb +1 -0
  412. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/base_matcher.rb +77 -11
  413. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be.rb +28 -114
  414. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_between.rb +1 -1
  415. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_instance_of.rb +5 -1
  416. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_kind_of.rb +5 -1
  417. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_within.rb +4 -4
  418. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/change.rb +168 -55
  419. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/compound.rb +61 -29
  420. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/contain_exactly.rb +73 -12
  421. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/count_expectation.rb +169 -0
  422. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eq.rb +3 -38
  423. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eql.rb +2 -2
  424. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/equal.rb +3 -3
  425. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/exist.rb +7 -3
  426. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/has.rb +90 -24
  427. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/have_attributes.rb +37 -7
  428. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/include.rb +124 -23
  429. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/match.rb +79 -2
  430. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/operators.rb +14 -5
  431. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/output.rb +56 -1
  432. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/raise_error.rb +126 -29
  433. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/respond_to.rb +118 -9
  434. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/satisfy.rb +28 -7
  435. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/{start_and_end_with.rb → start_or_end_with.rb} +20 -8
  436. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/throw_symbol.rb +11 -5
  437. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/yield.rb +110 -155
  438. data/rspec-expectations/upstream/lib/rspec/matchers/built_in.rb +4 -3
  439. data/rspec-expectations/upstream/lib/rspec/matchers/composable.rb +23 -35
  440. data/rspec-expectations/upstream/lib/rspec/matchers/dsl.rb +179 -26
  441. data/rspec-expectations/upstream/lib/rspec/matchers/english_phrasing.rb +58 -0
  442. data/rspec-expectations/upstream/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +82 -0
  443. data/rspec-expectations/upstream/lib/rspec/matchers/fail_matchers.rb +42 -0
  444. data/rspec-expectations/upstream/lib/rspec/matchers/generated_descriptions.rb +1 -2
  445. data/rspec-expectations/upstream/lib/rspec/matchers/matcher_delegator.rb +2 -0
  446. data/rspec-expectations/upstream/lib/rspec/matchers/matcher_protocol.rb +72 -66
  447. data/rspec-expectations/upstream/lib/rspec/matchers.rb +227 -150
  448. data/rspec-expectations/upstream/maintenance-branch +1 -1
  449. data/rspec-expectations/upstream/rspec-expectations.gemspec +13 -8
  450. data/rspec-expectations/upstream/script/ci_functions.sh +73 -0
  451. data/rspec-expectations/upstream/script/clone_all_rspec_repos +2 -2
  452. data/rspec-expectations/upstream/script/cucumber.sh +8 -0
  453. data/rspec-expectations/upstream/script/functions.sh +125 -89
  454. data/rspec-expectations/upstream/script/legacy_setup.sh +20 -0
  455. data/rspec-expectations/upstream/script/predicate_functions.sh +162 -0
  456. data/rspec-expectations/upstream/script/run_build +14 -9
  457. data/rspec-expectations/upstream/script/run_rubocop +14 -0
  458. data/rspec-expectations/upstream/script/update_rubygems_and_install_bundler +20 -0
  459. data/rspec-mocks/upstream/.document +1 -1
  460. data/rspec-mocks/upstream/.github/FUNDING.yml +5 -0
  461. data/rspec-mocks/upstream/.github/workflows/ci.yml +150 -0
  462. data/rspec-mocks/upstream/.gitignore +2 -0
  463. data/rspec-mocks/upstream/.rubocop.yml +28 -9
  464. data/rspec-mocks/upstream/.rubocop_rspec_base.yml +224 -38
  465. data/rspec-mocks/upstream/.rubocop_todo.yml +573 -0
  466. data/rspec-mocks/upstream/.yardopts +1 -1
  467. data/rspec-mocks/upstream/BUILD_DETAIL.md +149 -0
  468. data/rspec-mocks/upstream/CODE_OF_CONDUCT.md +59 -0
  469. data/rspec-mocks/upstream/CONTRIBUTING.md +86 -0
  470. data/rspec-mocks/upstream/Changelog.md +398 -3
  471. data/rspec-mocks/upstream/DEV-README.md +3 -3
  472. data/rspec-mocks/upstream/DEVELOPMENT.md +131 -0
  473. data/rspec-mocks/upstream/Gemfile +77 -10
  474. data/rspec-mocks/upstream/ISSUE_TEMPLATE.md +24 -0
  475. data/{rspec-expectations/upstream/License.txt → rspec-mocks/upstream/LICENSE.md} +5 -4
  476. data/rspec-mocks/upstream/README.md +83 -17
  477. data/rspec-mocks/upstream/REPORT_TEMPLATE.md +43 -0
  478. data/rspec-mocks/upstream/Rakefile +3 -3
  479. data/rspec-mocks/upstream/benchmarks/accessing_configuration_via_method_vs_cache.rb +52 -0
  480. data/rspec-mocks/upstream/benchmarks/allocations/1_object_1000_mocks.rb +76 -0
  481. data/rspec-mocks/upstream/benchmarks/allocations/helper.rb +17 -0
  482. data/rspec-mocks/upstream/benchmarks/each_value_v_values_each.rb +4 -5
  483. data/rspec-mocks/upstream/benchmarks/find_original_method_early.rb +1 -1
  484. data/rspec-mocks/upstream/benchmarks/method_defined_at_any_visibility.rb +3 -3
  485. data/rspec-mocks/upstream/benchmarks/thread_safety.rb +1 -1
  486. data/rspec-mocks/upstream/benchmarks/transfer_nested_constants.rb +1 -1
  487. data/rspec-mocks/upstream/cucumber.yml +8 -1
  488. data/rspec-mocks/upstream/features/.nav +2 -0
  489. data/rspec-mocks/upstream/features/basics/allowing_messages.feature +1 -1
  490. data/rspec-mocks/upstream/features/basics/expecting_messages.feature +40 -1
  491. data/rspec-mocks/upstream/features/basics/null_object_doubles.feature +1 -1
  492. data/rspec-mocks/upstream/features/basics/partial_test_doubles.feature +1 -1
  493. data/rspec-mocks/upstream/features/basics/scope.feature +5 -5
  494. data/rspec-mocks/upstream/features/basics/spies.feature +17 -30
  495. data/rspec-mocks/upstream/features/basics/test_doubles.feature +4 -4
  496. data/rspec-mocks/upstream/features/configuring_responses/README.md +2 -0
  497. data/rspec-mocks/upstream/features/configuring_responses/calling_the_original_implementation.feature +2 -2
  498. data/rspec-mocks/upstream/features/configuring_responses/mixed_responses.feature +25 -0
  499. data/rspec-mocks/upstream/features/configuring_responses/raising_an_error.feature +1 -0
  500. data/rspec-mocks/upstream/features/configuring_responses/wrapping_the_original_implementation.feature +3 -3
  501. data/rspec-mocks/upstream/features/configuring_responses/yielding.feature +2 -2
  502. data/rspec-mocks/upstream/features/mutating_constants/README.md +1 -1
  503. data/rspec-mocks/upstream/features/old_syntax/any_instance.feature +3 -3
  504. data/rspec-mocks/upstream/features/old_syntax/should_receive.feature +3 -1
  505. data/rspec-mocks/upstream/features/outside_rspec/any_test_framework.feature +116 -0
  506. data/rspec-mocks/upstream/features/outside_rspec/minitest.feature +202 -46
  507. data/rspec-mocks/upstream/features/outside_rspec/standalone.feature +5 -5
  508. data/rspec-mocks/upstream/features/setting_constraints/matching_arguments.feature +54 -27
  509. data/rspec-mocks/upstream/features/setting_constraints/message_order.feature +2 -2
  510. data/rspec-mocks/upstream/features/setting_constraints/receive_counts.feature +18 -0
  511. data/rspec-mocks/upstream/features/step_definitions/additional_cli_steps.rb +4 -4
  512. data/rspec-mocks/upstream/features/support/disallow_certain_apis.rb +3 -2
  513. data/rspec-mocks/upstream/features/support/env.rb +12 -12
  514. data/rspec-mocks/upstream/features/support/rubinius.rb +1 -1
  515. data/rspec-mocks/upstream/features/verifying_doubles/README.md +2 -2
  516. data/rspec-mocks/upstream/features/verifying_doubles/class_doubles.feature +1 -1
  517. data/rspec-mocks/upstream/features/verifying_doubles/dynamic_classes.feature +41 -5
  518. data/rspec-mocks/upstream/features/verifying_doubles/instance_doubles.feature +5 -3
  519. data/rspec-mocks/upstream/features/working_with_legacy_code/any_instance.feature +8 -6
  520. data/rspec-mocks/upstream/features/working_with_legacy_code/message_chains.feature +16 -1
  521. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/chain.rb +3 -1
  522. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
  523. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expect_chain_chain.rb +1 -5
  524. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expectation_chain.rb +7 -5
  525. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/message_chains.rb +1 -3
  526. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/recorder.rb +42 -14
  527. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain.rb +13 -7
  528. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain_chain.rb +1 -5
  529. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance.rb +1 -0
  530. data/rspec-mocks/upstream/lib/rspec/mocks/argument_list_matcher.rb +53 -10
  531. data/rspec-mocks/upstream/lib/rspec/mocks/argument_matchers.rb +66 -26
  532. data/rspec-mocks/upstream/lib/rspec/mocks/configuration.rb +59 -4
  533. data/rspec-mocks/upstream/lib/rspec/mocks/error_generator.rb +235 -108
  534. data/rspec-mocks/upstream/lib/rspec/mocks/example_methods.rb +82 -27
  535. data/rspec-mocks/upstream/lib/rspec/mocks/instance_method_stasher.rb +12 -1
  536. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/have_received.rb +30 -17
  537. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive.rb +28 -1
  538. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_message_chain.rb +17 -1
  539. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_messages.rb +6 -0
  540. data/rspec-mocks/upstream/lib/rspec/mocks/message_chain.rb +0 -4
  541. data/rspec-mocks/upstream/lib/rspec/mocks/message_expectation.rb +430 -304
  542. data/rspec-mocks/upstream/lib/rspec/mocks/method_double.rb +46 -15
  543. data/rspec-mocks/upstream/lib/rspec/mocks/method_reference.rb +78 -19
  544. data/rspec-mocks/upstream/lib/rspec/mocks/minitest_integration.rb +68 -0
  545. data/rspec-mocks/upstream/lib/rspec/mocks/mutate_const.rb +23 -8
  546. data/rspec-mocks/upstream/lib/rspec/mocks/object_reference.rb +81 -23
  547. data/rspec-mocks/upstream/lib/rspec/mocks/proxy.rb +135 -41
  548. data/rspec-mocks/upstream/lib/rspec/mocks/space.rb +33 -16
  549. data/rspec-mocks/upstream/lib/rspec/mocks/standalone.rb +1 -1
  550. data/rspec-mocks/upstream/lib/rspec/mocks/syntax.rb +18 -22
  551. data/rspec-mocks/upstream/lib/rspec/mocks/targets.rb +51 -24
  552. data/rspec-mocks/upstream/lib/rspec/mocks/test_double.rb +42 -6
  553. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_double.rb +15 -21
  554. data/rspec-mocks/upstream/lib/rspec/mocks/{verifying_message_expecation.rb → verifying_message_expectation.rb} +11 -18
  555. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_proxy.rb +60 -11
  556. data/rspec-mocks/upstream/lib/rspec/mocks/version.rb +1 -1
  557. data/rspec-mocks/upstream/lib/rspec/mocks.rb +8 -1
  558. data/rspec-mocks/upstream/maintenance-branch +1 -1
  559. data/rspec-mocks/upstream/rspec-mocks.gemspec +14 -6
  560. data/rspec-mocks/upstream/script/ci_functions.sh +73 -0
  561. data/rspec-mocks/upstream/script/clone_all_rspec_repos +2 -2
  562. data/rspec-mocks/upstream/script/cucumber.sh +8 -0
  563. data/rspec-mocks/upstream/script/functions.sh +125 -89
  564. data/rspec-mocks/upstream/script/legacy_setup.sh +20 -0
  565. data/rspec-mocks/upstream/script/predicate_functions.sh +162 -0
  566. data/rspec-mocks/upstream/script/run_build +14 -9
  567. data/rspec-mocks/upstream/script/run_rubocop +14 -0
  568. data/rspec-mocks/upstream/script/update_rubygems_and_install_bundler +20 -0
  569. data/{stubs/diff/lcs/assertions.rb → rspec-mocks/upstream/tmp/.gitkeep} +0 -0
  570. data/rspec-support/upstream/.github/FUNDING.yml +5 -0
  571. data/rspec-support/upstream/.github/workflows/ci.yml +150 -0
  572. data/rspec-support/upstream/.gitignore +4 -0
  573. data/rspec-support/upstream/.rubocop.yml +33 -1
  574. data/rspec-support/upstream/.rubocop_rspec_base.yml +224 -38
  575. data/rspec-support/upstream/.rubocop_todo.yml +424 -0
  576. data/rspec-support/upstream/BUILD_DETAIL.md +149 -0
  577. data/rspec-support/upstream/CODE_OF_CONDUCT.md +59 -0
  578. data/rspec-support/upstream/CONTRIBUTING.md +86 -0
  579. data/rspec-support/upstream/Changelog.md +287 -0
  580. data/rspec-support/upstream/DEVELOPMENT.md +131 -0
  581. data/rspec-support/upstream/Gemfile +52 -4
  582. data/rspec-support/upstream/ISSUE_TEMPLATE.md +24 -0
  583. data/rspec-support/upstream/{LICENSE.txt → LICENSE.md} +3 -2
  584. data/rspec-support/upstream/README.md +29 -6
  585. data/rspec-support/upstream/REPORT_TEMPLATE.md +43 -0
  586. data/rspec-support/upstream/Rakefile +9 -5
  587. data/rspec-support/upstream/benchmarks/caller_vs_caller_locations.rb +19 -0
  588. data/rspec-support/upstream/benchmarks/caller_vs_caller_locations_vs_raise.rb +153 -0
  589. data/rspec-support/upstream/benchmarks/class_exec_vs_klass_exec.rb +43 -0
  590. data/rspec-support/upstream/benchmarks/map_hash.rb +70 -0
  591. data/rspec-support/upstream/benchmarks/ripper.rb +44 -0
  592. data/rspec-support/upstream/benchmarks/skip_frames_for_caller_filter.rb +27 -0
  593. data/rspec-support/upstream/lib/rspec/support/caller_filter.rb +35 -15
  594. data/rspec-support/upstream/lib/rspec/support/comparable_version.rb +46 -0
  595. data/rspec-support/upstream/lib/rspec/support/differ.rb +35 -34
  596. data/rspec-support/upstream/lib/rspec/support/directory_maker.rb +3 -1
  597. data/rspec-support/upstream/lib/rspec/support/encoded_string.rb +103 -11
  598. data/rspec-support/upstream/lib/rspec/support/fuzzy_matcher.rb +5 -5
  599. data/rspec-support/upstream/lib/rspec/support/matcher_definition.rb +11 -0
  600. data/rspec-support/upstream/lib/rspec/support/method_signature_verifier.rb +192 -26
  601. data/rspec-support/upstream/lib/rspec/support/mutex.rb +73 -0
  602. data/rspec-support/upstream/lib/rspec/support/object_formatter.rb +275 -0
  603. data/rspec-support/upstream/lib/rspec/support/recursive_const_methods.rb +1 -1
  604. data/rspec-support/upstream/lib/rspec/support/reentrant_mutex.rb +78 -0
  605. data/rspec-support/upstream/lib/rspec/support/ruby_features.rb +168 -15
  606. data/rspec-support/upstream/lib/rspec/support/source/location.rb +21 -0
  607. data/rspec-support/upstream/lib/rspec/support/source/node.rb +110 -0
  608. data/rspec-support/upstream/lib/rspec/support/source/token.rb +94 -0
  609. data/rspec-support/upstream/lib/rspec/support/source.rb +85 -0
  610. data/rspec-support/upstream/lib/rspec/support/spec/deprecation_helpers.rb +17 -29
  611. data/rspec-support/upstream/lib/rspec/support/spec/diff_helpers.rb +31 -0
  612. data/rspec-support/upstream/lib/rspec/support/spec/in_sub_process.rb +41 -17
  613. data/rspec-support/upstream/lib/rspec/support/spec/library_wide_checks.rb +150 -0
  614. data/rspec-support/upstream/lib/rspec/support/spec/shell_out.rb +39 -3
  615. data/rspec-support/upstream/lib/rspec/support/spec/stderr_splitter.rb +27 -4
  616. data/rspec-support/upstream/lib/rspec/support/spec/string_matcher.rb +45 -0
  617. data/rspec-support/upstream/lib/rspec/support/spec/with_isolated_directory.rb +5 -1
  618. data/rspec-support/upstream/lib/rspec/support/spec.rb +17 -7
  619. data/rspec-support/upstream/lib/rspec/support/version.rb +1 -1
  620. data/rspec-support/upstream/lib/rspec/support/warnings.rb +3 -3
  621. data/rspec-support/upstream/lib/rspec/support/with_keywords_when_needed.rb +33 -0
  622. data/rspec-support/upstream/lib/rspec/support.rb +81 -3
  623. data/rspec-support/upstream/maintenance-branch +1 -1
  624. data/rspec-support/upstream/rspec-support.gemspec +10 -4
  625. data/rspec-support/upstream/script/ci_functions.sh +73 -0
  626. data/rspec-support/upstream/script/clone_all_rspec_repos +2 -2
  627. data/rspec-support/upstream/script/cucumber.sh +8 -0
  628. data/rspec-support/upstream/script/functions.sh +125 -89
  629. data/rspec-support/upstream/script/legacy_setup.sh +20 -0
  630. data/rspec-support/upstream/script/predicate_functions.sh +162 -0
  631. data/rspec-support/upstream/script/run_build +14 -9
  632. data/rspec-support/upstream/script/run_rubocop +14 -0
  633. data/rspec-support/upstream/script/update_rubygems_and_install_bundler +20 -0
  634. data/stubs/{diff/lcs/block.rb → coderay.rb} +0 -0
  635. data/stubs/{diff/lcs/callbacks.rb → drb/acl.rb} +0 -0
  636. data/stubs/{diff/lcs/change.rb → erb/version.rb} +0 -0
  637. data/stubs/{diff/lcs/hunk.rb → open3.rb} +0 -0
  638. data/stubs/{diff/lcs/internals.rb → psych.rb} +0 -0
  639. data/stubs/{optparse.rb → ripper.rb} +0 -0
  640. data/stubs/{prettyprint.rb → thread_order.rb} +0 -0
  641. data/tasks/testing.rake +7 -3
  642. metadata +270 -61
  643. data/gemfiles/.bundle/config +0 -2
  644. data/gemfiles/opal_0.11.gemfile +0 -14
  645. data/gemfiles/opal_master.gemfile +0 -14
  646. data/lib-opal/opal/rspec/async/core_ext.rb +0 -23
  647. data/lib-opal/opal/rspec/async/legacy.rb +0 -49
  648. data/lib-opal/opal/rspec/fixes/rspec/caller_filter.rb +0 -6
  649. data/lib-opal/opal/rspec/fixes/rspec/core/example.rb +0 -20
  650. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +0 -20
  651. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +0 -11
  652. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +0 -15
  653. data/lib-opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +0 -15
  654. data/lib-opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +0 -20
  655. data/lib-opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +0 -21
  656. data/lib-opal/opal/rspec/fixes/rspec/core/warnings.rb +0 -27
  657. data/lib-opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +0 -21
  658. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +0 -10
  659. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +0 -15
  660. data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +0 -21
  661. data/lib-opal/opal/rspec/fixes/rspec/matchers/pretty.rb +0 -15
  662. data/lib-opal/opal/rspec/fixes/rspec/mocks/space.rb +0 -41
  663. data/lib-opal/opal/rspec/fixes/rspec/mocks/test_double.rb +0 -39
  664. data/lib-opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +0 -29
  665. data/lib-opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +0 -7
  666. data/lib-opal/opal/rspec/fixes/rspec/support/spec/stderr_splitter.rb +0 -13
  667. data/lib-opal/opal/rspec/fixes/rspec/support/spec.rb +0 -1
  668. data/lib-opal/opal/rspec/fixes/rspec/support/warnings.rb +0 -16
  669. data/rspec/upstream/License.txt +0 -24
  670. data/rspec-core/upstream/.travis.yml +0 -35
  671. data/rspec-core/upstream/benchmarks/sort_by_v_shuffle.rb +0 -83
  672. data/rspec-core/upstream/features/Upgrade.md +0 -352
  673. data/rspec-core/upstream/lib/rspec/core/backport_random.rb +0 -336
  674. data/rspec-expectations/upstream/.travis.yml +0 -35
  675. data/rspec-expectations/upstream/lib/rspec/matchers/pretty.rb +0 -77
  676. data/rspec-mocks/upstream/.travis.yml +0 -35
  677. data/rspec-support/upstream/.travis.yml +0 -35
  678. data/rspec-support/upstream/lib/rspec/support/os.rb +0 -18
  679. data/rspec-support/upstream/lib/rspec/support/spec/prevent_load_time_warnings.rb +0 -44
  680. data/rspec-support/upstream/lib/rspec/support/version_checker.rb +0 -53
  681. data/stubs/shellwords.rb +0 -0
  682. data/stubs/uri.rb +0 -0
  683. 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