opal-rspec 0.8.0.alpha3 → 1.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -3,13 +3,14 @@ RSpec::Support.require_rspec_support 'matcher_definition'
3
3
  RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) }
4
4
 
5
5
  %w[
6
- pretty
6
+ english_phrasing
7
7
  composable
8
8
  built_in
9
9
  generated_descriptions
10
10
  dsl
11
11
  matcher_delegator
12
12
  aliased_matcher
13
+ expecteds_for_multiple_diffs
13
14
  ].each { |file| RSpec::Support.require_rspec_matchers(file) }
14
15
 
15
16
  # RSpec's top level namespace. All of rspec-expectations is contained
@@ -35,14 +36,14 @@ module RSpec
35
36
  # expect([]).to be_empty # => [].empty?() | passes
36
37
  # expect([]).not_to be_empty # => [].empty?() | fails
37
38
  #
38
- # In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_"
39
+ # In addition to prefixing the predicate matchers with "be_", you can also use "be_a_"
39
40
  # and "be_an_", making your specs read much more naturally:
40
41
  #
41
42
  # expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes
42
43
  #
43
- # expect(3).to be_a_kind_of(Fixnum) # => 3.kind_of?(Numeric) | passes
44
- # expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes
45
- # expect(3).to be_an_instance_of(Fixnum) # => 3.instance_of?(Fixnum) | passes
44
+ # expect(3).to be_a_kind_of(Integer) # => 3.kind_of?(Numeric) | passes
45
+ # expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes
46
+ # expect(3).to be_an_instance_of(Integer) # => 3.instance_of?(Integer) | passes
46
47
  # expect(3).not_to be_an_instance_of(Numeric) # => 3.instance_of?(Numeric) | fails
47
48
  #
48
49
  # RSpec will also create custom matchers for predicates like `has_key?`. To
@@ -61,6 +62,26 @@ module RSpec
61
62
  # RSpec::Matchers.alias_matcher :a_user_who_is_an_admin, :be_an_admin
62
63
  # expect(user_list).to include(a_user_who_is_an_admin)
63
64
  #
65
+ # ## Alias Matchers
66
+ #
67
+ # With {RSpec::Matchers.alias_matcher}, you can easily create an
68
+ # alternate name for a given matcher.
69
+ #
70
+ # The description will also change according to the new name:
71
+ #
72
+ # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to
73
+ # sum_to(3).description # => "sum to 3"
74
+ # a_list_that_sums_to(3).description # => "a list that sums to 3"
75
+ #
76
+ # or you can specify a custom description like this:
77
+ #
78
+ # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description|
79
+ # description.sub("be sorted by", "a list sorted by")
80
+ # end
81
+ #
82
+ # be_sorted_by(:age).description # => "be sorted by age"
83
+ # a_list_sorted_by(:age).description # => "a list sorted by age"
84
+ #
64
85
  # ## Custom Matchers
65
86
  #
66
87
  # When you find that none of the stock matchers provide a natural feeling
@@ -201,78 +222,88 @@ module RSpec
201
222
  # expressions, and also uses the noun-phrase wording in the matcher's `description`,
202
223
  # for readable failure messages. You can alias your custom matchers in similar fashion
203
224
  # using {RSpec::Matchers.alias_matcher}.
204
- module Matchers
225
+ #
226
+ # ## Negated Matchers
227
+ #
228
+ # Sometimes if you want to test for the opposite using a more descriptive name
229
+ # instead of using `not_to`, you can use {RSpec::Matchers.define_negated_matcher}:
230
+ #
231
+ # RSpec::Matchers.define_negated_matcher :exclude, :include
232
+ # include(1, 2).description # => "include 1 and 2"
233
+ # exclude(1, 2).description # => "exclude 1 and 2"
234
+ #
235
+ # While the most obvious negated form may be to add a `not_` prefix,
236
+ # the failure messages you get with that form can be confusing (e.g.
237
+ # "expected [actual] to not [verb], but did not"). We've found it works
238
+ # best to find a more positive name for the negated form, such as
239
+ # `avoid_changing` rather than `not_change`.
240
+ #
241
+ module Matchers # rubocop:disable Metrics/ModuleLength
242
+ extend ::RSpec::Matchers::DSL
243
+
244
+ # @!macro [attach] alias_matcher
245
+ # @!parse
246
+ # alias $1 $2
247
+ # @!visibility private
248
+ # We define this override here so we can attach a YARD macro to it.
249
+ # It ensures that our docs list all the matcher aliases.
250
+ def self.alias_matcher(*args, &block)
251
+ super(*args, &block)
252
+ end
253
+
254
+ # @!method self.alias_matcher(new_name, old_name, options={}, &description_override)
255
+ # Extended from {RSpec::Matchers::DSL#alias_matcher}.
256
+
257
+ # @!method self.define(name, &declarations)
258
+ # Extended from {RSpec::Matchers::DSL#define}.
259
+
260
+ # @!method self.define_negated_matcher(negated_name, base_name, &description_override)
261
+ # Extended from {RSpec::Matchers::DSL#define_negated_matcher}.
262
+
205
263
  # @method expect
206
264
  # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an
207
265
  # `ExpectationTarget`.
208
266
  # @example
209
267
  # expect(actual).to eq(expected)
210
268
  # expect(actual).not_to eq(expected)
211
- # @return [ExpectationTarget]
212
- # @see ExpectationTarget#to
213
- # @see ExpectationTarget#not_to
269
+ # @return [Expectations::ExpectationTarget]
270
+ # @see Expectations::ExpectationTarget#to
271
+ # @see Expectations::ExpectationTarget#not_to
214
272
 
215
- # Defines a matcher alias. The returned matcher's `description` will be overriden
216
- # to reflect the phrasing of the new name, which will be used in failure messages
217
- # when passed as an argument to another matcher in a composed matcher expression.
218
- #
219
- # @param new_name [Symbol] the new name for the matcher
220
- # @param old_name [Symbol] the original name for the matcher
221
- # @param options [Hash] options for the aliased matcher
222
- # @option options [Class] :klass the ruby class to use as the decorator. (Not normally used).
223
- # @yield [String] optional block that, when given is used to define the overriden
224
- # description. The yielded arg is the original description. If no block is
225
- # provided, a default description override is used based on the old and
226
- # new names.
227
- #
228
- # @example
229
- #
230
- # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to
231
- # sum_to(3).description # => "sum to 3"
232
- # a_list_that_sums_to(3).description # => "a list that sums to 3"
273
+ # Allows multiple expectations in the provided block to fail, and then
274
+ # aggregates them into a single exception, rather than aborting on the
275
+ # first expectation failure like normal. This allows you to see all
276
+ # failures from an entire set of expectations without splitting each
277
+ # off into its own example (which may slow things down if the example
278
+ # setup is expensive).
279
+ #
280
+ # @param label [String] label for this aggregation block, which will be
281
+ # included in the aggregated exception message.
282
+ # @param metadata [Hash] additional metadata about this failure aggregation
283
+ # block. If multiple expectations fail, it will be exposed from the
284
+ # {Expectations::MultipleExpectationsNotMetError} exception. Mostly
285
+ # intended for internal RSpec use but you can use it as well.
286
+ # @yield Block containing as many expectation as you want. The block is
287
+ # simply yielded to, so you can trust that anything that works outside
288
+ # the block should work within it.
289
+ # @raise [Expectations::MultipleExpectationsNotMetError] raised when
290
+ # multiple expectations fail.
291
+ # @raise [Expectations::ExpectationNotMetError] raised when a single
292
+ # expectation fails.
293
+ # @raise [Exception] other sorts of exceptions will be raised as normal.
233
294
  #
234
295
  # @example
235
- #
236
- # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description|
237
- # description.sub("be sorted by", "a list sorted by")
296
+ # aggregate_failures("verifying response") do
297
+ # expect(response.status).to eq(200)
298
+ # expect(response.headers).to include("Content-Type" => "text/plain")
299
+ # expect(response.body).to include("Success")
238
300
  # end
239
301
  #
240
- # be_sorted_by(:age).description # => "be sorted by age"
241
- # a_list_sorted_by(:age).description # => "a list sorted by age"
242
- #
243
- # @!macro [attach] alias_matcher
244
- # @!parse
245
- # alias $1 $2
246
- def self.alias_matcher(new_name, old_name, options={}, &description_override)
247
- description_override ||= lambda do |old_desc|
248
- old_desc.gsub(Pretty.split_words(old_name), Pretty.split_words(new_name))
249
- end
250
- klass = options.fetch(:klass) { AliasedMatcher }
251
-
252
- define_method(new_name) do |*args, &block|
253
- matcher = __send__(old_name, *args, &block)
254
- klass.new(matcher, description_override)
255
- end
256
- end
257
-
258
- # Defines a negated matcher. The returned matcher's `description` and `failure_message`
259
- # will be overriden to reflect the phrasing of the new name, and the match logic will
260
- # be based on the original matcher but negated.
261
- #
262
- # @param negated_name [Symbol] the name for the negated matcher
263
- # @param base_name [Symbol] the name of the original matcher that will be negated
264
- # @yield [String] optional block that, when given is used to define the overriden
265
- # description. The yielded arg is the original description. If no block is
266
- # provided, a default description override is used based on the old and
267
- # new names.
268
- #
269
- # @example
270
- #
271
- # RSpec::Matchers.define_negated_matcher :a_value_not_between, :a_value_between
272
- # a_value_between(3, 5).description # => "a value between 3 and 5"
273
- # a_value_not_between(3, 5).description # => "a value not between 3 and 5"
274
- def self.define_negated_matcher(negated_name, base_name, &description_override)
275
- alias_matcher(negated_name, base_name, :klass => AliasedNegatedMatcher, &description_override)
302
+ # @note The implementation of this feature uses a thread-local variable,
303
+ # which means that if you have an expectation failure in another thread,
304
+ # it'll abort like normal.
305
+ def aggregate_failures(label=nil, metadata={}, &block)
306
+ Expectations::FailureAggregator.new(label, metadata).aggregate(&block)
276
307
  end
277
308
 
278
309
  # Passes if actual is truthy (anything but false or nil)
@@ -285,9 +316,9 @@ module RSpec
285
316
  def be_falsey
286
317
  BuiltIn::BeFalsey.new
287
318
  end
288
- alias_matcher :be_falsy, :be_falsey
319
+ alias_matcher :be_falsy, :be_falsey
289
320
  alias_matcher :a_falsey_value, :be_falsey
290
- alias_matcher :a_falsy_value, :be_falsey
321
+ alias_matcher :a_falsy_value, :be_falsey
291
322
 
292
323
  # Passes if actual is nil
293
324
  def be_nil
@@ -329,8 +360,7 @@ module RSpec
329
360
  # Passes if actual.instance_of?(expected)
330
361
  #
331
362
  # @example
332
- #
333
- # expect(5).to be_an_instance_of(Fixnum)
363
+ # expect(5).to be_an_instance_of(Integer)
334
364
  # expect(5).not_to be_an_instance_of(Numeric)
335
365
  # expect(5).not_to be_an_instance_of(Float)
336
366
  def be_an_instance_of(expected)
@@ -342,15 +372,14 @@ module RSpec
342
372
  # Passes if actual.kind_of?(expected)
343
373
  #
344
374
  # @example
345
- #
346
- # expect(5).to be_a_kind_of(Fixnum)
375
+ # expect(5).to be_a_kind_of(Integer)
347
376
  # expect(5).to be_a_kind_of(Numeric)
348
377
  # expect(5).not_to be_a_kind_of(Float)
349
378
  def be_a_kind_of(expected)
350
379
  BuiltIn::BeAKindOf.new(expected)
351
380
  end
352
381
  alias_method :be_kind_of, :be_a_kind_of
353
- alias_matcher :a_kind_of, :be_a_kind_of
382
+ alias_matcher :a_kind_of, :be_a_kind_of
354
383
 
355
384
  # Passes if actual.between?(min, max). Works with any Comparable object,
356
385
  # including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer,
@@ -360,7 +389,6 @@ module RSpec
360
389
  # but you can make it `exclusive` by chaining that off the matcher.
361
390
  #
362
391
  # @example
363
- #
364
392
  # expect(5).to be_between(1, 10)
365
393
  # expect(11).not_to be_between(1, 10)
366
394
  # expect(10).not_to be_between(1, 10).exclusive
@@ -372,14 +400,13 @@ module RSpec
372
400
  # Passes if actual == expected +/- delta
373
401
  #
374
402
  # @example
375
- #
376
403
  # expect(result).to be_within(0.5).of(3.0)
377
404
  # expect(result).not_to be_within(0.5).of(3.0)
378
405
  def be_within(delta)
379
406
  BuiltIn::BeWithin.new(delta)
380
407
  end
381
408
  alias_matcher :a_value_within, :be_within
382
- alias_matcher :within, :be_within
409
+ alias_matcher :within, :be_within
383
410
 
384
411
  # Applied to a proc, specifies that its execution will cause some value to
385
412
  # change.
@@ -407,7 +434,6 @@ module RSpec
407
434
  # * `by_at_most`
408
435
  #
409
436
  # @example
410
- #
411
437
  # expect {
412
438
  # team.add_player(player)
413
439
  # }.to change(roster, :count)
@@ -454,7 +480,10 @@ module RSpec
454
480
  # == Notes
455
481
  #
456
482
  # Evaluates `receiver.message` or `block` before and after it
457
- # evaluates the block passed to `expect`.
483
+ # evaluates the block passed to `expect`. If the value is the same
484
+ # object, its before/after `hash` value is used to see if it has changed.
485
+ # Therefore, your object needs to properly implement `hash` to work correctly
486
+ # with this matcher.
458
487
  #
459
488
  # `expect( ... ).not_to change` supports the form that specifies `from`
460
489
  # (which specifies what you expect the starting, unchanged value to be)
@@ -463,8 +492,8 @@ module RSpec
463
492
  def change(receiver=nil, message=nil, &block)
464
493
  BuiltIn::Change.new(receiver, message, &block)
465
494
  end
466
- alias_matcher :a_block_changing, :change
467
- alias_matcher :changing, :change
495
+ alias_matcher :a_block_changing, :change
496
+ alias_matcher :changing, :change
468
497
 
469
498
  # Passes if actual contains all of the expected regardless of order.
470
499
  # This works for collections. Pass in multiple args and it will only
@@ -474,7 +503,6 @@ module RSpec
474
503
  # but `=~` is not supported with `expect`.
475
504
  #
476
505
  # @example
477
- #
478
506
  # expect([1, 2, 3]).to contain_exactly(1, 2, 3)
479
507
  # expect([1, 2, 3]).to contain_exactly(1, 3, 2)
480
508
  #
@@ -483,7 +511,7 @@ module RSpec
483
511
  BuiltIn::ContainExactly.new(items)
484
512
  end
485
513
  alias_matcher :a_collection_containing_exactly, :contain_exactly
486
- alias_matcher :containing_exactly, :contain_exactly
514
+ alias_matcher :containing_exactly, :contain_exactly
487
515
 
488
516
  # Passes if actual covers expected. This works for
489
517
  # Ranges. You can also pass in multiple args
@@ -501,7 +529,7 @@ module RSpec
501
529
  BuiltIn::Cover.new(*values)
502
530
  end
503
531
  alias_matcher :a_range_covering, :cover
504
- alias_matcher :covering, :cover
532
+ alias_matcher :covering, :cover
505
533
 
506
534
  # Matches if the actual value ends with the expected value(s). In the case
507
535
  # of a string, matches against the last `expected.length` characters of the
@@ -509,7 +537,6 @@ module RSpec
509
537
  # `expected.length` elements of the actual array.
510
538
  #
511
539
  # @example
512
- #
513
540
  # expect("this string").to end_with "string"
514
541
  # expect([0, 1, 2, 3, 4]).to end_with 4
515
542
  # expect([0, 2, 3, 4, 4]).to end_with 3, 4
@@ -517,8 +544,8 @@ module RSpec
517
544
  BuiltIn::EndWith.new(*expected)
518
545
  end
519
546
  alias_matcher :a_collection_ending_with, :end_with
520
- alias_matcher :a_string_ending_with, :end_with
521
- alias_matcher :ending_with, :end_with
547
+ alias_matcher :a_string_ending_with, :end_with
548
+ alias_matcher :ending_with, :end_with
522
549
 
523
550
  # Passes if <tt>actual == expected</tt>.
524
551
  #
@@ -526,14 +553,13 @@ module RSpec
526
553
  # information about equality in Ruby.
527
554
  #
528
555
  # @example
529
- #
530
556
  # expect(5).to eq(5)
531
557
  # expect(5).not_to eq(3)
532
558
  def eq(expected)
533
559
  BuiltIn::Eq.new(expected)
534
560
  end
535
561
  alias_matcher :an_object_eq_to, :eq
536
- alias_matcher :eq_to, :eq
562
+ alias_matcher :eq_to, :eq
537
563
 
538
564
  # Passes if `actual.eql?(expected)`
539
565
  #
@@ -541,14 +567,13 @@ module RSpec
541
567
  # information about equality in Ruby.
542
568
  #
543
569
  # @example
544
- #
545
570
  # expect(5).to eql(5)
546
571
  # expect(5).not_to eql(3)
547
572
  def eql(expected)
548
573
  BuiltIn::Eql.new(expected)
549
574
  end
550
575
  alias_matcher :an_object_eql_to, :eql
551
- alias_matcher :eql_to, :eql
576
+ alias_matcher :eql_to, :eql
552
577
 
553
578
  # Passes if <tt>actual.equal?(expected)</tt> (object identity).
554
579
  #
@@ -556,14 +581,13 @@ module RSpec
556
581
  # information about equality in Ruby.
557
582
  #
558
583
  # @example
559
- #
560
- # expect(5).to equal(5) # Fixnums are equal
584
+ # expect(5).to equal(5) # Integers are equal
561
585
  # expect("5").not_to equal("5") # Strings that look the same are not the same object
562
586
  def equal(expected)
563
587
  BuiltIn::Equal.new(expected)
564
588
  end
565
589
  alias_matcher :an_object_equal_to, :equal
566
- alias_matcher :equal_to, :equal
590
+ alias_matcher :equal_to, :equal
567
591
 
568
592
  # Passes if `actual.exist?` or `actual.exists?`
569
593
  #
@@ -573,13 +597,12 @@ module RSpec
573
597
  BuiltIn::Exist.new(*args)
574
598
  end
575
599
  alias_matcher :an_object_existing, :exist
576
- alias_matcher :existing, :exist
600
+ alias_matcher :existing, :exist
577
601
 
578
602
  # Passes if actual's attribute values match the expected attributes hash.
579
603
  # This works no matter how you define your attribute readers.
580
604
  #
581
605
  # @example
582
- #
583
606
  # Person = Struct.new(:name, :age)
584
607
  # person = Person.new("Bob", 32)
585
608
  #
@@ -589,38 +612,42 @@ module RSpec
589
612
  # @note It will fail if actual doesn't respond to any of the expected attributes.
590
613
  #
591
614
  # @example
592
- #
593
615
  # expect(person).to have_attributes(:color => "red")
594
616
  def have_attributes(expected)
595
617
  BuiltIn::HaveAttributes.new(expected)
596
618
  end
597
619
  alias_matcher :an_object_having_attributes, :have_attributes
620
+ alias_matcher :having_attributes, :have_attributes
598
621
 
599
622
  # Passes if actual includes expected. This works for
600
623
  # collections and Strings. You can also pass in multiple args
601
624
  # and it will only pass if all args are found in collection.
602
625
  #
603
626
  # @example
604
- #
605
627
  # expect([1,2,3]).to include(3)
606
628
  # expect([1,2,3]).to include(2,3)
607
629
  # expect([1,2,3]).to include(2,3,4) # fails
608
630
  # expect([1,2,3]).not_to include(4)
609
631
  # expect("spread").to include("read")
610
632
  # expect("spread").not_to include("red")
633
+ # expect(:a => 1, :b => 2).to include(:a)
634
+ # expect(:a => 1, :b => 2).to include(:a, :b)
635
+ # expect(:a => 1, :b => 2).to include(:a => 1)
636
+ # expect(:a => 1, :b => 2).to include(:b => 2, :a => 1)
637
+ # expect(:a => 1, :b => 2).to include(:c) # fails
638
+ # expect(:a => 1, :b => 2).not_to include(:a => 2)
611
639
  def include(*expected)
612
640
  BuiltIn::Include.new(*expected)
613
641
  end
614
642
  alias_matcher :a_collection_including, :include
615
- alias_matcher :a_string_including, :include
616
- alias_matcher :a_hash_including, :include
617
- alias_matcher :including, :include
643
+ alias_matcher :a_string_including, :include
644
+ alias_matcher :a_hash_including, :include
645
+ alias_matcher :including, :include
618
646
 
619
- # Passes if actual all expected objects pass. This works for
620
- # any enumerable object.
647
+ # Passes if the provided matcher passes when checked against all
648
+ # elements of the collection.
621
649
  #
622
650
  # @example
623
- #
624
651
  # expect([1, 3, 5]).to all be_odd
625
652
  # expect([1, 3, 6]).to all be_odd # fails
626
653
  #
@@ -642,12 +669,10 @@ module RSpec
642
669
  # pair of elements.
643
670
  #
644
671
  # @example
645
- #
646
672
  # expect(email).to match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
647
673
  # expect(email).to match("@example.com")
648
674
  #
649
675
  # @example
650
- #
651
676
  # hash = {
652
677
  # :a => {
653
678
  # :b => ["foo", 5],
@@ -659,7 +684,7 @@ module RSpec
659
684
  # :a => {
660
685
  # :b => a_collection_containing_exactly(
661
686
  # a_string_starting_with("f"),
662
- # an_instance_of(Fixnum)
687
+ # an_instance_of(Integer)
663
688
  # ),
664
689
  # :c => { :d => (a_value < 3) }
665
690
  # }
@@ -672,17 +697,16 @@ module RSpec
672
697
  def match(expected)
673
698
  BuiltIn::Match.new(expected)
674
699
  end
675
- alias_matcher :match_regex, :match
700
+ alias_matcher :match_regex, :match
676
701
  alias_matcher :an_object_matching, :match
677
- alias_matcher :a_string_matching, :match
678
- alias_matcher :matching, :match
702
+ alias_matcher :a_string_matching, :match
703
+ alias_matcher :matching, :match
679
704
 
680
705
  # An alternate form of `contain_exactly` that accepts
681
706
  # the expected contents as a single array arg rather
682
707
  # that splatted out as individual items.
683
708
  #
684
709
  # @example
685
- #
686
710
  # expect(results).to contain_exactly(1, 2)
687
711
  # # is identical to:
688
712
  # expect(results).to match_array([1, 2])
@@ -691,13 +715,19 @@ module RSpec
691
715
  def match_array(items)
692
716
  contain_exactly(*items)
693
717
  end
718
+ alias_matcher :an_array_matching, :match_array do |desc|
719
+ desc.sub("contain exactly", "an array containing exactly")
720
+ end
694
721
 
695
722
  # With no arg, passes if the block outputs `to_stdout` or `to_stderr`.
696
- # With a string, passes if the blocks outputs that specific string `to_stdout` or `to_stderr`.
697
- # With a regexp or matcher, passes if the blocks outputs a string `to_stdout` or `to_stderr` that matches.
723
+ # With a string, passes if the block outputs that specific string `to_stdout` or `to_stderr`.
724
+ # With a regexp or matcher, passes if the block outputs a string `to_stdout` or `to_stderr` that matches.
698
725
  #
699
- # @example
726
+ # To capture output from any spawned subprocess as well, use `to_stdout_from_any_process` or
727
+ # `to_stderr_from_any_process`. Output from any process that inherits the main process's corresponding
728
+ # standard stream will be captured.
700
729
  #
730
+ # @example
701
731
  # expect { print 'foo' }.to output.to_stdout
702
732
  # expect { print 'foo' }.to output('foo').to_stdout
703
733
  # expect { print 'foo' }.to output(/foo/).to_stdout
@@ -710,10 +740,15 @@ module RSpec
710
740
  #
711
741
  # expect { do_something }.to_not output.to_stderr
712
742
  #
713
- # @note This matcher works by temporarily replacing `$stdout` or `$stderr`,
714
- # so it's not able to intercept stream output that explicitly uses `STDOUT`/`STDERR`
743
+ # expect { system('echo foo') }.to output("foo\n").to_stdout_from_any_process
744
+ # expect { system('echo foo', out: :err) }.to output("foo\n").to_stderr_from_any_process
745
+ #
746
+ # @note `to_stdout` and `to_stderr` work by temporarily replacing `$stdout` or `$stderr`,
747
+ # so they're not able to intercept stream output that explicitly uses `STDOUT`/`STDERR`
715
748
  # or that uses a reference to `$stdout`/`$stderr` that was stored before the
716
- # matcher is used.
749
+ # matcher was used.
750
+ # @note `to_stdout_from_any_process` and `to_stderr_from_any_process` use Tempfiles, and
751
+ # are thus significantly (~30x) slower than `to_stdout` and `to_stderr`.
717
752
  def output(expected=nil)
718
753
  BuiltIn::Output.new(expected)
719
754
  end
@@ -721,29 +756,30 @@ module RSpec
721
756
 
722
757
  # With no args, matches if any error is raised.
723
758
  # With a named error, matches only if that specific error is raised.
724
- # With a named error and messsage specified as a String, matches only if both match.
725
- # With a named error and messsage specified as a Regexp, matches only if both match.
759
+ # With a named error and message specified as a String, matches only if both match.
760
+ # With a named error and message specified as a Regexp, matches only if both match.
726
761
  # Pass an optional block to perform extra verifications on the exception matched
727
762
  #
728
763
  # @example
729
- #
730
764
  # expect { do_something_risky }.to raise_error
731
765
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError)
732
766
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 }
767
+ # expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 }
733
768
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky")
734
769
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/)
770
+ # expect { do_something_risky }.to raise_error("that was too risky")
735
771
  #
736
772
  # expect { do_something_risky }.not_to raise_error
737
- def raise_error(error=Exception, message=nil, &block)
773
+ def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block)
738
774
  BuiltIn::RaiseError.new(error, message, &block)
739
775
  end
740
- alias_method :raise_exception, :raise_error
776
+ alias_method :raise_exception, :raise_error
741
777
 
742
- alias_matcher :a_block_raising, :raise_error do |desc|
778
+ alias_matcher :a_block_raising, :raise_error do |desc|
743
779
  desc.sub("raise", "a block raising")
744
780
  end
745
781
 
746
- alias_matcher :raising, :raise_error do |desc|
782
+ alias_matcher :raising, :raise_error do |desc|
747
783
  desc.sub("raise", "raising")
748
784
  end
749
785
 
@@ -751,14 +787,13 @@ module RSpec
751
787
  # provided. Names can be Strings or Symbols.
752
788
  #
753
789
  # @example
754
- #
755
790
  # expect("string").to respond_to(:length)
756
791
  #
757
792
  def respond_to(*names)
758
793
  BuiltIn::RespondTo.new(*names)
759
794
  end
760
795
  alias_matcher :an_object_responding_to, :respond_to
761
- alias_matcher :responding_to, :respond_to
796
+ alias_matcher :responding_to, :respond_to
762
797
 
763
798
  # Passes if the submitted block returns true. Yields target to the
764
799
  # block.
@@ -770,14 +805,16 @@ module RSpec
770
805
  # If you do find yourself in such a situation, you could always write
771
806
  # a custom matcher, which would likely make your specs more expressive.
772
807
  #
773
- # @example
808
+ # @param description [String] optional description to be used for this matcher.
774
809
  #
810
+ # @example
775
811
  # expect(5).to satisfy { |n| n > 3 }
776
- def satisfy(&block)
777
- BuiltIn::Satisfy.new(&block)
812
+ # expect(5).to satisfy("be greater than 3") { |n| n > 3 }
813
+ def satisfy(description=nil, &block)
814
+ BuiltIn::Satisfy.new(description, &block)
778
815
  end
779
816
  alias_matcher :an_object_satisfying, :satisfy
780
- alias_matcher :satisfying, :satisfy
817
+ alias_matcher :satisfying, :satisfy
781
818
 
782
819
  # Matches if the actual value starts with the expected value(s). In the
783
820
  # case of a string, matches against the first `expected.length` characters
@@ -785,7 +822,6 @@ module RSpec
785
822
  # `expected.length` elements of the actual array.
786
823
  #
787
824
  # @example
788
- #
789
825
  # expect("this string").to start_with "this s"
790
826
  # expect([0, 1, 2, 3, 4]).to start_with 0
791
827
  # expect([0, 2, 3, 4, 4]).to start_with 0, 1
@@ -793,8 +829,8 @@ module RSpec
793
829
  BuiltIn::StartWith.new(*expected)
794
830
  end
795
831
  alias_matcher :a_collection_starting_with, :start_with
796
- alias_matcher :a_string_starting_with, :start_with
797
- alias_matcher :starting_with, :start_with
832
+ alias_matcher :a_string_starting_with, :start_with
833
+ alias_matcher :starting_with, :start_with
798
834
 
799
835
  # Given no argument, matches if a proc throws any Symbol.
800
836
  #
@@ -804,7 +840,6 @@ module RSpec
804
840
  # specified Symbol with the specified arg.
805
841
  #
806
842
  # @example
807
- #
808
843
  # expect { do_something_risky }.to throw_symbol
809
844
  # expect { do_something_risky }.to throw_symbol(:that_was_risky)
810
845
  # expect { do_something_risky }.to throw_symbol(:that_was_risky, 'culprit')
@@ -820,7 +855,7 @@ module RSpec
820
855
  desc.sub("throw", "a block throwing")
821
856
  end
822
857
 
823
- alias_matcher :throwing, :throw_symbol do |desc|
858
+ alias_matcher :throwing, :throw_symbol do |desc|
824
859
  desc.sub("throw", "throwing")
825
860
  end
826
861
 
@@ -828,25 +863,21 @@ module RSpec
828
863
  # of whether or not arguments are yielded.
829
864
  #
830
865
  # @example
831
- #
832
866
  # expect { |b| 5.tap(&b) }.to yield_control
833
867
  # expect { |b| "a".to_sym(&b) }.not_to yield_control
834
868
  #
835
869
  # @note Your expect block must accept a parameter and pass it on to
836
870
  # the method-under-test as a block.
837
- # @note This matcher is not designed for use with methods that yield
838
- # multiple times.
839
871
  def yield_control
840
872
  BuiltIn::YieldControl.new
841
873
  end
842
- alias_matcher :a_block_yielding_control, :yield_control
843
- alias_matcher :yielding_control, :yield_control
874
+ alias_matcher :a_block_yielding_control, :yield_control
875
+ alias_matcher :yielding_control, :yield_control
844
876
 
845
877
  # Passes if the method called in the expect block yields with
846
878
  # no arguments. Fails if it does not yield, or yields with arguments.
847
879
  #
848
880
  # @example
849
- #
850
881
  # expect { |b| User.transaction(&b) }.to yield_with_no_args
851
882
  # expect { |b| 5.tap(&b) }.not_to yield_with_no_args # because it yields with `5`
852
883
  # expect { |b| "a".to_sym(&b) }.not_to yield_with_no_args # because it does not yield
@@ -858,8 +889,8 @@ module RSpec
858
889
  def yield_with_no_args
859
890
  BuiltIn::YieldWithNoArgs.new
860
891
  end
861
- alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
862
- alias_matcher :yielding_with_no_args, :yield_with_no_args
892
+ alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
893
+ alias_matcher :yielding_with_no_args, :yield_with_no_args
863
894
 
864
895
  # Given no arguments, matches if the method called in the expect
865
896
  # block yields with arguments (regardless of what they are or how
@@ -873,10 +904,9 @@ module RSpec
873
904
  # operator, the matcher will pass.
874
905
  #
875
906
  # @example
876
- #
877
907
  # expect { |b| 5.tap(&b) }.to yield_with_args # because #tap yields an arg
878
908
  # expect { |b| 5.tap(&b) }.to yield_with_args(5) # because 5 == 5
879
- # expect { |b| 5.tap(&b) }.to yield_with_args(Fixnum) # because Fixnum === 5
909
+ # expect { |b| 5.tap(&b) }.to yield_with_args(Integer) # because Integer === 5
880
910
  # expect { |b| File.open("f.txt", &b) }.to yield_with_args(/txt/) # because /txt/ === "f.txt"
881
911
  #
882
912
  # expect { |b| User.transaction(&b) }.not_to yield_with_args # because it yields no args
@@ -889,8 +919,8 @@ module RSpec
889
919
  def yield_with_args(*args)
890
920
  BuiltIn::YieldWithArgs.new(*args)
891
921
  end
892
- alias_matcher :a_block_yielding_with_args, :yield_with_args
893
- alias_matcher :yielding_with_args, :yield_with_args
922
+ alias_matcher :a_block_yielding_with_args, :yield_with_args
923
+ alias_matcher :yielding_with_args, :yield_with_args
894
924
 
895
925
  # Designed for use with methods that repeatedly yield (such as
896
926
  # iterators). Passes if the method called in the expect block yields
@@ -901,7 +931,6 @@ module RSpec
901
931
  # operator, the matcher will pass.
902
932
  #
903
933
  # @example
904
- #
905
934
  # expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3)
906
935
  # expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2])
907
936
  # expect { |b| [1, 2, 3].each(&b) }.not_to yield_successive_args(1, 2)
@@ -911,8 +940,8 @@ module RSpec
911
940
  def yield_successive_args(*args)
912
941
  BuiltIn::YieldSuccessiveArgs.new(*args)
913
942
  end
914
- alias_matcher :a_block_yielding_successive_args, :yield_successive_args
915
- alias_matcher :yielding_successive_args, :yield_successive_args
943
+ alias_matcher :a_block_yielding_successive_args, :yield_successive_args
944
+ alias_matcher :yielding_successive_args, :yield_successive_args
916
945
 
917
946
  # Delegates to {RSpec::Expectations.configuration}.
918
947
  # This is here because rspec-core's `expect_with` option
@@ -925,8 +954,9 @@ module RSpec
925
954
 
926
955
  private
927
956
 
928
- BE_PREDICATE_REGEX = /^(be_(?:an?_)?)(.*)/
957
+ BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/
929
958
  HAS_REGEX = /^(?:have_)(.*)/
959
+ DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX)
930
960
 
931
961
  def method_missing(method, *args, &block)
932
962
  case method.to_s
@@ -938,6 +968,21 @@ module RSpec
938
968
  super
939
969
  end
940
970
  end
971
+ ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
972
+
973
+ if RUBY_VERSION.to_f >= 1.9
974
+ def respond_to_missing?(method, *)
975
+ method =~ DYNAMIC_MATCHER_REGEX || super
976
+ end
977
+ else # for 1.8.7
978
+ # :nocov:
979
+ def respond_to?(method, *)
980
+ method = method.to_s
981
+ method =~ DYNAMIC_MATCHER_REGEX || super
982
+ end
983
+ public :respond_to?
984
+ # :nocov:
985
+ end
941
986
 
942
987
  # @api private
943
988
  def self.is_a_matcher?(obj)
@@ -963,5 +1008,37 @@ module RSpec
963
1008
  def self.is_a_describable_matcher?(obj)
964
1009
  is_a_matcher?(obj) && obj.respond_to?(:description)
965
1010
  end
1011
+
1012
+ class << self
1013
+ private
1014
+
1015
+ if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9'
1016
+ # Note that `included` doesn't work for this because it is triggered
1017
+ # _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
1018
+ # than _before_, like `append_features`. It's important we check this before
1019
+ # in order to find the cases where it was already previously included.
1020
+ # @api private
1021
+ def append_features(mod)
1022
+ return super if mod < self # `mod < self` indicates a re-inclusion.
1023
+
1024
+ subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self }
1025
+ return super unless subclasses.any?
1026
+
1027
+ subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor.
1028
+ subclasses = subclasses.map { |s| "`#{s}`" }.join(", ")
1029
+
1030
+ RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \
1031
+ "after previously being included in subclasses (#{subclasses}), " \
1032
+ "which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \
1033
+ "(https://redmine.ruby-lang.org/issues/3351). To work around this, " \
1034
+ "either upgrade to MRI 2.0+, include a dup of the module (e.g. " \
1035
+ "`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \
1036
+ "before it is included in subclasses (#{subclasses}). See " \
1037
+ "https://github.com/rspec/rspec-expectations/issues/814 for more info"
1038
+
1039
+ super
1040
+ end
1041
+ end
1042
+ end
966
1043
  end
967
1044
  end