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
@@ -2,10 +2,12 @@ RSpec::Support.require_rspec_support 'recursive_const_methods'
2
2
 
3
3
  module RSpec
4
4
  module Core
5
+ # rubocop:disable Metrics/ClassLength
6
+
5
7
  # ExampleGroup and {Example} are the main structural elements of
6
- # rspec-core. Consider this example:
8
+ # rspec-core. Consider this example:
7
9
  #
8
- # describe Thing do
10
+ # RSpec.describe Thing do
9
11
  # it "does something" do
10
12
  # end
11
13
  # end
@@ -17,13 +19,13 @@ module RSpec
17
19
  #
18
20
  # Example group bodies (e.g. `describe` or `context` blocks) are evaluated
19
21
  # in the context of a new subclass of ExampleGroup. Individual examples are
20
- # evaluated in the context of an instance of the specific ExampleGroup subclass
21
- # to which they belong.
22
+ # evaluated in the context of an instance of the specific ExampleGroup
23
+ # subclass to which they belong.
22
24
  #
23
25
  # Besides the class methods defined here, there are other interesting macros
24
- # defined in {Hooks}, {MemoizedHelpers::ClassMethods} and {SharedExampleGroup}.
25
- # There are additional instance methods available to your examples defined in
26
- # {MemoizedHelpers} and {Pending}.
26
+ # defined in {Hooks}, {MemoizedHelpers::ClassMethods} and
27
+ # {SharedExampleGroup}. There are additional instance methods available to
28
+ # your examples defined in {MemoizedHelpers} and {Pending}.
27
29
  class ExampleGroup
28
30
  extend Hooks
29
31
 
@@ -32,10 +34,13 @@ module RSpec
32
34
  include Pending
33
35
  extend SharedExampleGroup
34
36
 
35
- unless respond_to?(:define_singleton_method)
36
- # @private
37
- def self.define_singleton_method(*a, &b)
38
- (class << self; self; end).__send__(:define_method, *a, &b)
37
+ # Define a singleton method for the singleton class (remove the method if
38
+ # it's already been defined).
39
+ # @private
40
+ def self.idempotently_define_singleton_method(name, &definition)
41
+ (class << self; self; end).module_exec do
42
+ remove_method(name) if method_defined?(name) && instance_method(name).owner == self
43
+ define_method(name, &definition)
39
44
  end
40
45
  end
41
46
 
@@ -44,7 +49,21 @@ module RSpec
44
49
  # The [Metadata](Metadata) object associated with this group.
45
50
  # @see Metadata
46
51
  def self.metadata
47
- @metadata if defined?(@metadata)
52
+ @metadata ||= nil
53
+ end
54
+
55
+ # Temporarily replace the provided metadata.
56
+ # Intended primarily to allow an example group's singleton class
57
+ # to return the metadata of the example that it exists for. This
58
+ # is necessary for shared example group inclusion to work properly
59
+ # with singleton example groups.
60
+ # @private
61
+ def self.with_replaced_metadata(meta)
62
+ orig_metadata = metadata
63
+ @metadata = meta
64
+ yield
65
+ ensure
66
+ @metadata = orig_metadata
48
67
  end
49
68
 
50
69
  # @private
@@ -56,7 +75,7 @@ module RSpec
56
75
  # @private
57
76
  def self.delegate_to_metadata(*names)
58
77
  names.each do |name|
59
- define_singleton_method(name) { metadata.fetch(name) }
78
+ idempotently_define_singleton_method(name) { metadata.fetch(name) }
60
79
  end
61
80
  end
62
81
 
@@ -71,13 +90,12 @@ module RSpec
71
90
  # Returns the class or module passed to the `describe` method (or alias).
72
91
  # Returns nil if the subject is not a class or module.
73
92
  # @example
74
- # describe Thing do
93
+ # RSpec.describe Thing do
75
94
  # it "does something" do
76
95
  # described_class == Thing
77
96
  # end
78
97
  # end
79
98
  #
80
- #
81
99
  def described_class
82
100
  self.class.described_class
83
101
  end
@@ -89,9 +107,19 @@ module RSpec
89
107
  # @private
90
108
  # @macro [attach] define_example_method
91
109
  # @!scope class
92
- # @param name [String]
93
- # @param extra_options [Hash]
94
- # @param implementation [Block]
110
+ # @method $1
111
+ # @overload $1
112
+ # @overload $1(&example_implementation)
113
+ # @param example_implementation [Block] The implementation of the example.
114
+ # @overload $1(doc_string, *metadata)
115
+ # @param doc_string [String] The example's doc string.
116
+ # @param metadata [Array<Symbol>, Hash] Metadata for the example.
117
+ # Symbols will be transformed into hash entries with `true` values.
118
+ # @overload $1(doc_string, *metadata, &example_implementation)
119
+ # @param doc_string [String] The example's doc string.
120
+ # @param metadata [Array<Symbol>, Hash] Metadata for the example.
121
+ # Symbols will be transformed into hash entries with `true` values.
122
+ # @param example_implementation [Block] The implementation of the example.
95
123
  # @yield [Example] the example object
96
124
  # @example
97
125
  # $1 do
@@ -100,22 +128,29 @@ module RSpec
100
128
  # $1 "does something" do
101
129
  # end
102
130
  #
131
+ # $1 "does something", :slow, :uses_js do
132
+ # end
133
+ #
103
134
  # $1 "does something", :with => 'additional metadata' do
104
135
  # end
105
136
  #
106
137
  # $1 "does something" do |ex|
107
138
  # # ex is the Example object that contains metadata about the example
108
139
  # end
140
+ #
141
+ # @example
142
+ # $1 "does something", :slow, :load_factor => 100 do
143
+ # end
144
+ #
109
145
  def self.define_example_method(name, extra_options={})
110
- define_singleton_method(name) do |*all_args, &block|
146
+ idempotently_define_singleton_method(name) do |*all_args, &block|
111
147
  desc, *args = *all_args
112
148
 
113
149
  options = Metadata.build_hash_from(args)
114
150
  options.update(:skip => RSpec::Core::Pending::NOT_YET_IMPLEMENTED) unless block
115
151
  options.update(extra_options)
116
152
 
117
- examples << RSpec::Core::Example.new(self, desc, options, block)
118
- examples.last
153
+ RSpec::Core::Example.new(self, desc, options, block)
119
154
  end
120
155
  end
121
156
 
@@ -134,25 +169,25 @@ module RSpec
134
169
  # end
135
170
  define_example_method :specify
136
171
 
137
- # Shortcut to define an example with `:focus => true`
172
+ # Shortcut to define an example with `:focus => true`.
138
173
  # @see example
139
174
  define_example_method :focus, :focus => true
140
- # Shortcut to define an example with `:focus => true`
175
+ # Shortcut to define an example with `:focus => true`.
141
176
  # @see example
142
177
  define_example_method :fexample, :focus => true
143
- # Shortcut to define an example with `:focus => true`
178
+ # Shortcut to define an example with `:focus => true`.
144
179
  # @see example
145
180
  define_example_method :fit, :focus => true
146
- # Shortcut to define an example with `:focus => true`
181
+ # Shortcut to define an example with `:focus => true`.
147
182
  # @see example
148
183
  define_example_method :fspecify, :focus => true
149
- # Shortcut to define an example with `:skip => 'Temporarily skipped with xexample'`
184
+ # Shortcut to define an example with `:skip => 'Temporarily skipped with xexample'`.
150
185
  # @see example
151
186
  define_example_method :xexample, :skip => 'Temporarily skipped with xexample'
152
- # Shortcut to define an example with `:skip => 'Temporarily skipped with xit'`
187
+ # Shortcut to define an example with `:skip => 'Temporarily skipped with xit'`.
153
188
  # @see example
154
189
  define_example_method :xit, :skip => 'Temporarily skipped with xit'
155
- # Shortcut to define an example with `:skip => 'Temporarily skipped with xspecify'`
190
+ # Shortcut to define an example with `:skip => 'Temporarily skipped with xspecify'`.
156
191
  # @see example
157
192
  define_example_method :xspecify, :skip => 'Temporarily skipped with xspecify'
158
193
  # Shortcut to define an example with `:skip => true`
@@ -167,11 +202,16 @@ module RSpec
167
202
  # @!group Defining Example Groups
168
203
 
169
204
  # @private
170
- # @macro [attach] alias_example_group_to
205
+ # @macro [attach] define_example_group_method
171
206
  # @!scope class
172
- # @param name [String] The example group doc string
173
- # @param metadata [Hash] Additional metadata to attach to the example group
174
- # @yield The example group definition
207
+ # @overload $1
208
+ # @overload $1(&example_group_definition)
209
+ # @param example_group_definition [Block] The definition of the example group.
210
+ # @overload $1(doc_string, *metadata, &example_implementation)
211
+ # @param doc_string [String] The group's doc string.
212
+ # @param metadata [Array<Symbol>, Hash] Metadata for the group.
213
+ # Symbols will be transformed into hash entries with `true` values.
214
+ # @param example_group_definition [Block] The definition of the example group.
175
215
  #
176
216
  # Generates a subclass of this example group which inherits
177
217
  # everything except the examples themselves.
@@ -185,41 +225,50 @@ module RSpec
185
225
  # do_something_before
186
226
  # end
187
227
  #
228
+ # before(:example, :clean_env) do
229
+ # env.clear!
230
+ # end
231
+ #
188
232
  # let(:thing) { Thing.new }
189
233
  #
190
234
  # $1 "attribute (of something)" do
191
235
  # # examples in the group get the before hook
192
236
  # # declared above, and can access `thing`
193
237
  # end
238
+ #
239
+ # $1 "needs additional setup", :clean_env, :implementation => JSON do
240
+ # # specifies that hooks with matching metadata
241
+ # # should be be run additionally
242
+ # end
194
243
  # end
195
244
  #
196
245
  # @see DSL#describe
197
246
  def self.define_example_group_method(name, metadata={})
198
- define_singleton_method(name) do |*args, &example_group_block|
199
- thread_data = RSpec.thread_local_metadata
247
+ idempotently_define_singleton_method(name) do |*args, &example_group_block|
248
+ thread_data = RSpec::Support.thread_local_data
200
249
  top_level = self == ExampleGroup
201
250
 
202
- if top_level
203
- if thread_data[:in_example_group]
204
- raise "Creating an isolated context from within a context is " \
205
- "not allowed. Change `RSpec.#{name}` to `#{name}` or " \
206
- "move this to a top-level scope."
251
+ registration_collection =
252
+ if top_level
253
+ if thread_data[:in_example_group]
254
+ raise "Creating an isolated context from within a context is " \
255
+ "not allowed. Change `RSpec.#{name}` to `#{name}` or " \
256
+ "move this to a top-level scope."
257
+ end
258
+
259
+ thread_data[:in_example_group] = true
260
+ RSpec.world.example_groups
261
+ else
262
+ children
207
263
  end
208
264
 
209
- thread_data[:in_example_group] = true
210
- end
211
-
212
265
  begin
213
-
214
266
  description = args.shift
215
267
  combined_metadata = metadata.dup
216
268
  combined_metadata.merge!(args.pop) if args.last.is_a? Hash
217
269
  args << combined_metadata
218
270
 
219
- subclass(self, description, args, &example_group_block).tap do |child|
220
- children << child
221
- end
222
-
271
+ subclass(self, description, args, registration_collection, &example_group_block)
223
272
  ensure
224
273
  thread_data.delete(:in_example_group) if top_level
225
274
  end
@@ -230,8 +279,8 @@ module RSpec
230
279
 
231
280
  define_example_group_method :example_group
232
281
 
233
- # An alias of `example_group`. Generally used when grouping
234
- # examples by a thing you are describing (e.g. an object, class or method).
282
+ # An alias of `example_group`. Generally used when grouping examples by a
283
+ # thing you are describing (e.g. an object, class or method).
235
284
  # @see example_group
236
285
  define_example_group_method :describe
237
286
 
@@ -266,12 +315,12 @@ module RSpec
266
315
  #
267
316
  # @see SharedExampleGroup
268
317
  def self.define_nested_shared_group_method(new_name, report_label="it should behave like")
269
- define_singleton_method(new_name) do |name, *args, &customization_block|
270
- # Pass :caller so the :location metadata is set properly...
271
- # otherwise, it'll be set to the next line because that's
318
+ idempotently_define_singleton_method(new_name) do |name, *args, &customization_block|
319
+ # Pass :caller so the :location metadata is set properly.
320
+ # Otherwise, it'll be set to the next line because that's
272
321
  # the block's source_location.
273
- group = example_group("#{report_label} #{name}", :caller => caller) do
274
- find_and_eval_shared("examples", name, *args, &customization_block)
322
+ group = example_group("#{report_label} #{name}", :caller => (the_caller = caller)) do
323
+ find_and_eval_shared("examples", name, the_caller.first, *args, &customization_block)
275
324
  end
276
325
  group.metadata[:shared_group_name] = name
277
326
  group
@@ -287,41 +336,65 @@ module RSpec
287
336
 
288
337
  # Includes shared content mapped to `name` directly in the group in which
289
338
  # it is declared, as opposed to `it_behaves_like`, which creates a nested
290
- # group. If given a block, that block is also eval'd in the current context.
339
+ # group. If given a block, that block is also eval'd in the current
340
+ # context.
291
341
  #
292
342
  # @see SharedExampleGroup
293
343
  def self.include_context(name, *args, &block)
294
- find_and_eval_shared("context", name, *args, &block)
344
+ find_and_eval_shared("context", name, caller.first, *args, &block)
295
345
  end
296
346
 
297
347
  # Includes shared content mapped to `name` directly in the group in which
298
348
  # it is declared, as opposed to `it_behaves_like`, which creates a nested
299
- # group. If given a block, that block is also eval'd in the current context.
349
+ # group. If given a block, that block is also eval'd in the current
350
+ # context.
300
351
  #
301
352
  # @see SharedExampleGroup
302
353
  def self.include_examples(name, *args, &block)
303
- find_and_eval_shared("examples", name, *args, &block)
354
+ find_and_eval_shared("examples", name, caller.first, *args, &block)
355
+ end
356
+
357
+ # Clear memoized values when adding/removing examples
358
+ # @private
359
+ def self.reset_memoized
360
+ @descendant_filtered_examples = nil
361
+ @_descendants = nil
362
+ @parent_groups = nil
363
+ @declaration_locations = nil
364
+ end
365
+
366
+ # Adds an example to the example group
367
+ def self.add_example(example)
368
+ reset_memoized
369
+ examples << example
370
+ end
371
+
372
+ # Removes an example from the example group
373
+ def self.remove_example(example)
374
+ reset_memoized
375
+ examples.delete example
304
376
  end
305
377
 
306
378
  # @private
307
- def self.find_and_eval_shared(label, name, *args, &customization_block)
308
- shared_block = RSpec.world.shared_example_group_registry.find(parent_groups, name)
379
+ def self.find_and_eval_shared(label, name, inclusion_location, *args, &customization_block)
380
+ shared_module = RSpec.world.shared_example_group_registry.find(parent_groups, name)
309
381
 
310
- unless shared_block
382
+ unless shared_module
311
383
  raise ArgumentError, "Could not find shared #{label} #{name.inspect}"
312
384
  end
313
385
 
314
- module_exec(*args, &shared_block)
315
- module_exec(&customization_block) if customization_block
386
+ shared_module.include_in(
387
+ self, Metadata.relative_path(inclusion_location),
388
+ args, customization_block
389
+ )
316
390
  end
317
391
 
318
392
  # @!endgroup
319
393
 
320
394
  # @private
321
- def self.subclass(parent, description, args, &example_group_block)
395
+ def self.subclass(parent, description, args, registration_collection, &example_group_block)
322
396
  subclass = Class.new(parent)
323
- subclass.set_it_up(description, *args, &example_group_block)
324
- ExampleGroups.assign_const(subclass)
397
+ subclass.set_it_up(description, args, registration_collection, &example_group_block)
325
398
  subclass.module_exec(&example_group_block) if example_group_block
326
399
 
327
400
  # The LetDefinitions module must be included _after_ other modules
@@ -334,26 +407,43 @@ module RSpec
334
407
  end
335
408
 
336
409
  # @private
337
- def self.set_it_up(*args, &example_group_block)
410
+ def self.set_it_up(description, args, registration_collection, &example_group_block)
338
411
  # Ruby 1.9 has a bug that can lead to infinite recursion and a
339
412
  # SystemStackError if you include a module in a superclass after
340
413
  # including it in a subclass: https://gist.github.com/845896
341
- # To prevent this, we must include any modules in RSpec::Core::ExampleGroup
342
- # before users create example groups and have a chance to include
343
- # the same module in a subclass of RSpec::Core::ExampleGroup.
344
- # So we need to configure example groups here.
414
+ # To prevent this, we must include any modules in
415
+ # RSpec::Core::ExampleGroup before users create example groups and have
416
+ # a chance to include the same module in a subclass of
417
+ # RSpec::Core::ExampleGroup. So we need to configure example groups
418
+ # here.
345
419
  ensure_example_groups_are_configured
346
420
 
347
- description = args.shift
348
- user_metadata = Metadata.build_hash_from(args)
349
- args.unshift(description)
421
+ # Register the example with the group before creating the metadata hash.
422
+ # This is necessary since creating the metadata hash triggers
423
+ # `when_first_matching_example_defined` callbacks, in which users can
424
+ # load RSpec support code which defines hooks. For that to work, the
425
+ # examples and example groups must be registered at the time the
426
+ # support code is called or be defined afterwards.
427
+ # Begin defined beforehand but registered afterwards causes hooks to
428
+ # not be applied where they should.
429
+ registration_collection << self
430
+
431
+ @user_metadata = Metadata.build_hash_from(args)
350
432
 
351
433
  @metadata = Metadata::ExampleGroupHash.create(
352
- superclass_metadata, user_metadata, *args, &example_group_block
434
+ superclass_metadata, @user_metadata,
435
+ superclass.method(:next_runnable_index_for),
436
+ description, *args, &example_group_block
353
437
  )
354
438
 
355
- hooks.register_globals(self, RSpec.configuration.hooks)
356
- RSpec.world.configure_group(self)
439
+ config = RSpec.configuration
440
+ config.apply_derived_metadata_to(@metadata)
441
+
442
+ ExampleGroups.assign_const(self)
443
+
444
+ @currently_executing_a_context_hook = false
445
+
446
+ config.configure_group(self)
357
447
  end
358
448
 
359
449
  # @private
@@ -368,7 +458,8 @@ module RSpec
368
458
 
369
459
  # @private
370
460
  def self.descendant_filtered_examples
371
- @descendant_filtered_examples ||= filtered_examples + children.inject([]) { |a, e| a + e.descendant_filtered_examples }
461
+ @descendant_filtered_examples ||= filtered_examples +
462
+ FlatMap.flat_map(children, &:descendant_filtered_examples)
372
463
  end
373
464
 
374
465
  # @private
@@ -376,9 +467,41 @@ module RSpec
376
467
  @children ||= []
377
468
  end
378
469
 
470
+ # @private
471
+ # Traverses the tree of groups, starting with `self`, then the children, recursively.
472
+ # Halts the traversal of a branch of the tree as soon as the passed block returns true.
473
+ # Note that siblings groups and their sub-trees will continue to be explored.
474
+ # This is intended to make it easy to find the top-most group that satisfies some
475
+ # condition.
476
+ def self.traverse_tree_until(&block)
477
+ return if yield self
478
+
479
+ children.each do |child|
480
+ child.traverse_tree_until(&block)
481
+ end
482
+ end
483
+
484
+ # @private
485
+ def self.next_runnable_index_for(file)
486
+ if self == ExampleGroup
487
+ # We add 1 so the ids start at 1 instead of 0. This is
488
+ # necessary for this branch (but not for the other one)
489
+ # because we register examples and groups with the
490
+ # `children` and `examples` collection BEFORE this
491
+ # method is called as part of metadata hash creation,
492
+ # but the example group is recorded with
493
+ # `RSpec.world.example_group_counts_by_spec_file` AFTER
494
+ # the metadata hash is created and the group is returned
495
+ # to the caller.
496
+ RSpec.world.num_example_groups_defined_in(file) + 1
497
+ else
498
+ children.count + examples.count
499
+ end
500
+ end
501
+
379
502
  # @private
380
503
  def self.descendants
381
- @_descendants ||= [self] + children.inject([]) { |a, e| a + e.descendants }
504
+ @_descendants ||= [self] + FlatMap.flat_map(children, &:descendants)
382
505
  end
383
506
 
384
507
  ## @private
@@ -388,7 +511,7 @@ module RSpec
388
511
 
389
512
  # @private
390
513
  def self.top_level?
391
- @top_level ||= superclass == ExampleGroup
514
+ superclass == ExampleGroup
392
515
  end
393
516
 
394
517
  # @private
@@ -409,58 +532,91 @@ module RSpec
409
532
 
410
533
  # @private
411
534
  def self.store_before_context_ivars(example_group_instance)
412
- return if example_group_instance.instance_variables.empty?
413
-
414
- example_group_instance.instance_variables.each do |ivar|
535
+ each_instance_variable_for_example(example_group_instance) do |ivar|
415
536
  before_context_ivars[ivar] = example_group_instance.instance_variable_get(ivar)
416
537
  end
417
538
  end
418
539
 
540
+ # Returns true if a `before(:context)` or `after(:context)`
541
+ # hook is currently executing.
542
+ def self.currently_executing_a_context_hook?
543
+ @currently_executing_a_context_hook
544
+ end
545
+
419
546
  # @private
420
547
  def self.run_before_context_hooks(example_group_instance)
421
- return if descendant_filtered_examples.empty?
422
- begin
423
- set_ivars(example_group_instance, superclass.before_context_ivars)
548
+ set_ivars(example_group_instance, superclass_before_context_ivars)
549
+
550
+ @currently_executing_a_context_hook = true
551
+
552
+ ContextHookMemoized::Before.isolate_for_context_hook(example_group_instance) do
553
+ hooks.run(:before, :context, example_group_instance)
554
+ end
555
+ ensure
556
+ store_before_context_ivars(example_group_instance)
557
+ @currently_executing_a_context_hook = false
558
+ end
424
559
 
425
- ContextHookMemoizedHash::Before.isolate_for_context_hook(example_group_instance) do
426
- hooks.run(:before, :context, example_group_instance)
560
+ if RUBY_VERSION.to_f >= 1.9
561
+ # @private
562
+ def self.superclass_before_context_ivars
563
+ superclass.before_context_ivars
564
+ end
565
+ else # 1.8.7
566
+ # :nocov:
567
+ # @private
568
+ def self.superclass_before_context_ivars
569
+ if superclass.respond_to?(:before_context_ivars)
570
+ superclass.before_context_ivars
571
+ else
572
+ # `self` must be the singleton class of an ExampleGroup instance.
573
+ # On 1.8.7, the superclass of a singleton class of an instance of A
574
+ # is A's singleton class. On 1.9+, it's A. On 1.8.7, the first ancestor
575
+ # is A, so we can mirror 1.8.7's behavior here. Note that we have to
576
+ # search for the first that responds to `before_context_ivars`
577
+ # in case a module has been included in the singleton class.
578
+ ancestors.find { |a| a.respond_to?(:before_context_ivars) }.before_context_ivars
427
579
  end
428
- ensure
429
- store_before_context_ivars(example_group_instance)
430
580
  end
581
+ # :nocov:
431
582
  end
432
583
 
433
584
  # @private
434
585
  def self.run_after_context_hooks(example_group_instance)
435
- return if descendant_filtered_examples.empty?
436
586
  set_ivars(example_group_instance, before_context_ivars)
437
587
 
438
- ContextHookMemoizedHash::After.isolate_for_context_hook(example_group_instance) do
588
+ @currently_executing_a_context_hook = true
589
+
590
+ ContextHookMemoized::After.isolate_for_context_hook(example_group_instance) do
439
591
  hooks.run(:after, :context, example_group_instance)
440
592
  end
593
+ ensure
594
+ before_context_ivars.clear
595
+ @currently_executing_a_context_hook = false
441
596
  end
442
597
 
443
- # Runs all the examples in this group
444
- def self.run(reporter)
445
- if RSpec.world.wants_to_quit
446
- RSpec.world.clear_remaining_example_groups if top_level?
447
- return
448
- end
598
+ # Runs all the examples in this group.
599
+ def self.run(reporter=RSpec::Core::NullReporter)
600
+ return if RSpec.world.wants_to_quit
449
601
  reporter.example_group_started(self)
450
602
 
603
+ should_run_context_hooks = descendant_filtered_examples.any?
451
604
  begin
452
- run_before_context_hooks(new)
605
+ RSpec.current_scope = :before_context_hook
606
+ run_before_context_hooks(new('before(:context) hook')) if should_run_context_hooks
453
607
  result_for_this_group = run_examples(reporter)
454
608
  results_for_descendants = ordering_strategy.order(children).map { |child| child.run(reporter) }.all?
455
609
  result_for_this_group && results_for_descendants
456
610
  rescue Pending::SkipDeclaredInExample => ex
457
611
  for_filtered_examples(reporter) { |example| example.skip_with_exception(reporter, ex) }
458
- rescue Exception => ex
459
- RSpec.world.wants_to_quit = true if fail_fast?
612
+ true
613
+ rescue Support::AllExceptionsExceptOnesWeMustNotRescue => ex
460
614
  for_filtered_examples(reporter) { |example| example.fail_with_exception(reporter, ex) }
615
+ RSpec.world.wants_to_quit = true if reporter.fail_fast_limit_met?
616
+ false
461
617
  ensure
462
- run_after_context_hooks(new)
463
- before_context_ivars.clear
618
+ RSpec.current_scope = :after_context_hook
619
+ run_after_context_hooks(new('after(:context) hook')) if should_run_context_hooks
464
620
  reporter.example_group_finished(self)
465
621
  end
466
622
  end
@@ -485,10 +641,12 @@ module RSpec
485
641
  def self.run_examples(reporter)
486
642
  ordering_strategy.order(filtered_examples).map do |example|
487
643
  next if RSpec.world.wants_to_quit
488
- instance = new
644
+ instance = new(example.inspect_output)
489
645
  set_ivars(instance, before_context_ivars)
490
646
  succeeded = example.run(instance, reporter)
491
- RSpec.world.wants_to_quit = true if fail_fast? && !succeeded
647
+ if !succeeded && reporter.fail_fast_limit_met?
648
+ RSpec.world.wants_to_quit = true
649
+ end
492
650
  succeeded
493
651
  end.all?
494
652
  end
@@ -506,37 +664,111 @@ module RSpec
506
664
  end
507
665
 
508
666
  # @private
509
- def self.fail_fast?
510
- RSpec.configuration.fail_fast?
667
+ def self.declaration_locations
668
+ @declaration_locations ||= [Metadata.location_tuple_from(metadata)] +
669
+ examples.map { |e| Metadata.location_tuple_from(e.metadata) } +
670
+ FlatMap.flat_map(children, &:declaration_locations)
671
+ end
672
+
673
+ # @return [String] the unique id of this example group. Pass
674
+ # this at the command line to re-run this exact example group.
675
+ def self.id
676
+ Metadata.id_from(metadata)
511
677
  end
512
678
 
513
679
  # @private
514
- def self.any_apply?(filters)
515
- MetadataFilter.any_apply?(filters, metadata)
680
+ def self.top_level_description
681
+ parent_groups.last.description
516
682
  end
517
683
 
518
684
  # @private
519
- def self.all_apply?(filters)
520
- MetadataFilter.all_apply?(filters, metadata)
685
+ def self.set_ivars(instance, ivars)
686
+ ivars.each { |name, value| instance.instance_variable_set(name, value) }
687
+ end
688
+
689
+ if RUBY_VERSION.to_f < 1.9
690
+ # :nocov:
691
+ # @private
692
+ INSTANCE_VARIABLE_TO_IGNORE = '@__inspect_output'.freeze
693
+ # :nocov:
694
+ else
695
+ # @private
696
+ INSTANCE_VARIABLE_TO_IGNORE = :@__inspect_output
521
697
  end
522
698
 
523
699
  # @private
524
- def self.declaration_line_numbers
525
- @declaration_line_numbers ||= [metadata[:line_number]] +
526
- examples.map { |e| e.metadata[:line_number] } +
527
- children.inject([]) { |a, e| a + e.declaration_line_numbers }
700
+ def self.each_instance_variable_for_example(group)
701
+ group.instance_variables.each do |ivar|
702
+ yield ivar unless ivar == INSTANCE_VARIABLE_TO_IGNORE
703
+ end
528
704
  end
529
705
 
530
706
  # @private
531
- def self.top_level_description
532
- parent_groups.last.description
707
+ def initialize(inspect_output=nil)
708
+ @__inspect_output = inspect_output || '(no description provided)'
709
+ super() # no args get passed
533
710
  end
534
711
 
535
712
  # @private
536
- def self.set_ivars(instance, ivars)
537
- ivars.each { |name, value| instance.instance_variable_set(name, value) }
713
+ def inspect
714
+ "#<#{self.class} #{@__inspect_output}>"
715
+ end
716
+
717
+ unless method_defined?(:singleton_class) # for 1.8.7
718
+ # :nocov:
719
+ # @private
720
+ def singleton_class
721
+ class << self; self; end
722
+ end
723
+ # :nocov:
724
+ end
725
+
726
+ # @private
727
+ def self.update_inherited_metadata(updates)
728
+ metadata.update(updates) do |key, existing_group_value, new_inherited_value|
729
+ @user_metadata.key?(key) ? existing_group_value : new_inherited_value
730
+ end
731
+
732
+ RSpec.configuration.configure_group(self)
733
+ examples.each { |ex| ex.update_inherited_metadata(updates) }
734
+ children.each { |group| group.update_inherited_metadata(updates) }
735
+ end
736
+
737
+ # Raised when an RSpec API is called in the wrong scope, such as `before`
738
+ # being called from within an example rather than from within an example
739
+ # group block.
740
+ WrongScopeError = Class.new(NoMethodError)
741
+
742
+ def self.method_missing(name, *args)
743
+ if method_defined?(name)
744
+ raise WrongScopeError,
745
+ "`#{name}` is not available on an example group (e.g. a " \
746
+ "`describe` or `context` block). It is only available from " \
747
+ "within individual examples (e.g. `it` blocks) or from " \
748
+ "constructs that run in the scope of an example (e.g. " \
749
+ "`before`, `let`, etc)."
750
+ end
751
+
752
+ super
538
753
  end
754
+ private_class_method :method_missing
755
+
756
+ private
757
+
758
+ def method_missing(name, *args)
759
+ if self.class.respond_to?(name)
760
+ raise WrongScopeError,
761
+ "`#{name}` is not available from within an example (e.g. an " \
762
+ "`it` block) or from constructs that run in the scope of an " \
763
+ "example (e.g. `before`, `let`, etc). It is only available " \
764
+ "on an example group (e.g. a `describe` or `context` block)."
765
+ end
766
+
767
+ super(name, *args)
768
+ end
769
+ ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
539
770
  end
771
+ # rubocop:enable Metrics/ClassLength
540
772
 
541
773
  # @private
542
774
  # Unnamed example group used by `SuiteHookContext`.
@@ -545,11 +777,65 @@ module RSpec
545
777
  {}
546
778
  end
547
779
  end
780
+
781
+ # Contains information about the inclusion site of a shared example group.
782
+ class SharedExampleGroupInclusionStackFrame
783
+ # @return [String] the name of the shared example group
784
+ attr_reader :shared_group_name
785
+ # @return [String] the location where the shared example was included
786
+ attr_reader :inclusion_location
787
+
788
+ # @private
789
+ def initialize(shared_group_name, inclusion_location)
790
+ @shared_group_name = shared_group_name
791
+ @inclusion_location = inclusion_location
792
+ end
793
+
794
+ # @return [String] The {#inclusion_location}, formatted for display by a formatter.
795
+ def formatted_inclusion_location
796
+ @formatted_inclusion_location ||= begin
797
+ RSpec.configuration.backtrace_formatter.backtrace_line(
798
+ inclusion_location.sub(/(:\d+):in .+$/, '\1')
799
+ )
800
+ end
801
+ end
802
+
803
+ # @return [String] Description of this stack frame, in the form used by
804
+ # RSpec's built-in formatters.
805
+ def description
806
+ @description ||= "Shared Example Group: #{shared_group_name.inspect} " \
807
+ "called from #{formatted_inclusion_location}"
808
+ end
809
+
810
+ # @private
811
+ def self.current_backtrace
812
+ shared_example_group_inclusions.reverse
813
+ end
814
+
815
+ # @private
816
+ def self.with_frame(name, location)
817
+ current_stack = shared_example_group_inclusions
818
+ if current_stack.any? { |frame| frame.shared_group_name == name }
819
+ raise ArgumentError, "can't include shared examples recursively"
820
+ else
821
+ current_stack << new(name, location)
822
+ yield
823
+ end
824
+ ensure
825
+ current_stack.pop
826
+ end
827
+
828
+ # @private
829
+ def self.shared_example_group_inclusions
830
+ RSpec::Support.thread_local_data[:shared_example_group_inclusions] ||= []
831
+ end
832
+ end
548
833
  end
549
834
 
550
835
  # @private
551
836
  #
552
- # Namespace for the example group subclasses generated by top-level `describe`.
837
+ # Namespace for the example group subclasses generated by top-level
838
+ # `describe`.
553
839
  module ExampleGroups
554
840
  extend Support::RecursiveConstMethods
555
841
 
@@ -567,24 +853,35 @@ module RSpec
567
853
  const_scope
568
854
  end
569
855
 
856
+ def self.remove_all_constants
857
+ constants.each do |constant|
858
+ __send__(:remove_const, constant)
859
+ end
860
+ end
861
+
570
862
  def self.base_name_for(group)
571
- return "Anonymous" if group.description.empty?
863
+ return "Anonymous".dup if group.description.empty?
572
864
 
573
- # convert to CamelCase
865
+ # Convert to CamelCase.
574
866
  name = ' ' + group.description
575
- name.gsub!(/[^0-9a-zA-Z]+([0-9a-zA-Z])/) { Regexp.last_match[1].upcase }
867
+ name.gsub!(/[^0-9a-zA-Z]+([0-9a-zA-Z])/) do
868
+ match = ::Regexp.last_match[1]
869
+ match.upcase!
870
+ match
871
+ end
576
872
 
577
- name.lstrip! # Remove leading whitespace
578
- name.gsub!(/\W/, '') # JRuby, RBX and others don't like non-ascii in const names
873
+ name.lstrip! # Remove leading whitespace
874
+ name.gsub!(/\W/, ''.freeze) # JRuby, RBX and others don't like non-ascii in const names
579
875
 
580
876
  # Ruby requires first const letter to be A-Z. Use `Nested`
581
877
  # as necessary to enforce that.
582
- name.gsub!(/\A([^A-Z]|\z)/, 'Nested\1')
878
+ name.gsub!(/\A([^A-Z]|\z)/, 'Nested\1'.freeze)
583
879
 
584
880
  name
585
881
  end
586
882
 
587
883
  if RUBY_VERSION == '1.9.2'
884
+ # :nocov:
588
885
  class << self
589
886
  alias _base_name_for base_name_for
590
887
  def base_name_for(group)
@@ -592,12 +889,14 @@ module RSpec
592
889
  end
593
890
  end
594
891
  private_class_method :_base_name_for
892
+ # :nocov:
595
893
  end
596
894
 
597
895
  def self.disambiguate(name, const_scope)
598
896
  return name unless const_defined_on?(const_scope, name)
599
897
 
600
- # Add a trailing number if needed to disambiguate from an existing constant.
898
+ # Add a trailing number if needed to disambiguate from an existing
899
+ # constant.
601
900
  name << "_2"
602
901
  name.next! while const_defined_on?(const_scope, name)
603
902
  name