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
@@ -7,7 +7,7 @@ module RSpec
7
7
  # In addition to metadata that is used internally, this also stores
8
8
  # user-supplied metadata, e.g.
9
9
  #
10
- # describe Something, :type => :ui do
10
+ # RSpec.describe Something, :type => :ui do
11
11
  # it "does something", :slow => true do
12
12
  # # ...
13
13
  # end
@@ -25,28 +25,51 @@ module RSpec
25
25
  # @see Configuration#filter_run_including
26
26
  # @see Configuration#filter_run_excluding
27
27
  module Metadata
28
+ # Matches strings either at the beginning of the input or prefixed with a
29
+ # whitespace, containing the current path, either postfixed with the
30
+ # separator, or at the end of the string. Match groups are the character
31
+ # before and the character after the string if any.
32
+ #
33
+ # http://rubular.com/r/fT0gmX6VJX
34
+ # http://rubular.com/r/duOrD4i3wb
35
+ # http://rubular.com/r/sbAMHFrOx1
36
+ def self.relative_path_regex
37
+ @relative_path_regex ||= /(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/
38
+ end
39
+
28
40
  # @api private
29
41
  #
30
42
  # @param line [String] current code line
31
43
  # @return [String] relative path to line
32
44
  def self.relative_path(line)
33
- # Matches strings either at the beginning of the input or prefixed with a whitespace,
34
- # containing the current path, either postfixed with the separator, or at the end of the string.
35
- # Match groups are the character before and the character after the string if any.
36
- #
37
- # http://rubular.com/r/fT0gmX6VJX
38
- # http://rubular.com/r/duOrD4i3wb
39
- # http://rubular.com/r/sbAMHFrOx1
40
- #
41
-
42
- regex = /(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/
43
-
44
- line = line.sub(regex, "\\1.\\2")
45
- line = line.sub(/\A([^:]+:\d+)$/, '\\1')
46
- return nil if line == '-e:1'
45
+ line = line.sub(relative_path_regex, "\\1.\\2".freeze)
46
+ line = line.sub(/\A([^:]+:\d+)$/, '\\1'.freeze)
47
+ return nil if line == '-e:1'.freeze
47
48
  line
48
49
  rescue SecurityError
50
+ # :nocov:
49
51
  nil
52
+ # :nocov:
53
+ end
54
+
55
+ # @private
56
+ # Iteratively walks up from the given metadata through all
57
+ # example group ancestors, yielding each metadata hash along the way.
58
+ def self.ascending(metadata)
59
+ yield metadata
60
+ return unless (group_metadata = metadata.fetch(:example_group) { metadata[:parent_example_group] })
61
+
62
+ loop do
63
+ yield group_metadata
64
+ break unless (group_metadata = group_metadata[:parent_example_group])
65
+ end
66
+ end
67
+
68
+ # @private
69
+ # Returns an enumerator that iteratively walks up the given metadata through all
70
+ # example group ancestors, yielding each metadata hash along the way.
71
+ def self.ascend(metadata)
72
+ enum_for(:ascending, metadata)
50
73
  end
51
74
 
52
75
  # @private
@@ -68,9 +91,24 @@ module RSpec
68
91
  end
69
92
 
70
93
  # @private
71
- def self.backtrace_from(block)
72
- return caller unless block.respond_to?(:source_location)
73
- [block.source_location.join(':')]
94
+ def self.deep_hash_dup(object)
95
+ return object.dup if Array === object
96
+ return object unless Hash === object
97
+
98
+ object.inject(object.dup) do |duplicate, (key, value)|
99
+ duplicate[key] = deep_hash_dup(value)
100
+ duplicate
101
+ end
102
+ end
103
+
104
+ # @private
105
+ def self.id_from(metadata)
106
+ "#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]"
107
+ end
108
+
109
+ # @private
110
+ def self.location_tuple_from(metadata)
111
+ [metadata[:absolute_file_path], metadata[:line_number]]
74
112
  end
75
113
 
76
114
  # @private
@@ -79,9 +117,10 @@ module RSpec
79
117
  class HashPopulator
80
118
  attr_reader :metadata, :user_metadata, :description_args, :block
81
119
 
82
- def initialize(metadata, user_metadata, description_args, block)
120
+ def initialize(metadata, user_metadata, index_provider, description_args, block)
83
121
  @metadata = metadata
84
122
  @user_metadata = user_metadata
123
+ @index_provider = index_provider
85
124
  @description_args = description_args
86
125
  @block = block
87
126
  end
@@ -89,7 +128,6 @@ module RSpec
89
128
  def populate
90
129
  ensure_valid_user_keys
91
130
 
92
- metadata[:execution_result] = Example::ExecutionResult.new
93
131
  metadata[:block] = block
94
132
  metadata[:description_args] = description_args
95
133
  metadata[:description] = build_description_from(*metadata[:description_args])
@@ -98,7 +136,6 @@ module RSpec
98
136
 
99
137
  populate_location_attributes
100
138
  metadata.update(user_metadata)
101
- RSpec.configuration.apply_derived_metadata_to(metadata)
102
139
  end
103
140
 
104
141
  private
@@ -114,10 +151,14 @@ module RSpec
114
151
  file_path_and_line_number_from(caller)
115
152
  end
116
153
 
117
- file_path = Metadata.relative_path(file_path)
118
- metadata[:file_path] = file_path
119
- metadata[:line_number] = line_number.to_i
120
- metadata[:location] = "#{file_path}:#{line_number}"
154
+ relative_file_path = Metadata.relative_path(file_path)
155
+ absolute_file_path = File.expand_path(relative_file_path)
156
+ metadata[:file_path] = relative_file_path
157
+ metadata[:line_number] = line_number.to_i
158
+ metadata[:location] = "#{relative_file_path}:#{line_number}"
159
+ metadata[:absolute_file_path] = absolute_file_path
160
+ metadata[:rerun_file_path] ||= relative_file_path
161
+ metadata[:scoped_id] = build_scoped_id_for(absolute_file_path)
121
162
  end
122
163
 
123
164
  def file_path_and_line_number_from(backtrace)
@@ -127,17 +168,24 @@ module RSpec
127
168
  end
128
169
 
129
170
  def description_separator(parent_part, child_part)
130
- if parent_part.is_a?(Module) && child_part =~ /^(#|::|\.)/
131
- ''
171
+ if parent_part.is_a?(Module) && /^(?:#|::|\.)/.match(child_part.to_s)
172
+ ''.freeze
132
173
  else
133
- ' '
174
+ ' '.freeze
134
175
  end
135
176
  end
136
177
 
137
178
  def build_description_from(parent_description=nil, my_description=nil)
138
179
  return parent_description.to_s unless my_description
180
+ return my_description.to_s if parent_description.to_s == ''
139
181
  separator = description_separator(parent_description, my_description)
140
- parent_description.to_s + separator + my_description.to_s
182
+ (parent_description.to_s + separator) << my_description.to_s
183
+ end
184
+
185
+ def build_scoped_id_for(file_path)
186
+ index = @index_provider.call(file_path).to_s
187
+ parent_scoped_id = metadata.fetch(:scoped_id) { return index }
188
+ "#{parent_scoped_id}:#{index}"
141
189
  end
142
190
 
143
191
  def ensure_valid_user_keys
@@ -163,17 +211,20 @@ module RSpec
163
211
 
164
212
  # @private
165
213
  class ExampleHash < HashPopulator
166
- def self.create(group_metadata, user_metadata, description, block)
214
+ def self.create(group_metadata, user_metadata, index_provider, description, block)
167
215
  example_metadata = group_metadata.dup
168
216
  group_metadata = Hash.new(&ExampleGroupHash.backwards_compatibility_default_proc do |hash|
169
217
  hash[:parent_example_group]
170
218
  end)
171
219
  group_metadata.update(example_metadata)
172
220
 
221
+ example_metadata[:execution_result] = Example::ExecutionResult.new
173
222
  example_metadata[:example_group] = group_metadata
223
+ example_metadata[:shared_group_inclusion_backtrace] = SharedExampleGroupInclusionStackFrame.current_backtrace
174
224
  example_metadata.delete(:parent_example_group)
175
225
 
176
- hash = new(example_metadata, user_metadata, [description].compact, block)
226
+ description_args = description.nil? ? [] : [description]
227
+ hash = new(example_metadata, user_metadata, index_provider, description_args, block)
177
228
  hash.populate
178
229
  hash.metadata
179
230
  end
@@ -194,7 +245,7 @@ module RSpec
194
245
 
195
246
  # @private
196
247
  class ExampleGroupHash < HashPopulator
197
- def self.create(parent_group_metadata, user_metadata, *args, &block)
248
+ def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block)
198
249
  group_metadata = hash_with_backwards_compatibility_default_proc
199
250
 
200
251
  if parent_group_metadata
@@ -202,7 +253,7 @@ module RSpec
202
253
  group_metadata[:parent_example_group] = parent_group_metadata
203
254
  end
204
255
 
205
- hash = new(group_metadata, user_metadata, args, block)
256
+ hash = new(group_metadata, user_metadata, example_group_index, args, block)
206
257
  hash.populate
207
258
  hash.metadata
208
259
  end
@@ -215,17 +266,19 @@ module RSpec
215
266
  Proc.new do |hash, key|
216
267
  case key
217
268
  when :example_group
218
- # We commonly get here when rspec-core is applying a previously configured
219
- # filter rule, such as when a gem configures:
269
+ # We commonly get here when rspec-core is applying a previously
270
+ # configured filter rule, such as when a gem configures:
220
271
  #
221
272
  # RSpec.configure do |c|
222
273
  # c.include MyGemHelpers, :example_group => { :file_path => /spec\/my_gem_specs/ }
223
274
  # end
224
275
  #
225
- # It's confusing for a user to get a deprecation at this point in the code, so instead
226
- # we issue a deprecation from the config APIs that take a metadata hash, and MetadataFilter
227
- # sets this thread local to silence the warning here since it would be so confusing.
228
- unless RSpec.thread_local_metadata[:silence_metadata_example_group_deprecations]
276
+ # It's confusing for a user to get a deprecation at this point in
277
+ # the code, so instead we issue a deprecation from the config APIs
278
+ # that take a metadata hash, and MetadataFilter sets this thread
279
+ # local to silence the warning here since it would be so
280
+ # confusing.
281
+ unless RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations]
229
282
  RSpec.deprecate("The `:example_group` key in an example group's metadata hash",
230
283
  :replacement => "the example group's hash directly for the " \
231
284
  "computed keys and `:parent_example_group` to access the parent " \
@@ -271,14 +324,21 @@ module RSpec
271
324
  # @private
272
325
  RESERVED_KEYS = [
273
326
  :description,
327
+ :description_args,
328
+ :described_class,
274
329
  :example_group,
275
330
  :parent_example_group,
276
331
  :execution_result,
332
+ :last_run_status,
277
333
  :file_path,
334
+ :absolute_file_path,
335
+ :rerun_file_path,
278
336
  :full_description,
279
337
  :line_number,
280
338
  :location,
281
- :block
339
+ :scoped_id,
340
+ :block,
341
+ :shared_group_inclusion_backtrace
282
342
  ]
283
343
  end
284
344
 
@@ -405,7 +465,8 @@ module RSpec
405
465
  # `metadata[:example_group][:described_class]` when you use
406
466
  # anonymous controller specs) such that changes are written
407
467
  # back to the top-level metadata hash.
408
- # * Exposes the parent group metadata as `[:example_group][:example_group]`.
468
+ # * Exposes the parent group metadata as
469
+ # `[:example_group][:example_group]`.
409
470
  class LegacyExampleGroupHash
410
471
  include HashImitatable
411
472
 
@@ -8,37 +8,33 @@ module RSpec
8
8
  module MetadataFilter
9
9
  class << self
10
10
  # @private
11
- def any_apply?(filters, metadata)
12
- filters.any? { |k, v| filter_applies?(k, v, metadata) }
11
+ def apply?(predicate, filters, metadata)
12
+ filters.__send__(predicate) { |k, v| filter_applies?(k, v, metadata) }
13
13
  end
14
14
 
15
15
  # @private
16
- def all_apply?(filters, metadata)
17
- filters.all? { |k, v| filter_applies?(k, v, metadata) }
16
+ def filter_applies?(key, filter_value, metadata)
17
+ silence_metadata_example_group_deprecations do
18
+ return location_filter_applies?(filter_value, metadata) if key == :locations
19
+ return id_filter_applies?(filter_value, metadata) if key == :ids
20
+ return filters_apply?(key, filter_value, metadata) if Hash === filter_value
21
+
22
+ meta_value = metadata.fetch(key) { return false }
23
+
24
+ return true if TrueClass === filter_value && meta_value
25
+ return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value
26
+ return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value
27
+
28
+ filter_value === meta_value || filter_value.to_s == meta_value.to_s
29
+ end
18
30
  end
19
31
 
20
32
  # @private
21
- def filter_applies?(key, value, metadata)
22
- silence_metadata_example_group_deprecations do
23
- return filter_applies_to_any_value?(key, value, metadata) if Array === metadata[key] && !(Proc === value)
24
- return location_filter_applies?(value, metadata) if key == :locations
25
- return filters_apply?(key, value, metadata) if Hash === value
26
-
27
- return false unless metadata.key?(key)
28
-
29
- case value
30
- when Regexp
31
- metadata[key] =~ value
32
- when Proc
33
- case value.arity
34
- when 0 then value.call
35
- when 2 then value.call(metadata[key], metadata)
36
- else value.call(metadata[key])
37
- end
38
- else
39
- metadata[key].to_s == value.to_s
40
- end
41
- end
33
+ def silence_metadata_example_group_deprecations
34
+ RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true
35
+ yield
36
+ ensure
37
+ RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations)
42
38
  end
43
39
 
44
40
  private
@@ -47,26 +43,31 @@ module RSpec
47
43
  metadata[key].any? { |v| filter_applies?(key, v, key => value) }
48
44
  end
49
45
 
50
- def location_filter_applies?(locations, metadata)
51
- # it ignores location filters for other files
52
- line_number = example_group_declaration_line(locations, metadata)
53
- line_number ? line_number_filter_applies?(line_number, metadata) : true
54
- end
46
+ def id_filter_applies?(rerun_paths_to_scoped_ids, metadata)
47
+ scoped_ids = rerun_paths_to_scoped_ids.fetch(metadata[:rerun_file_path]) { return false }
55
48
 
56
- def line_number_filter_applies?(line_numbers, metadata)
57
- preceding_declaration_lines = line_numbers.map { |n| RSpec.world.preceding_declaration_line(n) }
58
- !(relevant_line_numbers(metadata) & preceding_declaration_lines).empty?
49
+ Metadata.ascend(metadata).any? do |meta|
50
+ scoped_ids.include?(meta[:scoped_id])
51
+ end
59
52
  end
60
53
 
61
- def relevant_line_numbers(metadata)
62
- return [] unless metadata
63
- [metadata[:line_number]].compact + (relevant_line_numbers(parent_of metadata))
54
+ def location_filter_applies?(locations, metadata)
55
+ Metadata.ascend(metadata).any? do |meta|
56
+ file_path = meta[:absolute_file_path]
57
+ line_num = meta[:line_number]
58
+
59
+ locations[file_path].any? do |filter_line_num|
60
+ line_num == RSpec.world.preceding_declaration_line(file_path, filter_line_num)
61
+ end
62
+ end
64
63
  end
65
64
 
66
- def example_group_declaration_line(locations, metadata)
67
- parent = parent_of(metadata)
68
- return nil unless parent
69
- locations[File.expand_path(parent[:file_path])]
65
+ def proc_filter_applies?(key, proc, metadata)
66
+ case proc.arity
67
+ when 0 then proc.call
68
+ when 2 then proc.call(metadata[key], metadata)
69
+ else proc.call(metadata[key])
70
+ end
70
71
  end
71
72
 
72
73
  def filters_apply?(key, value, metadata)
@@ -74,20 +75,179 @@ module RSpec
74
75
  return false unless Hash === subhash || HashImitatable === subhash
75
76
  value.all? { |k, v| filter_applies?(k, v, subhash) }
76
77
  end
78
+ end
79
+ end
80
+
81
+ # Tracks a collection of filterable items (e.g. modules, hooks, etc)
82
+ # and provides an optimized API to get the applicable items for the
83
+ # metadata of an example or example group.
84
+ #
85
+ # There are two implementations, optimized for different uses.
86
+ # @private
87
+ module FilterableItemRepository
88
+ # This implementation is simple, and is optimized for frequent
89
+ # updates but rare queries. `append` and `prepend` do no extra
90
+ # processing, and no internal memoization is done, since this
91
+ # is not optimized for queries.
92
+ #
93
+ # This is ideal for use by a example or example group, which may
94
+ # be updated multiple times with globally configured hooks, etc,
95
+ # but will not be queried frequently by other examples or examle
96
+ # groups.
97
+ # @private
98
+ class UpdateOptimized
99
+ attr_reader :items_and_filters
100
+
101
+ def initialize(applies_predicate)
102
+ @applies_predicate = applies_predicate
103
+ @items_and_filters = []
104
+ end
105
+
106
+ def append(item, metadata)
107
+ @items_and_filters << [item, metadata]
108
+ end
109
+
110
+ def prepend(item, metadata)
111
+ @items_and_filters.unshift [item, metadata]
112
+ end
113
+
114
+ def delete(item, metadata)
115
+ @items_and_filters.delete [item, metadata]
116
+ end
117
+
118
+ def items_for(request_meta)
119
+ @items_and_filters.each_with_object([]) do |(item, item_meta), to_return|
120
+ to_return << item if item_meta.empty? ||
121
+ MetadataFilter.apply?(@applies_predicate, item_meta, request_meta)
122
+ end
123
+ end
124
+
125
+ unless [].respond_to?(:each_with_object) # For 1.8.7
126
+ # :nocov:
127
+ undef items_for
128
+ def items_for(request_meta)
129
+ @items_and_filters.inject([]) do |to_return, (item, item_meta)|
130
+ to_return << item if item_meta.empty? ||
131
+ MetadataFilter.apply?(@applies_predicate, item_meta, request_meta)
132
+ to_return
133
+ end
134
+ end
135
+ # :nocov:
136
+ end
137
+ end
138
+
139
+ # This implementation is much more complex, and is optimized for
140
+ # rare (or hopefully no) updates once the queries start. Updates
141
+ # incur a cost as it has to clear the memoization and keep track
142
+ # of applicable keys. Queries will be O(N) the first time an item
143
+ # is provided with a given set of applicable metadata; subsequent
144
+ # queries with items with the same set of applicable metadata will
145
+ # be O(1) due to internal memoization.
146
+ #
147
+ # This is ideal for use by config, where filterable items (e.g. hooks)
148
+ # are typically added at the start of the process (e.g. in `spec_helper`)
149
+ # and then repeatedly queried as example groups and examples are defined.
150
+ # @private
151
+ class QueryOptimized < UpdateOptimized
152
+ alias find_items_for items_for
153
+ private :find_items_for
77
154
 
78
- def parent_of(metadata)
79
- if metadata.key?(:example_group)
80
- metadata[:example_group]
155
+ def initialize(applies_predicate)
156
+ super
157
+ @applicable_keys = Set.new
158
+ @proc_keys = Set.new
159
+ @memoized_lookups = Hash.new do |hash, applicable_metadata|
160
+ hash[applicable_metadata] = find_items_for(applicable_metadata)
161
+ end
162
+ end
163
+
164
+ def append(item, metadata)
165
+ super
166
+ handle_mutation(metadata)
167
+ end
168
+
169
+ def prepend(item, metadata)
170
+ super
171
+ handle_mutation(metadata)
172
+ end
173
+
174
+ def delete(item, metadata)
175
+ super
176
+ reconstruct_caches
177
+ end
178
+
179
+ def items_for(metadata)
180
+ # The filtering of `metadata` to `applicable_metadata` is the key thing
181
+ # that makes the memoization actually useful in practice, since each
182
+ # example and example group have different metadata (e.g. location and
183
+ # description). By filtering to the metadata keys our items care about,
184
+ # we can ignore extra metadata keys that differ for each example/group.
185
+ # For example, given `config.include DBHelpers, :db`, example groups
186
+ # can be split into these two sets: those that are tagged with `:db` and those
187
+ # that are not. For each set, this method for the first group in the set is
188
+ # still an `O(N)` calculation, but all subsequent groups in the set will be
189
+ # constant time lookups when they call this method.
190
+ applicable_metadata = applicable_metadata_from(metadata)
191
+
192
+ if applicable_metadata.any? { |k, _| @proc_keys.include?(k) }
193
+ # It's unsafe to memoize lookups involving procs (since they can
194
+ # be non-deterministic), so we skip the memoization in this case.
195
+ find_items_for(applicable_metadata)
81
196
  else
82
- metadata[:parent_example_group]
197
+ @memoized_lookups[applicable_metadata]
83
198
  end
84
199
  end
85
200
 
86
- def silence_metadata_example_group_deprecations
87
- RSpec.thread_local_metadata[:silence_metadata_example_group_deprecations] = true
88
- yield
89
- ensure
90
- RSpec.thread_local_metadata.delete(:silence_metadata_example_group_deprecations)
201
+ private
202
+
203
+ def reconstruct_caches
204
+ @applicable_keys.clear
205
+ @proc_keys.clear
206
+ @items_and_filters.each do |_item, metadata|
207
+ handle_mutation(metadata)
208
+ end
209
+ end
210
+
211
+ def handle_mutation(metadata)
212
+ @applicable_keys.merge(metadata.keys)
213
+ @proc_keys.merge(proc_keys_from metadata)
214
+ @memoized_lookups.clear
215
+ end
216
+
217
+ def applicable_metadata_from(metadata)
218
+ MetadataFilter.silence_metadata_example_group_deprecations do
219
+ @applicable_keys.inject({}) do |hash, key|
220
+ # :example_group is treated special here because...
221
+ # - In RSpec 2, example groups had an `:example_group` key
222
+ # - In RSpec 3, that key is deprecated (it was confusing!).
223
+ # - The key is not technically present in an example group metadata hash
224
+ # (and thus would fail the `metadata.key?(key)` check) but a value
225
+ # is provided when accessed via the hash's `default_proc`
226
+ # - Thus, for backwards compatibility, we have to explicitly check
227
+ # for `:example_group` here if it is one of the keys being used to
228
+ # filter.
229
+ hash[key] = metadata[key] if metadata.key?(key) || key == :example_group
230
+ hash
231
+ end
232
+ end
233
+ end
234
+
235
+ def proc_keys_from(metadata)
236
+ metadata.each_with_object([]) do |(key, value), to_return|
237
+ to_return << key if Proc === value
238
+ end
239
+ end
240
+
241
+ unless [].respond_to?(:each_with_object) # For 1.8.7
242
+ # :nocov:
243
+ undef proc_keys_from
244
+ def proc_keys_from(metadata)
245
+ metadata.inject([]) do |to_return, (key, value)|
246
+ to_return << key if Proc === value
247
+ to_return
248
+ end
249
+ end
250
+ # :nocov:
91
251
  end
92
252
  end
93
253
  end
@@ -1,9 +1,9 @@
1
1
  begin
2
- # Only the minitest 5.x gem includes the minitest.rb and assertions.rb files
2
+ # Only the minitest 5.x gem includes the minitest.rb and assertions.rb files.
3
3
  require 'minitest'
4
4
  require 'minitest/assertions'
5
5
  rescue LoadError
6
- # We must be using Ruby Core's MiniTest or the Minitest gem 4.x
6
+ # We must be using Ruby Core's MiniTest or the Minitest gem 4.x.
7
7
  require 'minitest/unit'
8
8
  Minitest = MiniTest
9
9
  end
@@ -13,6 +13,9 @@ module RSpec
13
13
  # @private
14
14
  module MinitestAssertionsAdapter
15
15
  include ::Minitest::Assertions
16
+ # Need to forcefully include Pending after Minitest::Assertions
17
+ # to make sure our own #skip method beats Minitest's.
18
+ include ::RSpec::Core::Pending
16
19
 
17
20
  # Minitest 5.x requires this accessor to be available. See
18
21
  # https://github.com/seattlerb/minitest/blob/38f0a5fcbd9c37c3f80a3eaad4ba84d3fc9947a0/lib/minitest/assertions.rb#L8
@@ -15,7 +15,7 @@ module RSpec
15
15
  end
16
16
 
17
17
  def setup_mocks_for_rspec
18
- # No setup required
18
+ # No setup required.
19
19
  end
20
20
 
21
21
  def verify_mocks_for_rspec
@@ -2,22 +2,22 @@
2
2
  # hoops here.
3
3
  #
4
4
  # mocha >= '0.13.0':
5
- # require 'mocha/api' is required
6
- # require 'mocha/object' raises a LoadError b/c the file no longer exists
5
+ # require 'mocha/api' is required.
6
+ # require 'mocha/object' raises a LoadError b/c the file no longer exists.
7
7
  # mocha < '0.13.0', >= '0.9.7'
8
- # require 'mocha/api' is required
9
- # require 'mocha/object' is required
8
+ # require 'mocha/api' is required.
9
+ # require 'mocha/object' is required.
10
10
  # mocha < '0.9.7':
11
- # require 'mocha/api' raises a LoadError b/c the file does not yet exist
12
- # require 'mocha/standalone' is required
13
- # require 'mocha/object' is required
11
+ # require 'mocha/api' raises a LoadError b/c the file does not yet exist.
12
+ # require 'mocha/standalone' is required.
13
+ # require 'mocha/object' is required.
14
14
  begin
15
15
  require 'mocha/api'
16
16
 
17
17
  begin
18
18
  require 'mocha/object'
19
19
  rescue LoadError
20
- # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded
20
+ # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded.
21
21
  end
22
22
  rescue LoadError
23
23
  require 'mocha/standalone'