opal-rspec 0.7.0.rc.1 → 0.7.0.rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (513) hide show
  1. checksums.yaml +4 -4
  2. data/lib/opal/rspec/version.rb +1 -1
  3. data/opal-rspec.gemspec +5 -3
  4. data/rspec-core/upstream/.document +5 -0
  5. data/rspec-core/upstream/.gitignore +21 -0
  6. data/rspec-core/upstream/.rspec +2 -0
  7. data/rspec-core/upstream/.rubocop.yml +53 -0
  8. data/rspec-core/upstream/.rubocop_rspec_base.yml +130 -0
  9. data/rspec-core/upstream/.travis.yml +35 -0
  10. data/rspec-core/upstream/.yardopts +7 -0
  11. data/rspec-core/upstream/Changelog.md +1641 -0
  12. data/rspec-core/upstream/DEV-README.md +28 -0
  13. data/rspec-core/upstream/Gemfile +34 -0
  14. data/rspec-core/upstream/Gemfile-custom.sample +19 -0
  15. data/rspec-core/upstream/Guardfile +5 -0
  16. data/rspec-core/upstream/License.txt +25 -0
  17. data/rspec-core/upstream/README.md +243 -0
  18. data/rspec-core/upstream/Rakefile +85 -0
  19. data/rspec-core/upstream/benchmarks/README.md +4 -0
  20. data/rspec-core/upstream/benchmarks/boot_time_with_many_load_path_dirs.sh +123 -0
  21. data/rspec-core/upstream/benchmarks/call_v_yield.rb +81 -0
  22. data/rspec-core/upstream/benchmarks/check_inclusion.rb +125 -0
  23. data/rspec-core/upstream/benchmarks/define_method_v_attr_reader_v_def.rb +81 -0
  24. data/rspec-core/upstream/benchmarks/eager_vs_lazy_metadata.rb +126 -0
  25. data/rspec-core/upstream/benchmarks/eager_vs_lazy_metadata/define_examples.rb +22 -0
  26. data/rspec-core/upstream/benchmarks/filter_object.rb +35 -0
  27. data/rspec-core/upstream/benchmarks/index_v_take_while.rb +47 -0
  28. data/rspec-core/upstream/benchmarks/map_then_flatten_vs_flat_map_benchmarks.rb +94 -0
  29. data/rspec-core/upstream/benchmarks/require_relative_v_require.rb +75 -0
  30. data/rspec-core/upstream/benchmarks/respond_to_v_defined.rb +72 -0
  31. data/rspec-core/upstream/benchmarks/several_regexps_v_one_big_one.rb +86 -0
  32. data/rspec-core/upstream/benchmarks/sort_by_v_shuffle.rb +83 -0
  33. data/rspec-core/upstream/benchmarks/to_proc_v_not_to_proc.rb +539 -0
  34. data/rspec-core/upstream/cucumber.yml +6 -0
  35. data/rspec-core/upstream/exe/rspec +4 -0
  36. data/rspec-core/upstream/features/.nav +62 -0
  37. data/rspec-core/upstream/features/README.md +13 -0
  38. data/rspec-core/upstream/features/Upgrade.md +352 -0
  39. data/rspec-core/upstream/features/command_line/README.md +28 -0
  40. data/rspec-core/upstream/features/command_line/dry_run.feature +29 -0
  41. data/rspec-core/upstream/features/command_line/example_name_option.feature +98 -0
  42. data/rspec-core/upstream/features/command_line/exit_status.feature +66 -0
  43. data/rspec-core/upstream/features/command_line/fail_fast.feature +27 -0
  44. data/rspec-core/upstream/features/command_line/format_option.feature +86 -0
  45. data/rspec-core/upstream/features/command_line/init.feature +50 -0
  46. data/rspec-core/upstream/features/command_line/line_number_appended_to_path.feature +159 -0
  47. data/rspec-core/upstream/features/command_line/order.md +23 -0
  48. data/rspec-core/upstream/features/command_line/pattern_option.feature +42 -0
  49. data/rspec-core/upstream/features/command_line/rake_task.feature +158 -0
  50. data/rspec-core/upstream/features/command_line/randomization.feature +62 -0
  51. data/rspec-core/upstream/features/command_line/require_option.feature +45 -0
  52. data/rspec-core/upstream/features/command_line/ruby.feature +23 -0
  53. data/rspec-core/upstream/features/command_line/tag.feature +102 -0
  54. data/rspec-core/upstream/features/command_line/warnings_option.feature +29 -0
  55. data/rspec-core/upstream/features/configuration/alias_example_to.feature +57 -0
  56. data/rspec-core/upstream/features/configuration/backtrace_exclusion_patterns.feature +138 -0
  57. data/rspec-core/upstream/features/configuration/custom_settings.feature +84 -0
  58. data/rspec-core/upstream/features/configuration/default_path.feature +37 -0
  59. data/rspec-core/upstream/features/configuration/deprecation_stream.feature +87 -0
  60. data/rspec-core/upstream/features/configuration/enable_global_dsl.feature +60 -0
  61. data/rspec-core/upstream/features/configuration/exclude_pattern.feature +43 -0
  62. data/rspec-core/upstream/features/configuration/fail_fast.feature +79 -0
  63. data/rspec-core/upstream/features/configuration/failure_exit_code.feature +53 -0
  64. data/rspec-core/upstream/features/configuration/order_and_seed.feature +5 -0
  65. data/rspec-core/upstream/features/configuration/output_stream.feature +27 -0
  66. data/rspec-core/upstream/features/configuration/overriding_global_ordering.feature +90 -0
  67. data/rspec-core/upstream/features/configuration/pattern.feature +62 -0
  68. data/rspec-core/upstream/features/configuration/profile.feature +220 -0
  69. data/rspec-core/upstream/features/configuration/read_options_from_file.feature +95 -0
  70. data/rspec-core/upstream/features/configuration/run_all_when_everything_filtered.feature +78 -0
  71. data/rspec-core/upstream/features/configuration/zero_monkey_patching_mode.feature +106 -0
  72. data/rspec-core/upstream/features/core_standalone.feature +23 -0
  73. data/rspec-core/upstream/features/example_groups/aliasing.feature +48 -0
  74. data/rspec-core/upstream/features/example_groups/basic_structure.feature +55 -0
  75. data/rspec-core/upstream/features/example_groups/shared_context.feature +92 -0
  76. data/rspec-core/upstream/features/example_groups/shared_examples.feature +295 -0
  77. data/rspec-core/upstream/features/expectation_framework_integration/configure_expectation_framework.feature +167 -0
  78. data/rspec-core/upstream/features/filtering/exclusion_filters.feature +135 -0
  79. data/rspec-core/upstream/features/filtering/if_and_unless.feature +165 -0
  80. data/rspec-core/upstream/features/filtering/inclusion_filters.feature +101 -0
  81. data/rspec-core/upstream/features/formatters/configurable_colors.feature +32 -0
  82. data/rspec-core/upstream/features/formatters/custom_formatter.feature +37 -0
  83. data/rspec-core/upstream/features/formatters/json_formatter.feature +30 -0
  84. data/rspec-core/upstream/features/helper_methods/arbitrary_methods.feature +40 -0
  85. data/rspec-core/upstream/features/helper_methods/let.feature +50 -0
  86. data/rspec-core/upstream/features/helper_methods/modules.feature +146 -0
  87. data/rspec-core/upstream/features/hooks/around_hooks.feature +345 -0
  88. data/rspec-core/upstream/features/hooks/before_and_after_hooks.feature +434 -0
  89. data/rspec-core/upstream/features/hooks/filtering.feature +234 -0
  90. data/rspec-core/upstream/features/metadata/current_example.feature +57 -0
  91. data/rspec-core/upstream/features/metadata/described_class.feature +17 -0
  92. data/rspec-core/upstream/features/metadata/user_defined.feature +100 -0
  93. data/rspec-core/upstream/features/mock_framework_integration/use_any_framework.feature +106 -0
  94. data/rspec-core/upstream/features/mock_framework_integration/use_flexmock.feature +94 -0
  95. data/rspec-core/upstream/features/mock_framework_integration/use_mocha.feature +95 -0
  96. data/rspec-core/upstream/features/mock_framework_integration/use_rr.feature +96 -0
  97. data/rspec-core/upstream/features/mock_framework_integration/use_rspec.feature +113 -0
  98. data/rspec-core/upstream/features/pending_and_skipped_examples/README.md +3 -0
  99. data/rspec-core/upstream/features/pending_and_skipped_examples/pending_examples.feature +73 -0
  100. data/rspec-core/upstream/features/pending_and_skipped_examples/skipped_examples.feature +106 -0
  101. data/rspec-core/upstream/features/spec_files/arbitrary_file_suffix.feature +13 -0
  102. data/rspec-core/upstream/features/step_definitions/additional_cli_steps.rb +126 -0
  103. data/rspec-core/upstream/features/step_definitions/core_standalone_steps.rb +12 -0
  104. data/rspec-core/upstream/features/subject/explicit_subject.feature +187 -0
  105. data/rspec-core/upstream/features/subject/implicit_subject.feature +57 -0
  106. data/rspec-core/upstream/features/subject/one_liner_syntax.feature +69 -0
  107. data/rspec-core/upstream/features/support/env.rb +21 -0
  108. data/rspec-core/upstream/features/support/require_expect_syntax_in_aruba_specs.rb +29 -0
  109. data/rspec-core/upstream/features/support/rubinius.rb +6 -0
  110. data/rspec-core/upstream/lib/rspec/autorun.rb +2 -0
  111. data/rspec-core/upstream/lib/rspec/core.rb +169 -0
  112. data/rspec-core/upstream/lib/rspec/core/backport_random.rb +336 -0
  113. data/rspec-core/upstream/lib/rspec/core/backtrace_formatter.rb +66 -0
  114. data/rspec-core/upstream/lib/rspec/core/configuration.rb +1440 -0
  115. data/rspec-core/upstream/lib/rspec/core/configuration_options.rb +173 -0
  116. data/rspec-core/upstream/lib/rspec/core/drb.rb +111 -0
  117. data/rspec-core/upstream/lib/rspec/core/dsl.rb +93 -0
  118. data/rspec-core/upstream/lib/rspec/core/example.rb +502 -0
  119. data/rspec-core/upstream/lib/rspec/core/example_group.rb +606 -0
  120. data/rspec-core/upstream/lib/rspec/core/filter_manager.rb +259 -0
  121. data/rspec-core/upstream/lib/rspec/core/flat_map.rb +18 -0
  122. data/rspec-core/upstream/lib/rspec/core/formatters.rb +240 -0
  123. data/rspec-core/upstream/lib/rspec/core/formatters/base_formatter.rb +67 -0
  124. data/rspec-core/upstream/lib/rspec/core/formatters/base_text_formatter.rb +76 -0
  125. data/rspec-core/upstream/lib/rspec/core/formatters/console_codes.rb +64 -0
  126. data/rspec-core/upstream/lib/rspec/core/formatters/deprecation_formatter.rb +222 -0
  127. data/rspec-core/upstream/lib/rspec/core/formatters/documentation_formatter.rb +68 -0
  128. data/rspec-core/upstream/lib/rspec/core/formatters/helpers.rb +87 -0
  129. data/rspec-core/upstream/lib/rspec/core/formatters/html_formatter.rb +149 -0
  130. data/rspec-core/upstream/lib/rspec/core/formatters/html_printer.rb +403 -0
  131. data/rspec-core/upstream/lib/rspec/core/formatters/json_formatter.rb +94 -0
  132. data/rspec-core/upstream/lib/rspec/core/formatters/profile_formatter.rb +65 -0
  133. data/rspec-core/upstream/lib/rspec/core/formatters/progress_formatter.rb +28 -0
  134. data/rspec-core/upstream/lib/rspec/core/formatters/protocol.rb +163 -0
  135. data/rspec-core/upstream/lib/rspec/core/formatters/snippet_extractor.rb +104 -0
  136. data/rspec-core/upstream/lib/rspec/core/hooks.rb +591 -0
  137. data/rspec-core/upstream/lib/rspec/core/memoized_helpers.rb +472 -0
  138. data/rspec-core/upstream/lib/rspec/core/metadata.rb +437 -0
  139. data/rspec-core/upstream/lib/rspec/core/metadata_filter.rb +95 -0
  140. data/rspec-core/upstream/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
  141. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
  142. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/mocha.rb +57 -0
  143. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/null.rb +14 -0
  144. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/rr.rb +31 -0
  145. data/rspec-core/upstream/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
  146. data/rspec-core/upstream/lib/rspec/core/notifications.rb +542 -0
  147. data/rspec-core/upstream/lib/rspec/core/option_parser.rb +222 -0
  148. data/rspec-core/upstream/lib/rspec/core/ordering.rb +155 -0
  149. data/rspec-core/upstream/lib/rspec/core/pending.rb +163 -0
  150. data/rspec-core/upstream/lib/rspec/core/project_initializer.rb +48 -0
  151. data/rspec-core/upstream/lib/rspec/core/project_initializer/.rspec +2 -0
  152. data/rspec-core/upstream/lib/rspec/core/project_initializer/spec/spec_helper.rb +89 -0
  153. data/rspec-core/upstream/lib/rspec/core/rake_task.rb +187 -0
  154. data/rspec-core/upstream/lib/rspec/core/reporter.rb +149 -0
  155. data/rspec-core/upstream/lib/rspec/core/ruby_project.rb +45 -0
  156. data/rspec-core/upstream/lib/rspec/core/runner.rb +158 -0
  157. data/rspec-core/upstream/lib/rspec/core/shared_context.rb +55 -0
  158. data/rspec-core/upstream/lib/rspec/core/shared_example_group.rb +182 -0
  159. data/rspec-core/upstream/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  160. data/rspec-core/upstream/lib/rspec/core/version.rb +9 -0
  161. data/rspec-core/upstream/lib/rspec/core/warnings.rb +40 -0
  162. data/rspec-core/upstream/lib/rspec/core/world.rb +183 -0
  163. data/rspec-core/upstream/maintenance-branch +1 -0
  164. data/rspec-core/upstream/rspec-core.gemspec +53 -0
  165. data/rspec-core/upstream/script/clone_all_rspec_repos +24 -0
  166. data/rspec-core/upstream/script/console +8 -0
  167. data/rspec-core/upstream/script/functions.sh +168 -0
  168. data/rspec-core/upstream/script/ignores +72 -0
  169. data/rspec-core/upstream/script/list_method_cache_busters.sh +23 -0
  170. data/rspec-core/upstream/script/prevent_runtime_method_cache_busters +15 -0
  171. data/rspec-core/upstream/script/regen_fixtures.sh +39 -0
  172. data/rspec-core/upstream/script/rspec_with_simplecov +42 -0
  173. data/rspec-core/upstream/script/run_build +28 -0
  174. data/rspec-expectations/upstream/.document +5 -0
  175. data/rspec-expectations/upstream/.gitignore +17 -0
  176. data/rspec-expectations/upstream/.rspec +2 -0
  177. data/rspec-expectations/upstream/.rubocop.yml +5 -0
  178. data/rspec-expectations/upstream/.rubocop_rspec_base.yml +130 -0
  179. data/rspec-expectations/upstream/.travis.yml +35 -0
  180. data/rspec-expectations/upstream/.yardopts +6 -0
  181. data/rspec-expectations/upstream/Changelog.md +835 -0
  182. data/rspec-expectations/upstream/DEV-README.md +28 -0
  183. data/rspec-expectations/upstream/Gemfile +35 -0
  184. data/rspec-expectations/upstream/Gemfile-custom.sample +19 -0
  185. data/rspec-expectations/upstream/Guardfile +6 -0
  186. data/rspec-expectations/upstream/License.txt +24 -0
  187. data/rspec-expectations/upstream/README.md +278 -0
  188. data/rspec-expectations/upstream/Rakefile +78 -0
  189. data/rspec-expectations/upstream/Should.md +168 -0
  190. data/rspec-expectations/upstream/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +253 -0
  191. data/rspec-expectations/upstream/benchmarks/autoload_v_require.rb +25 -0
  192. data/rspec-expectations/upstream/benchmarks/cloning_matchers.rb +19 -0
  193. data/rspec-expectations/upstream/benchmarks/default_messages_as_methods_v_blocks.rb +27 -0
  194. data/rspec-expectations/upstream/benchmarks/example_spec.rb +9 -0
  195. data/rspec-expectations/upstream/benchmarks/include_v_superclass.rb +39 -0
  196. data/rspec-expectations/upstream/benchmarks/match_array/failing_with_distinct_items.rb +147 -0
  197. data/rspec-expectations/upstream/benchmarks/match_array/failing_with_duplicate_items.rb +122 -0
  198. data/rspec-expectations/upstream/benchmarks/match_array/passing_with_distinct_items.rb +154 -0
  199. data/rspec-expectations/upstream/benchmarks/match_array/passing_with_duplicate_items.rb +132 -0
  200. data/rspec-expectations/upstream/benchmarks/match_array/rubyprof/passing_with_distinct_items.rb +9 -0
  201. data/rspec-expectations/upstream/benchmarks/matcher_dsl_vs_classes.rb +180 -0
  202. data/rspec-expectations/upstream/benchmarks/method_to_proc.rb +72 -0
  203. data/rspec-expectations/upstream/benchmarks/set_vs_array_include.rb +68 -0
  204. data/rspec-expectations/upstream/cucumber.yml +10 -0
  205. data/rspec-expectations/upstream/features/.nav +41 -0
  206. data/rspec-expectations/upstream/features/README.md +49 -0
  207. data/rspec-expectations/upstream/features/built_in_matchers/README.md +137 -0
  208. data/rspec-expectations/upstream/features/built_in_matchers/all.feature +60 -0
  209. data/rspec-expectations/upstream/features/built_in_matchers/be.feature +175 -0
  210. data/rspec-expectations/upstream/features/built_in_matchers/be_within.feature +48 -0
  211. data/rspec-expectations/upstream/features/built_in_matchers/change.feature +66 -0
  212. data/rspec-expectations/upstream/features/built_in_matchers/comparisons.feature +96 -0
  213. data/rspec-expectations/upstream/features/built_in_matchers/contain_exactly.feature +64 -0
  214. data/rspec-expectations/upstream/features/built_in_matchers/cover.feature +47 -0
  215. data/rspec-expectations/upstream/features/built_in_matchers/end_with.feature +48 -0
  216. data/rspec-expectations/upstream/features/built_in_matchers/equality.feature +135 -0
  217. data/rspec-expectations/upstream/features/built_in_matchers/exist.feature +44 -0
  218. data/rspec-expectations/upstream/features/built_in_matchers/have_attributes.feature +47 -0
  219. data/rspec-expectations/upstream/features/built_in_matchers/include.feature +123 -0
  220. data/rspec-expectations/upstream/features/built_in_matchers/match.feature +49 -0
  221. data/rspec-expectations/upstream/features/built_in_matchers/output.feature +68 -0
  222. data/rspec-expectations/upstream/features/built_in_matchers/predicates.feature +181 -0
  223. data/rspec-expectations/upstream/features/built_in_matchers/raise_error.feature +144 -0
  224. data/rspec-expectations/upstream/features/built_in_matchers/respond_to.feature +83 -0
  225. data/rspec-expectations/upstream/features/built_in_matchers/satisfy.feature +32 -0
  226. data/rspec-expectations/upstream/features/built_in_matchers/start_with.feature +48 -0
  227. data/rspec-expectations/upstream/features/built_in_matchers/throw_symbol.feature +90 -0
  228. data/rspec-expectations/upstream/features/built_in_matchers/types.feature +116 -0
  229. data/rspec-expectations/upstream/features/built_in_matchers/yield.feature +156 -0
  230. data/rspec-expectations/upstream/features/composing_matchers.feature +246 -0
  231. data/rspec-expectations/upstream/features/compound_expectations.feature +52 -0
  232. data/rspec-expectations/upstream/features/custom_matchers/access_running_example.feature +48 -0
  233. data/rspec-expectations/upstream/features/custom_matchers/define_diffable_matcher.feature +29 -0
  234. data/rspec-expectations/upstream/features/custom_matchers/define_matcher.feature +337 -0
  235. data/rspec-expectations/upstream/features/custom_matchers/define_matcher_outside_rspec.feature +32 -0
  236. data/rspec-expectations/upstream/features/custom_matchers/define_matcher_with_fluent_interface.feature +51 -0
  237. data/rspec-expectations/upstream/features/customized_message.feature +39 -0
  238. data/rspec-expectations/upstream/features/define_negated_matcher.feature +29 -0
  239. data/rspec-expectations/upstream/features/diffing.feature +85 -0
  240. data/rspec-expectations/upstream/features/implicit_docstrings.feature +51 -0
  241. data/rspec-expectations/upstream/features/step_definitions/additional_cli_steps.rb +22 -0
  242. data/rspec-expectations/upstream/features/support/disallow_certain_apis.rb +34 -0
  243. data/rspec-expectations/upstream/features/support/env.rb +21 -0
  244. data/rspec-expectations/upstream/features/support/rubinius.rb +6 -0
  245. data/rspec-expectations/upstream/features/syntax_configuration.feature +92 -0
  246. data/rspec-expectations/upstream/features/test_frameworks/minitest.feature +44 -0
  247. data/rspec-expectations/upstream/lib/rspec/expectations.rb +68 -0
  248. data/rspec-expectations/upstream/lib/rspec/expectations/configuration.rb +147 -0
  249. data/rspec-expectations/upstream/lib/rspec/expectations/expectation_target.rb +119 -0
  250. data/rspec-expectations/upstream/lib/rspec/expectations/fail_with.rb +34 -0
  251. data/rspec-expectations/upstream/lib/rspec/expectations/handler.rb +167 -0
  252. data/rspec-expectations/upstream/lib/rspec/expectations/minitest_integration.rb +17 -0
  253. data/rspec-expectations/upstream/lib/rspec/expectations/syntax.rb +132 -0
  254. data/rspec-expectations/upstream/lib/rspec/expectations/version.rb +8 -0
  255. data/rspec-expectations/upstream/lib/rspec/matchers.rb +967 -0
  256. data/rspec-expectations/upstream/lib/rspec/matchers/aliased_matcher.rb +116 -0
  257. data/rspec-expectations/upstream/lib/rspec/matchers/built_in.rb +52 -0
  258. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/all.rb +85 -0
  259. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/base_matcher.rb +132 -0
  260. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be.rb +277 -0
  261. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_between.rb +77 -0
  262. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_instance_of.rb +22 -0
  263. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_kind_of.rb +16 -0
  264. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_within.rb +72 -0
  265. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/change.rb +337 -0
  266. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/compound.rb +258 -0
  267. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/contain_exactly.rb +249 -0
  268. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/cover.rb +24 -0
  269. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eq.rb +75 -0
  270. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eql.rb +34 -0
  271. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/equal.rb +81 -0
  272. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/exist.rb +86 -0
  273. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/has.rb +101 -0
  274. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/have_attributes.rb +84 -0
  275. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/include.rb +105 -0
  276. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/match.rb +29 -0
  277. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/operators.rb +119 -0
  278. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/output.rb +152 -0
  279. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/raise_error.rb +174 -0
  280. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/respond_to.rb +91 -0
  281. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/satisfy.rb +39 -0
  282. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/start_and_end_with.rb +82 -0
  283. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/throw_symbol.rb +132 -0
  284. data/rspec-expectations/upstream/lib/rspec/matchers/built_in/yield.rb +420 -0
  285. data/rspec-expectations/upstream/lib/rspec/matchers/composable.rb +183 -0
  286. data/rspec-expectations/upstream/lib/rspec/matchers/dsl.rb +391 -0
  287. data/rspec-expectations/upstream/lib/rspec/matchers/generated_descriptions.rb +42 -0
  288. data/rspec-expectations/upstream/lib/rspec/matchers/matcher_delegator.rb +33 -0
  289. data/rspec-expectations/upstream/lib/rspec/matchers/matcher_protocol.rb +99 -0
  290. data/rspec-expectations/upstream/lib/rspec/matchers/pretty.rb +77 -0
  291. data/rspec-expectations/upstream/maintenance-branch +1 -0
  292. data/rspec-expectations/upstream/rspec-expectations.gemspec +46 -0
  293. data/rspec-expectations/upstream/script/clone_all_rspec_repos +24 -0
  294. data/rspec-expectations/upstream/script/functions.sh +168 -0
  295. data/rspec-expectations/upstream/script/run_build +28 -0
  296. data/rspec-mocks/upstream/.autotest +7 -0
  297. data/rspec-mocks/upstream/.document +5 -0
  298. data/rspec-mocks/upstream/.gitignore +18 -0
  299. data/rspec-mocks/upstream/.rspec +2 -0
  300. data/rspec-mocks/upstream/.rubocop.yml +17 -0
  301. data/rspec-mocks/upstream/.rubocop_rspec_base.yml +130 -0
  302. data/rspec-mocks/upstream/.travis.yml +35 -0
  303. data/rspec-mocks/upstream/.yardopts +6 -0
  304. data/rspec-mocks/upstream/Changelog.md +817 -0
  305. data/rspec-mocks/upstream/DEV-README.md +28 -0
  306. data/rspec-mocks/upstream/Gemfile +34 -0
  307. data/rspec-mocks/upstream/Gemfile-custom.sample +19 -0
  308. data/rspec-mocks/upstream/Guardfile +8 -0
  309. data/rspec-mocks/upstream/License.txt +24 -0
  310. data/rspec-mocks/upstream/README.md +397 -0
  311. data/rspec-mocks/upstream/Rakefile +72 -0
  312. data/rspec-mocks/upstream/benchmarks/boot_time.sh +31 -0
  313. data/rspec-mocks/upstream/benchmarks/double_creation.rb +66 -0
  314. data/rspec-mocks/upstream/benchmarks/each_value_v_values_each.rb +58 -0
  315. data/rspec-mocks/upstream/benchmarks/find_original_method_early.rb +64 -0
  316. data/rspec-mocks/upstream/benchmarks/method_defined_at_any_visibility.rb +101 -0
  317. data/rspec-mocks/upstream/benchmarks/thread_safety.rb +24 -0
  318. data/rspec-mocks/upstream/benchmarks/transfer_nested_constants.rb +77 -0
  319. data/rspec-mocks/upstream/cucumber.yml +2 -0
  320. data/rspec-mocks/upstream/features/.nav +43 -0
  321. data/rspec-mocks/upstream/features/README.md +76 -0
  322. data/rspec-mocks/upstream/features/basics/allowing_messages.feature +35 -0
  323. data/rspec-mocks/upstream/features/basics/expecting_messages.feature +73 -0
  324. data/rspec-mocks/upstream/features/basics/null_object_doubles.feature +35 -0
  325. data/rspec-mocks/upstream/features/basics/partial_test_doubles.feature +70 -0
  326. data/rspec-mocks/upstream/features/basics/scope.feature +99 -0
  327. data/rspec-mocks/upstream/features/basics/spies.feature +144 -0
  328. data/rspec-mocks/upstream/features/basics/test_doubles.feature +41 -0
  329. data/rspec-mocks/upstream/features/configuring_responses/README.md +12 -0
  330. data/rspec-mocks/upstream/features/configuring_responses/block_implementation.feature +131 -0
  331. data/rspec-mocks/upstream/features/configuring_responses/calling_the_original_implementation.feature +52 -0
  332. data/rspec-mocks/upstream/features/configuring_responses/raising_an_error.feature +28 -0
  333. data/rspec-mocks/upstream/features/configuring_responses/returning_a_value.feature +52 -0
  334. data/rspec-mocks/upstream/features/configuring_responses/throwing.feature +36 -0
  335. data/rspec-mocks/upstream/features/configuring_responses/wrapping_the_original_implementation.feature +53 -0
  336. data/rspec-mocks/upstream/features/configuring_responses/yielding.feature +76 -0
  337. data/rspec-mocks/upstream/features/mutating_constants/README.md +78 -0
  338. data/rspec-mocks/upstream/features/mutating_constants/hide_defined_constant.feature +64 -0
  339. data/rspec-mocks/upstream/features/mutating_constants/hide_undefined_constant.feature +22 -0
  340. data/rspec-mocks/upstream/features/mutating_constants/stub_defined_constant.feature +77 -0
  341. data/rspec-mocks/upstream/features/mutating_constants/stub_undefined_constant.feature +50 -0
  342. data/rspec-mocks/upstream/features/old_syntax/README.md +35 -0
  343. data/rspec-mocks/upstream/features/old_syntax/any_instance.feature +105 -0
  344. data/rspec-mocks/upstream/features/old_syntax/should_receive.feature +90 -0
  345. data/rspec-mocks/upstream/features/old_syntax/stub.feature +51 -0
  346. data/rspec-mocks/upstream/features/old_syntax/stub_chain.feature +69 -0
  347. data/rspec-mocks/upstream/features/old_syntax/unstub.feature +43 -0
  348. data/rspec-mocks/upstream/features/outside_rspec/minitest.feature +80 -0
  349. data/rspec-mocks/upstream/features/outside_rspec/standalone.feature +33 -0
  350. data/rspec-mocks/upstream/features/setting_constraints/README.md +6 -0
  351. data/rspec-mocks/upstream/features/setting_constraints/matching_arguments.feature +97 -0
  352. data/rspec-mocks/upstream/features/setting_constraints/message_order.feature +63 -0
  353. data/rspec-mocks/upstream/features/setting_constraints/receive_counts.feature +189 -0
  354. data/rspec-mocks/upstream/features/step_definitions/additional_cli_steps.rb +21 -0
  355. data/rspec-mocks/upstream/features/support/disallow_certain_apis.rb +24 -0
  356. data/rspec-mocks/upstream/features/support/env.rb +22 -0
  357. data/rspec-mocks/upstream/features/support/rubinius.rb +6 -0
  358. data/rspec-mocks/upstream/features/verifying_doubles/README.md +13 -0
  359. data/rspec-mocks/upstream/features/verifying_doubles/class_doubles.feature +70 -0
  360. data/rspec-mocks/upstream/features/verifying_doubles/dynamic_classes.feature +73 -0
  361. data/rspec-mocks/upstream/features/verifying_doubles/instance_doubles.feature +101 -0
  362. data/rspec-mocks/upstream/features/verifying_doubles/object_doubles.feature +62 -0
  363. data/rspec-mocks/upstream/features/verifying_doubles/partial_doubles.feature +34 -0
  364. data/rspec-mocks/upstream/features/working_with_legacy_code/README.md +3 -0
  365. data/rspec-mocks/upstream/features/working_with_legacy_code/any_instance.feature +115 -0
  366. data/rspec-mocks/upstream/features/working_with_legacy_code/message_chains.feature +79 -0
  367. data/rspec-mocks/upstream/lib/rspec/mocks.rb +126 -0
  368. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance.rb +10 -0
  369. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/chain.rb +109 -0
  370. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
  371. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expectation_chain.rb +48 -0
  372. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/message_chains.rb +85 -0
  373. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/proxy.rb +116 -0
  374. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/recorder.rb +267 -0
  375. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
  376. data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain_chain.rb +27 -0
  377. data/rspec-mocks/upstream/lib/rspec/mocks/argument_list_matcher.rb +72 -0
  378. data/rspec-mocks/upstream/lib/rspec/mocks/argument_matchers.rb +282 -0
  379. data/rspec-mocks/upstream/lib/rspec/mocks/configuration.rb +157 -0
  380. data/rspec-mocks/upstream/lib/rspec/mocks/error_generator.rb +253 -0
  381. data/rspec-mocks/upstream/lib/rspec/mocks/example_methods.rb +379 -0
  382. data/rspec-mocks/upstream/lib/rspec/mocks/instance_method_stasher.rb +135 -0
  383. data/rspec-mocks/upstream/lib/rspec/mocks/marshal_extension.rb +41 -0
  384. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
  385. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/have_received.rb +121 -0
  386. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive.rb +106 -0
  387. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_message_chain.rb +66 -0
  388. data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_messages.rb +71 -0
  389. data/rspec-mocks/upstream/lib/rspec/mocks/message_chain.rb +91 -0
  390. data/rspec-mocks/upstream/lib/rspec/mocks/message_expectation.rb +694 -0
  391. data/rspec-mocks/upstream/lib/rspec/mocks/method_double.rb +260 -0
  392. data/rspec-mocks/upstream/lib/rspec/mocks/method_reference.rb +155 -0
  393. data/rspec-mocks/upstream/lib/rspec/mocks/mutate_const.rb +324 -0
  394. data/rspec-mocks/upstream/lib/rspec/mocks/object_reference.rb +91 -0
  395. data/rspec-mocks/upstream/lib/rspec/mocks/order_group.rb +81 -0
  396. data/rspec-mocks/upstream/lib/rspec/mocks/proxy.rb +431 -0
  397. data/rspec-mocks/upstream/lib/rspec/mocks/space.rb +221 -0
  398. data/rspec-mocks/upstream/lib/rspec/mocks/standalone.rb +3 -0
  399. data/rspec-mocks/upstream/lib/rspec/mocks/syntax.rb +329 -0
  400. data/rspec-mocks/upstream/lib/rspec/mocks/targets.rb +97 -0
  401. data/rspec-mocks/upstream/lib/rspec/mocks/test_double.rb +135 -0
  402. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_double.rb +127 -0
  403. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_message_expecation.rb +62 -0
  404. data/rspec-mocks/upstream/lib/rspec/mocks/verifying_proxy.rb +171 -0
  405. data/rspec-mocks/upstream/lib/rspec/mocks/version.rb +9 -0
  406. data/rspec-mocks/upstream/maintenance-branch +1 -0
  407. data/rspec-mocks/upstream/rspec-mocks.gemspec +44 -0
  408. data/rspec-mocks/upstream/script/clone_all_rspec_repos +24 -0
  409. data/rspec-mocks/upstream/script/functions.sh +168 -0
  410. data/rspec-mocks/upstream/script/ignores +55 -0
  411. data/rspec-mocks/upstream/script/list_method_cache_busters.sh +22 -0
  412. data/rspec-mocks/upstream/script/run_build +28 -0
  413. data/rspec-support/upstream/.gitignore +19 -0
  414. data/rspec-support/upstream/.rspec +4 -0
  415. data/rspec-support/upstream/.rubocop.yml +1 -0
  416. data/rspec-support/upstream/.rubocop_rspec_base.yml +130 -0
  417. data/rspec-support/upstream/.travis.yml +35 -0
  418. data/rspec-support/upstream/Changelog.md +77 -0
  419. data/rspec-support/upstream/Gemfile +21 -0
  420. data/rspec-support/upstream/LICENSE.txt +22 -0
  421. data/rspec-support/upstream/README.md +17 -0
  422. data/rspec-support/upstream/Rakefile +30 -0
  423. data/rspec-support/upstream/benchmarks/caller.rb +81 -0
  424. data/rspec-support/upstream/lib/rspec/support.rb +76 -0
  425. data/rspec-support/upstream/lib/rspec/support/caller_filter.rb +63 -0
  426. data/rspec-support/upstream/lib/rspec/support/differ.rb +214 -0
  427. data/rspec-support/upstream/lib/rspec/support/directory_maker.rb +61 -0
  428. data/rspec-support/upstream/lib/rspec/support/encoded_string.rb +69 -0
  429. data/rspec-support/upstream/lib/rspec/support/fuzzy_matcher.rb +48 -0
  430. data/rspec-support/upstream/lib/rspec/support/hunk_generator.rb +47 -0
  431. data/rspec-support/upstream/lib/rspec/support/matcher_definition.rb +31 -0
  432. data/rspec-support/upstream/lib/rspec/support/method_signature_verifier.rb +272 -0
  433. data/rspec-support/upstream/lib/rspec/support/os.rb +18 -0
  434. data/rspec-support/upstream/lib/rspec/support/recursive_const_methods.rb +76 -0
  435. data/rspec-support/upstream/lib/rspec/support/ruby_features.rb +45 -0
  436. data/rspec-support/upstream/lib/rspec/support/spec.rb +72 -0
  437. data/rspec-support/upstream/lib/rspec/support/spec/deprecation_helpers.rb +60 -0
  438. data/rspec-support/upstream/lib/rspec/support/spec/formatting_support.rb +9 -0
  439. data/rspec-support/upstream/lib/rspec/support/spec/in_sub_process.rb +43 -0
  440. data/rspec-support/upstream/lib/rspec/support/spec/prevent_load_time_warnings.rb +44 -0
  441. data/rspec-support/upstream/lib/rspec/support/spec/shell_out.rb +69 -0
  442. data/rspec-support/upstream/lib/rspec/support/spec/stderr_splitter.rb +52 -0
  443. data/rspec-support/upstream/lib/rspec/support/spec/with_isolated_directory.rb +9 -0
  444. data/rspec-support/upstream/lib/rspec/support/spec/with_isolated_stderr.rb +13 -0
  445. data/rspec-support/upstream/lib/rspec/support/version.rb +7 -0
  446. data/rspec-support/upstream/lib/rspec/support/version_checker.rb +53 -0
  447. data/rspec-support/upstream/lib/rspec/support/warnings.rb +39 -0
  448. data/rspec-support/upstream/maintenance-branch +1 -0
  449. data/rspec-support/upstream/rspec-support.gemspec +34 -0
  450. data/rspec-support/upstream/script/clone_all_rspec_repos +24 -0
  451. data/rspec-support/upstream/script/functions.sh +168 -0
  452. data/rspec-support/upstream/script/run_build +28 -0
  453. data/rspec/upstream/.document +2 -0
  454. data/rspec/upstream/.gitignore +11 -0
  455. data/rspec/upstream/Gemfile +7 -0
  456. data/rspec/upstream/License.txt +24 -0
  457. data/rspec/upstream/README.md +47 -0
  458. data/rspec/upstream/Rakefile +25 -0
  459. data/rspec/upstream/certs/rspec.pem +22 -0
  460. data/rspec/upstream/lib/rspec.rb +3 -0
  461. data/rspec/upstream/lib/rspec/version.rb +5 -0
  462. data/rspec/upstream/rspec.gemspec +40 -0
  463. metadata +462 -53
  464. data/rspec-core/spec/files_to_exclude.txt +0 -12
  465. data/rspec-core/spec/filters.rb +0 -211
  466. data/rspec-core/spec/fixes/missing_constants.rb +0 -34
  467. data/rspec-core/spec/fixes/sandboxing.rb +0 -72
  468. data/rspec-core/spec/fixes/shared_examples.rb +0 -6
  469. data/rspec-core/spec/requires.rb +0 -41
  470. data/rspec-expectations/spec/files_to_exclude.txt +0 -2
  471. data/rspec-expectations/spec/filters.rb +0 -188
  472. data/rspec-expectations/spec/fixes/missing_constants.rb +0 -10
  473. data/rspec-expectations/spec/fixes/shared_examples.rb +0 -15
  474. data/rspec-expectations/spec/requires.rb +0 -32
  475. data/rspec-mocks/spec/files_to_exclude.txt +0 -11
  476. data/rspec-mocks/spec/filters.rb +0 -98
  477. data/rspec-mocks/spec/fixes/shared_examples.rb +0 -6
  478. data/rspec-mocks/spec/requires.rb +0 -22
  479. data/rspec-support/spec/files_to_exclude.txt +0 -26
  480. data/rspec-support/spec/filters.rb +0 -17
  481. data/rspec-support/spec/fixes/missing_constants.rb +0 -3
  482. data/rspec-support/spec/fixes/shared_examples.rb +0 -4
  483. data/rspec-support/spec/requires.rb +0 -30
  484. data/spec-opal-passing/spec_helper.rb +0 -3
  485. data/spec-opal-passing/tautology_spec.rb +0 -21
  486. data/spec-opal-rspec/core/example_group_spec.rb +0 -145
  487. data/spec-opal-rspec/core/failed_example_notification_spec.rb +0 -31
  488. data/spec-opal-rspec/core/hooks_spec.rb +0 -113
  489. data/spec-opal-rspec/core/memoized_helpers_spec.rb +0 -36
  490. data/spec-opal-rspec/core/metadata_spec.rb +0 -48
  491. data/spec-opal-rspec/expectations/be_instance_of_spec.rb +0 -11
  492. data/spec-opal-rspec/expectations/dsl_spec.rb +0 -66
  493. data/spec-opal-rspec/expectations/expectation_target_spec.rb +0 -21
  494. data/spec-opal-rspec/expectations/yield_spec.rb +0 -11
  495. data/spec-opal/after_hooks_spec.rb +0 -142
  496. data/spec-opal/around_hooks_spec.rb +0 -77
  497. data/spec-opal/async_spec.rb +0 -134
  498. data/spec-opal/before_hooks_spec.rb +0 -185
  499. data/spec-opal/browser-formatter/opal_browser_formatter_spec.rb +0 -14
  500. data/spec-opal/example_spec.rb +0 -176
  501. data/spec-opal/legacy_async_spec.rb +0 -189
  502. data/spec-opal/matchers_spec.rb +0 -207
  503. data/spec-opal/mock_spec.rb +0 -65
  504. data/spec-opal/other/color_on_by_default_spec.rb +0 -9
  505. data/spec-opal/other/dummy_spec.rb +0 -5
  506. data/spec-opal/other/formatter_dependency.rb +0 -3
  507. data/spec-opal/other/ignored_spec.opal +0 -5
  508. data/spec-opal/other/test_formatter.rb +0 -9
  509. data/spec-opal/should_syntax_spec.rb +0 -19
  510. data/spec-opal/skip_pending_spec.rb +0 -45
  511. data/spec-opal/spec_helper.rb +0 -8
  512. data/spec-opal/sprockets_runner_js_errors.rb.erb +0 -18
  513. data/spec-opal/subject_spec.rb +0 -89
@@ -0,0 +1,336 @@
1
+ module RSpec
2
+ module Core
3
+ # @private
4
+ #
5
+ # Methods used internally by the backports.
6
+ #
7
+ # This code was (mostly) ported from the backports gem found at
8
+ # https://github.com/marcandre/backports which is subject to this license:
9
+ #
10
+ # =========================================================================
11
+ #
12
+ # Copyright (c) 2009 Marc-Andre Lafortune
13
+ #
14
+ # Permission is hereby granted, free of charge, to any person obtaining
15
+ # a copy of this software and associated documentation files (the
16
+ # "Software"), to deal in the Software without restriction, including
17
+ # without limitation the rights to use, copy, modify, merge, publish,
18
+ # distribute, sublicense, and/or sell copies of the Software, and to
19
+ # permit persons to whom the Software is furnished to do so, subject to
20
+ # the following conditions:
21
+ #
22
+ # The above copyright notice and this permission notice shall be
23
+ # included in all copies or substantial portions of the Software.
24
+ #
25
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
+ #
33
+ # =========================================================================
34
+ #
35
+ # The goal is to provide a random number generator in Ruby versions that do
36
+ # not have one. This was added to support localization of random spec
37
+ # ordering.
38
+ #
39
+ # These were in multiple files in backports, but merged into one here.
40
+ module Backports
41
+ # Helper method to coerce a value into a specific class.
42
+ # Raises a TypeError if the coercion fails or the returned value
43
+ # is not of the right class.
44
+ # (from Rubinius)
45
+ def self.coerce_to(obj, cls, meth)
46
+ return obj if obj.kind_of?(cls)
47
+
48
+ begin
49
+ ret = obj.__send__(meth)
50
+ rescue Exception => e
51
+ raise TypeError, "Coercion error: #{obj.inspect}.#{meth} => #{cls} failed:\n" \
52
+ "(#{e.message})"
53
+ end
54
+ raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.kind_of? cls
55
+ ret
56
+ end
57
+
58
+ # @private
59
+ def self.coerce_to_int(obj)
60
+ coerce_to(obj, Integer, :to_int)
61
+ end
62
+
63
+ # Used internally to make it easy to deal with optional arguments
64
+ # (from Rubinius)
65
+ Undefined = Object.new
66
+
67
+ # @private
68
+ class Random
69
+ # @private
70
+ # An implementation of Mersenne Twister MT19937 in Ruby
71
+ class MT19937
72
+ STATE_SIZE = 624
73
+ LAST_STATE = STATE_SIZE - 1
74
+ PAD_32_BITS = 0xffffffff
75
+
76
+ # See seed=
77
+ def initialize(seed)
78
+ self.seed = seed
79
+ end
80
+
81
+ LAST_31_BITS = 0x7fffffff
82
+ OFFSET = 397
83
+
84
+ # Generates a completely new state out of the previous one.
85
+ def next_state
86
+ STATE_SIZE.times do |i|
87
+ mix = @state[i] & 0x80000000 | @state[i+1 - STATE_SIZE] & 0x7fffffff
88
+ @state[i] = @state[i+OFFSET - STATE_SIZE] ^ (mix >> 1)
89
+ @state[i] ^= 0x9908b0df if mix.odd?
90
+ end
91
+ @last_read = -1
92
+ end
93
+
94
+ # Seed must be either an Integer (only the first 32 bits will be used)
95
+ # or an Array of Integers (of which only the first 32 bits will be used)
96
+ #
97
+ # No conversion or type checking is done at this level
98
+ def seed=(seed)
99
+ case seed
100
+ when Integer
101
+ @state = Array.new(STATE_SIZE)
102
+ @state[0] = seed & PAD_32_BITS
103
+ (1..LAST_STATE).each do |i|
104
+ @state[i] = (1812433253 * (@state[i-1] ^ @state[i-1]>>30) + i)& PAD_32_BITS
105
+ end
106
+ @last_read = LAST_STATE
107
+ when Array
108
+ self.seed = 19650218
109
+ i=1
110
+ j=0
111
+ [STATE_SIZE, seed.size].max.times do
112
+ @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1664525) + j + seed[j] & PAD_32_BITS
113
+ if (i+=1) >= STATE_SIZE
114
+ @state[0] = @state[-1]
115
+ i = 1
116
+ end
117
+ j = 0 if (j+=1) >= seed.size
118
+ end
119
+ (STATE_SIZE-1).times do
120
+ @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1566083941) - i & PAD_32_BITS
121
+ if (i+=1) >= STATE_SIZE
122
+ @state[0] = @state[-1]
123
+ i = 1
124
+ end
125
+ end
126
+ @state[0] = 0x80000000
127
+ else
128
+ raise ArgumentError, "Seed must be an Integer or an Array"
129
+ end
130
+ end
131
+
132
+ # Returns a random Integer from the range 0 ... (1 << 32)
133
+ def random_32_bits
134
+ next_state if @last_read >= LAST_STATE
135
+ @last_read += 1
136
+ y = @state[@last_read]
137
+ # Tempering
138
+ y ^= (y >> 11)
139
+ y ^= (y << 7) & 0x9d2c5680
140
+ y ^= (y << 15) & 0xefc60000
141
+ y ^= (y >> 18)
142
+ end
143
+
144
+ # Supplement the MT19937 class with methods to do
145
+ # conversions the same way as MRI.
146
+ # No argument checking is done here either.
147
+
148
+ FLOAT_FACTOR = 1.0/9007199254740992.0
149
+ # generates a random number on [0,1) with 53-bit resolution
150
+ def random_float
151
+ ((random_32_bits >> 5) * 67108864.0 + (random_32_bits >> 6)) * FLOAT_FACTOR;
152
+ end
153
+
154
+ # Returns an integer within 0...upto
155
+ def random_integer(upto)
156
+ n = upto - 1
157
+ nb_full_32 = 0
158
+ while n > PAD_32_BITS
159
+ n >>= 32
160
+ nb_full_32 += 1
161
+ end
162
+ mask = mask_32_bits(n)
163
+ begin
164
+ rand = random_32_bits & mask
165
+ nb_full_32.times do
166
+ rand <<= 32
167
+ rand |= random_32_bits
168
+ end
169
+ end until rand < upto
170
+ rand
171
+ end
172
+
173
+ def random_bytes(nb)
174
+ nb_32_bits = (nb + 3) / 4
175
+ random = nb_32_bits.times.map { random_32_bits }
176
+ random.pack("L" * nb_32_bits)[0, nb]
177
+ end
178
+
179
+ def state_as_bignum
180
+ b = 0
181
+ @state.each_with_index do |val, i|
182
+ b |= val << (32 * i)
183
+ end
184
+ b
185
+ end
186
+
187
+ def left # It's actually the number of words left + 1, as per MRI...
188
+ MT19937::STATE_SIZE - @last_read
189
+ end
190
+
191
+ def marshal_dump
192
+ [state_as_bignum, left]
193
+ end
194
+
195
+ def marshal_load(ary)
196
+ b, left = ary
197
+ @last_read = MT19937::STATE_SIZE - left
198
+ @state = Array.new(STATE_SIZE)
199
+ STATE_SIZE.times do |i|
200
+ @state[i] = b & PAD_32_BITS
201
+ b >>= 32
202
+ end
203
+ end
204
+
205
+ # Convert an Integer seed of arbitrary size to either a single 32 bit integer, or an Array of 32 bit integers
206
+ def self.convert_seed(seed)
207
+ seed = seed.abs
208
+ long_values = []
209
+ begin
210
+ long_values << (seed & PAD_32_BITS)
211
+ seed >>= 32
212
+ end until seed == 0
213
+
214
+ long_values.pop if long_values[-1] == 1 && long_values.size > 1 # Done to allow any kind of sequence of integers
215
+
216
+ long_values.size > 1 ? long_values : long_values.first
217
+ end
218
+
219
+ def self.[](seed)
220
+ new(convert_seed(seed))
221
+ end
222
+
223
+ private
224
+
225
+ MASK_BY = [1,2,4,8,16]
226
+ def mask_32_bits(n)
227
+ MASK_BY.each do |shift|
228
+ n |= n >> shift
229
+ end
230
+ n
231
+ end
232
+ end
233
+
234
+ # @private
235
+ # Implementation corresponding to the actual Random class of Ruby
236
+ # The actual random generator (mersenne twister) is in MT19937.
237
+ # Ruby specific conversions are handled in bits_and_bytes.
238
+ # The high level stuff (argument checking) is done here.
239
+ module Implementation
240
+ attr_reader :seed
241
+
242
+ def initialize(seed = 0)
243
+ super()
244
+ seed_rand seed
245
+ end
246
+
247
+ def seed_rand(new_seed = 0)
248
+ new_seed = Backports.coerce_to_int(new_seed)
249
+ @seed = nil unless defined?(@seed)
250
+ old, @seed = @seed, new_seed.nonzero? || Random.new_seed
251
+ @mt = MT19937[ @seed ]
252
+ old
253
+ end
254
+
255
+ def rand(limit = Backports::Undefined)
256
+ case limit
257
+ when Backports::Undefined
258
+ @mt.random_float
259
+ when Float
260
+ limit * @mt.random_float unless limit <= 0
261
+ when Range
262
+ _rand_range(limit)
263
+ else
264
+ limit = Backports.coerce_to_int(limit)
265
+ @mt.random_integer(limit) unless limit <= 0
266
+ end || raise(ArgumentError, "invalid argument #{limit}")
267
+ end
268
+
269
+ def bytes(nb)
270
+ nb = Backports.coerce_to_int(nb)
271
+ raise ArgumentError, "negative size" if nb < 0
272
+ @mt.random_bytes(nb)
273
+ end
274
+
275
+ def ==(other)
276
+ other.is_a?(Random) &&
277
+ seed == other.seed &&
278
+ left == other.send(:left) &&
279
+ state == other.send(:state)
280
+ end
281
+
282
+ def marshal_dump
283
+ @mt.marshal_dump << @seed
284
+ end
285
+
286
+ def marshal_load(ary)
287
+ @seed = ary.pop
288
+ @mt = MT19937.allocate
289
+ @mt.marshal_load(ary)
290
+ end
291
+
292
+ private
293
+
294
+ def state
295
+ @mt.state_as_bignum
296
+ end
297
+
298
+ def left
299
+ @mt.left
300
+ end
301
+
302
+ def _rand_range(limit)
303
+ range = limit.end - limit.begin
304
+ if (!range.is_a?(Float)) && range.respond_to?(:to_int) && range = Backports.coerce_to_int(range)
305
+ range += 1 unless limit.exclude_end?
306
+ limit.begin + @mt.random_integer(range) unless range <= 0
307
+ elsif range = Backports.coerce_to(range, Float, :to_f)
308
+ if range < 0
309
+ nil
310
+ elsif limit.exclude_end?
311
+ limit.begin + @mt.random_float * range unless range <= 0
312
+ else
313
+ # cheat a bit... this will reduce the nb of random bits
314
+ loop do
315
+ r = @mt.random_float * range * 1.0001
316
+ break limit.begin + r unless r > range
317
+ end
318
+ end
319
+ end
320
+ end
321
+ end
322
+
323
+ def self.new_seed
324
+ (2 ** 62) + Kernel.rand(2 ** 62)
325
+ end
326
+ end
327
+
328
+ class Random
329
+ include Implementation
330
+ class << self
331
+ include Implementation
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
@@ -0,0 +1,66 @@
1
+ module RSpec
2
+ module Core
3
+ # @private
4
+ class BacktraceFormatter
5
+ # @private
6
+ attr_accessor :exclusion_patterns, :inclusion_patterns
7
+
8
+ def initialize
9
+ @full_backtrace = false
10
+
11
+ patterns = %w[ /lib\d*/ruby/ bin/ exe/rspec ]
12
+ patterns << "org/jruby/" if RUBY_PLATFORM == 'java'
13
+ patterns.map! { |s| Regexp.new(s.gsub("/", File::SEPARATOR)) }
14
+
15
+ @exclusion_patterns = [Regexp.union(RSpec::CallerFilter::IGNORE_REGEX, *patterns)]
16
+ @inclusion_patterns = []
17
+
18
+ return unless matches?(@exclusion_patterns, File.join(Dir.getwd, "lib", "foo.rb:13"))
19
+ inclusion_patterns << Regexp.new(Dir.getwd)
20
+ end
21
+
22
+ attr_writer :full_backtrace
23
+
24
+ def full_backtrace?
25
+ @full_backtrace || exclusion_patterns.empty?
26
+ end
27
+
28
+ def filter_gem(gem_name)
29
+ sep = File::SEPARATOR
30
+ exclusion_patterns << /#{sep}#{gem_name}(-[^#{sep}]+)?#{sep}/
31
+ end
32
+
33
+ def format_backtrace(backtrace, options={})
34
+ return backtrace if options[:full_backtrace]
35
+
36
+ backtrace.map { |l| backtrace_line(l) }.compact.
37
+ tap do |filtered|
38
+ if filtered.empty?
39
+ filtered.concat backtrace
40
+ filtered << ""
41
+ filtered << " Showing full backtrace because every line was filtered out."
42
+ filtered << " See docs for RSpec::Configuration#backtrace_exclusion_patterns and"
43
+ filtered << " RSpec::Configuration#backtrace_inclusion_patterns for more information."
44
+ end
45
+ end
46
+ end
47
+
48
+ def backtrace_line(line)
49
+ Metadata.relative_path(line) unless exclude?(line)
50
+ rescue SecurityError
51
+ nil
52
+ end
53
+
54
+ def exclude?(line)
55
+ return false if @full_backtrace
56
+ matches?(exclusion_patterns, line) && !matches?(inclusion_patterns, line)
57
+ end
58
+
59
+ private
60
+
61
+ def matches?(patterns, line)
62
+ patterns.any? { |p| line =~ p }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,1440 @@
1
+ RSpec::Support.require_rspec_core "backtrace_formatter"
2
+ RSpec::Support.require_rspec_core "ruby_project"
3
+ RSpec::Support.require_rspec_core "formatters/deprecation_formatter"
4
+
5
+ module RSpec
6
+ module Core
7
+ # rubocop:disable Style/ClassLength
8
+
9
+ # Stores runtime configuration information.
10
+ #
11
+ # Configuration options are loaded from `~/.rspec`, `.rspec`,
12
+ # `.rspec-local`, command line switches, and the `SPEC_OPTS` environment
13
+ # variable (listed in lowest to highest precedence; for example, an option
14
+ # in `~/.rspec` can be overridden by an option in `.rspec-local`).
15
+ #
16
+ # @example Standard settings
17
+ # RSpec.configure do |c|
18
+ # c.drb = true
19
+ # c.drb_port = 1234
20
+ # c.default_path = 'behavior'
21
+ # end
22
+ #
23
+ # @example Hooks
24
+ # RSpec.configure do |c|
25
+ # c.before(:suite) { establish_connection }
26
+ # c.before(:example) { log_in_as :authorized }
27
+ # c.around(:example) { |ex| Database.transaction(&ex) }
28
+ # end
29
+ #
30
+ # @see RSpec.configure
31
+ # @see Hooks
32
+ class Configuration
33
+ include RSpec::Core::Hooks
34
+
35
+ # @private
36
+ class MustBeConfiguredBeforeExampleGroupsError < StandardError; end
37
+
38
+ # @private
39
+ def self.define_reader(name)
40
+ define_method(name) do
41
+ variable = instance_variable_defined?("@#{name}") ? instance_variable_get("@#{name}") : nil
42
+ value_for(name, variable)
43
+ end
44
+ end
45
+
46
+ # @private
47
+ def self.define_aliases(name, alias_name)
48
+ alias_method alias_name, name
49
+ alias_method "#{alias_name}=", "#{name}="
50
+ define_predicate_for alias_name
51
+ end
52
+
53
+ # @private
54
+ def self.define_predicate_for(*names)
55
+ names.each { |name| alias_method "#{name}?", name }
56
+ end
57
+
58
+ # @private
59
+ #
60
+ # Invoked by the `add_setting` instance method. Use that method on a
61
+ # `Configuration` instance rather than this class method.
62
+ def self.add_setting(name, opts={})
63
+ raise "Use the instance add_setting method if you want to set a default" if opts.key?(:default)
64
+ attr_writer name
65
+ add_read_only_setting name
66
+
67
+ Array(opts[:alias_with]).each do |alias_name|
68
+ define_aliases(name, alias_name)
69
+ end
70
+ end
71
+
72
+ # @private
73
+ #
74
+ # As `add_setting` but only add the reader
75
+ def self.add_read_only_setting(name, opts={})
76
+ raise "Use the instance add_setting method if you want to set a default" if opts.key?(:default)
77
+ define_reader name
78
+ define_predicate_for name
79
+ end
80
+
81
+ # @macro [attach] add_setting
82
+ # @!attribute [rw] $1
83
+ # @!method $1=(value)
84
+ #
85
+ # @macro [attach] define_reader
86
+ # @!attribute [r] $1
87
+
88
+ # @macro add_setting
89
+ # Path to use if no path is provided to the `rspec` command (default:
90
+ # `"spec"`). Allows you to just type `rspec` instead of `rspec spec` to
91
+ # run all the examples in the `spec` directory.
92
+ #
93
+ # Note: Other scripts invoking `rspec` indirectly will ignore this
94
+ # setting.
95
+ add_setting :default_path
96
+
97
+ # @macro add_setting
98
+ # Run examples over DRb (default: `false`). RSpec doesn't supply the DRb
99
+ # server, but you can use tools like spork.
100
+ add_setting :drb
101
+
102
+ # @macro add_setting
103
+ # The drb_port (default: nil).
104
+ add_setting :drb_port
105
+
106
+ # @macro add_setting
107
+ # Default: `$stderr`.
108
+ add_setting :error_stream
109
+
110
+ # Indicates if the DSL has been exposed off of modules and `main`.
111
+ # Default: true
112
+ def expose_dsl_globally?
113
+ Core::DSL.exposed_globally?
114
+ end
115
+
116
+ # Use this to expose the core RSpec DSL via `Module` and the `main`
117
+ # object. It will be set automatically but you can override it to
118
+ # remove the DSL.
119
+ # Default: true
120
+ def expose_dsl_globally=(value)
121
+ if value
122
+ Core::DSL.expose_globally!
123
+ Core::SharedExampleGroup::TopLevelDSL.expose_globally!
124
+ else
125
+ Core::DSL.remove_globally!
126
+ Core::SharedExampleGroup::TopLevelDSL.remove_globally!
127
+ end
128
+ end
129
+
130
+ # Determines where deprecation warnings are printed.
131
+ # Defaults to `$stderr`.
132
+ # @return [IO, String] IO to write to or filename to write to
133
+ define_reader :deprecation_stream
134
+
135
+ # Determines where deprecation warnings are printed.
136
+ # @param value [IO, String] IO to write to or filename to write to
137
+ def deprecation_stream=(value)
138
+ if @reporter && !value.equal?(@deprecation_stream)
139
+ warn "RSpec's reporter has already been initialized with " \
140
+ "#{deprecation_stream.inspect} as the deprecation stream, so your change to "\
141
+ "`deprecation_stream` will be ignored. You should configure it earlier for " \
142
+ "it to take effect, or use the `--deprecation-out` CLI option. " \
143
+ "(Called from #{CallerFilter.first_non_rspec_line})"
144
+ else
145
+ @deprecation_stream = value
146
+ end
147
+ end
148
+
149
+ # @macro add_setting
150
+ # Clean up and exit after the first failure (default: `false`).
151
+ add_setting :fail_fast
152
+
153
+ # @macro add_setting
154
+ # Prints the formatter output of your suite without running any
155
+ # examples or hooks.
156
+ add_setting :dry_run
157
+
158
+ # @macro add_setting
159
+ # The exit code to return if there are any failures (default: 1).
160
+ add_setting :failure_exit_code
161
+
162
+ # @macro define_reader
163
+ # Indicates files configured to be required
164
+ define_reader :requires
165
+
166
+ # @macro define_reader
167
+ # Returns dirs that have been prepended to the load path by the `-I` command line option
168
+ define_reader :libs
169
+
170
+ # @macro add_setting
171
+ # Determines where RSpec will send its output.
172
+ # Default: `$stdout`.
173
+ define_reader :output_stream
174
+
175
+ # Set the output stream for reporter
176
+ # @attr value [IO] value for output, defaults to $stdout
177
+ def output_stream=(value)
178
+ if @reporter && !value.equal?(@output_stream)
179
+ warn "RSpec's reporter has already been initialized with " \
180
+ "#{output_stream.inspect} as the output stream, so your change to "\
181
+ "`output_stream` will be ignored. You should configure it earlier for " \
182
+ "it to take effect. (Called from #{CallerFilter.first_non_rspec_line})"
183
+ else
184
+ @output_stream = value
185
+ end
186
+ end
187
+
188
+ # @macro define_reader
189
+ # Load files matching this pattern (default: `'**{,/*/**}/*_spec.rb'`)
190
+ define_reader :pattern
191
+
192
+ # Set pattern to match files to load
193
+ # @attr value [String] the filename pattern to filter spec files by
194
+ def pattern=(value)
195
+ update_pattern_attr :pattern, value
196
+ end
197
+
198
+ # @macro define_reader
199
+ # Exclude files matching this pattern
200
+ define_reader :exclude_pattern
201
+
202
+ # Set pattern to match files to exclude
203
+ # @attr value [String] the filename pattern to exclude spec files by
204
+ def exclude_pattern=(value)
205
+ update_pattern_attr :exclude_pattern, value
206
+ end
207
+
208
+ # @macro add_setting
209
+ # Report the times for the slowest examples (default: `false`).
210
+ # Use this to specify the number of examples to include in the profile.
211
+ add_setting :profile_examples
212
+
213
+ # @macro add_setting
214
+ # Run all examples if none match the configured filters (default: `false`).
215
+ add_setting :run_all_when_everything_filtered
216
+
217
+ # @macro add_setting
218
+ # Color to use to indicate success.
219
+ # @param color [Symbol] defaults to `:green` but can be set to one of the
220
+ # following: `[:black, :white, :red, :green, :yellow,
221
+ # :blue, :magenta, :cyan]`
222
+ add_setting :success_color
223
+
224
+ # @macro add_setting
225
+ # Color to use to print pending examples.
226
+ # @param color [Symbol] defaults to `:yellow` but can be set to one of the
227
+ # following: `[:black, :white, :red, :green, :yellow,
228
+ # :blue, :magenta, :cyan]`
229
+ add_setting :pending_color
230
+
231
+ # @macro add_setting
232
+ # Color to use to indicate failure.
233
+ # @param color [Symbol] defaults to `:red` but can be set to one of the
234
+ # following: `[:black, :white, :red, :green, :yellow,
235
+ # :blue, :magenta, :cyan]`
236
+ add_setting :failure_color
237
+
238
+ # @macro add_setting
239
+ # The default output color.
240
+ # @param color [Symbol] defaults to `:white` but can be set to one of the
241
+ # following:`[:black, :white, :red, :green, :yellow,
242
+ # :blue, :magenta, :cyan]`
243
+ add_setting :default_color
244
+
245
+ # @macro add_setting
246
+ # Color used when a pending example is fixed.
247
+ # @param color [Symbol] defaults to `:blue` but can be set to one of the
248
+ # following: `[:black, :white, :red, :green, :yellow,
249
+ # :blue, :magenta, :cyan]`
250
+ add_setting :fixed_color
251
+
252
+ # @macro add_setting
253
+ # Color used to print details.
254
+ # @param color [Symbol] defaults to `:cyan` but can be set to one of the
255
+ # following: `[:black, :white, :red, :green, :yellow,
256
+ # :blue, :magenta, :cyan]`
257
+ add_setting :detail_color
258
+
259
+ # Deprecated. This config option was added in RSpec 2 to pave the way
260
+ # for this being the default behavior in RSpec 3. Now this option is
261
+ # a no-op.
262
+ def treat_symbols_as_metadata_keys_with_true_values=(_value)
263
+ RSpec.deprecate("RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values=",
264
+ :message => "RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values= " \
265
+ "is deprecated, it is now set to true as default and setting it to false has no effect.")
266
+ end
267
+
268
+ # Record the start time of the spec suite to measure load time
269
+ add_setting :start_time
270
+
271
+ # @private
272
+ add_setting :tty
273
+ # @private
274
+ add_setting :include_or_extend_modules
275
+ # @private
276
+ attr_writer :files_to_run
277
+ # @private
278
+ add_setting :expecting_with_rspec
279
+ # @private
280
+ attr_accessor :filter_manager
281
+ # @private
282
+ attr_reader :backtrace_formatter, :ordering_manager
283
+
284
+ def initialize
285
+ # rubocop:disable Style/GlobalVars
286
+ @start_time = $_rspec_core_load_started_at || ::RSpec::Core::Time.now
287
+ # rubocop:enable Style/GlobalVars
288
+ @expectation_frameworks = []
289
+ @include_or_extend_modules = []
290
+ @mock_framework = nil
291
+ @files_or_directories_to_run = []
292
+ @color = false
293
+ @pattern = '**{,/*/**}/*_spec.rb'
294
+ @exclude_pattern = ''
295
+ @failure_exit_code = 1
296
+ @spec_files_loaded = false
297
+
298
+ @backtrace_formatter = BacktraceFormatter.new
299
+
300
+ @default_path = 'spec'
301
+ @deprecation_stream = $stderr
302
+ @output_stream = $stdout
303
+ @reporter = nil
304
+ @reporter_buffer = nil
305
+ @filter_manager = FilterManager.new
306
+ @ordering_manager = Ordering::ConfigurationManager.new
307
+ @preferred_options = {}
308
+ @failure_color = :red
309
+ @success_color = :green
310
+ @pending_color = :yellow
311
+ @default_color = :white
312
+ @fixed_color = :blue
313
+ @detail_color = :cyan
314
+ @profile_examples = false
315
+ @requires = []
316
+ @libs = []
317
+ @derived_metadata_blocks = []
318
+ end
319
+
320
+ # @private
321
+ #
322
+ # Used to set higher priority option values from the command line.
323
+ def force(hash)
324
+ ordering_manager.force(hash)
325
+ @preferred_options.merge!(hash)
326
+ end
327
+
328
+ # @private
329
+ def reset
330
+ @spec_files_loaded = false
331
+ @reporter = nil
332
+ @formatter_loader = nil
333
+ end
334
+
335
+ # @overload add_setting(name)
336
+ # @overload add_setting(name, opts)
337
+ # @option opts [Symbol] :default
338
+ #
339
+ # set a default value for the generated getter and predicate methods:
340
+ #
341
+ # add_setting(:foo, :default => "default value")
342
+ #
343
+ # @option opts [Symbol] :alias_with
344
+ #
345
+ # Use `:alias_with` to alias the setter, getter, and predicate to another
346
+ # name, or names:
347
+ #
348
+ # add_setting(:foo, :alias_with => :bar)
349
+ # add_setting(:foo, :alias_with => [:bar, :baz])
350
+ #
351
+ # Adds a custom setting to the RSpec.configuration object.
352
+ #
353
+ # RSpec.configuration.add_setting :foo
354
+ #
355
+ # Used internally and by extension frameworks like rspec-rails, so they
356
+ # can add config settings that are domain specific. For example:
357
+ #
358
+ # RSpec.configure do |c|
359
+ # c.add_setting :use_transactional_fixtures,
360
+ # :default => true,
361
+ # :alias_with => :use_transactional_examples
362
+ # end
363
+ #
364
+ # `add_setting` creates three methods on the configuration object, a
365
+ # setter, a getter, and a predicate:
366
+ #
367
+ # RSpec.configuration.foo=(value)
368
+ # RSpec.configuration.foo
369
+ # RSpec.configuration.foo? # returns true if foo returns anything but nil or false
370
+ def add_setting(name, opts={})
371
+ default = opts.delete(:default)
372
+ (class << self; self; end).class_exec do
373
+ add_setting(name, opts)
374
+ end
375
+ __send__("#{name}=", default) if default
376
+ end
377
+
378
+ # Returns the configured mock framework adapter module
379
+ def mock_framework
380
+ if @mock_framework.nil?
381
+ begin
382
+ mock_with :rspec
383
+ rescue LoadError
384
+ mock_with :nothing
385
+ end
386
+ end
387
+ @mock_framework
388
+ end
389
+
390
+ # Delegates to mock_framework=(framework)
391
+ def mock_framework=(framework)
392
+ mock_with framework
393
+ end
394
+
395
+ # Regexps used to exclude lines from backtraces.
396
+ #
397
+ # Excludes lines from ruby (and jruby) source, installed gems, anything
398
+ # in any "bin" directory, and any of the rspec libs (outside gem
399
+ # installs) by default.
400
+ #
401
+ # You can modify the list via the getter, or replace it with the setter.
402
+ #
403
+ # To override this behaviour and display a full backtrace, use
404
+ # `--backtrace`on the command line, in a `.rspec` file, or in the
405
+ # `rspec_options` attribute of RSpec's rake task.
406
+ def backtrace_exclusion_patterns
407
+ @backtrace_formatter.exclusion_patterns
408
+ end
409
+
410
+ # Set regular expressions used to exclude lines in backtrace
411
+ # @param patterns [Regexp] set the backtrace exlusion pattern
412
+ def backtrace_exclusion_patterns=(patterns)
413
+ @backtrace_formatter.exclusion_patterns = patterns
414
+ end
415
+
416
+ # Regexps used to include lines in backtraces.
417
+ #
418
+ # Defaults to [Regexp.new Dir.getwd].
419
+ #
420
+ # Lines that match an exclusion _and_ an inclusion pattern
421
+ # will be included.
422
+ #
423
+ # You can modify the list via the getter, or replace it with the setter.
424
+ def backtrace_inclusion_patterns
425
+ @backtrace_formatter.inclusion_patterns
426
+ end
427
+
428
+ # Set regular expressions used to include lines in backtrace
429
+ # @attr patterns [Regexp] set backtrace_formatter inclusion_patterns
430
+ def backtrace_inclusion_patterns=(patterns)
431
+ @backtrace_formatter.inclusion_patterns = patterns
432
+ end
433
+
434
+ # Adds {#backtrace_exclusion_patterns} that will filter lines from
435
+ # the named gems from backtraces.
436
+ #
437
+ # @param gem_names [Array<String>] Names of the gems to filter
438
+ #
439
+ # @example
440
+ # RSpec.configure do |config|
441
+ # config.filter_gems_from_backtrace "rack", "rake"
442
+ # end
443
+ #
444
+ # @note The patterns this adds will match the named gems in their common
445
+ # locations (e.g. system gems, vendored with bundler, installed as a
446
+ # :git dependency with bundler, etc) but is not guaranteed to work for
447
+ # all possible gem locations. For example, if you have the gem source
448
+ # in a directory with a completely unrelated name, and use bundler's
449
+ # :path option, this will not filter it.
450
+ def filter_gems_from_backtrace(*gem_names)
451
+ gem_names.each do |name|
452
+ @backtrace_formatter.filter_gem(name)
453
+ end
454
+ end
455
+
456
+ # @private
457
+ MOCKING_ADAPTERS = {
458
+ :rspec => :RSpec,
459
+ :flexmock => :Flexmock,
460
+ :rr => :RR,
461
+ :mocha => :Mocha,
462
+ :nothing => :Null
463
+ }
464
+
465
+ # Sets the mock framework adapter module.
466
+ #
467
+ # `framework` can be a Symbol or a Module.
468
+ #
469
+ # Given any of `:rspec`, `:mocha`, `:flexmock`, or `:rr`, configures the
470
+ # named framework.
471
+ #
472
+ # Given `:nothing`, configures no framework. Use this if you don't use
473
+ # any mocking framework to save a little bit of overhead.
474
+ #
475
+ # Given a Module, includes that module in every example group. The module
476
+ # should adhere to RSpec's mock framework adapter API:
477
+ #
478
+ # setup_mocks_for_rspec
479
+ # - called before each example
480
+ #
481
+ # verify_mocks_for_rspec
482
+ # - called after each example if the example hasn't yet failed.
483
+ # Framework should raise an exception when expectations fail
484
+ #
485
+ # teardown_mocks_for_rspec
486
+ # - called after verify_mocks_for_rspec (even if there are errors)
487
+ #
488
+ # If the module responds to `configuration` and `mock_with` receives a block,
489
+ # it will yield the configuration object to the block e.g.
490
+ #
491
+ # config.mock_with OtherMockFrameworkAdapter do |mod_config|
492
+ # mod_config.custom_setting = true
493
+ # end
494
+ def mock_with(framework)
495
+ framework_module =
496
+ if framework.is_a?(Module)
497
+ framework
498
+ else
499
+ const_name = MOCKING_ADAPTERS.fetch(framework) do
500
+ raise ArgumentError,
501
+ "Unknown mocking framework: #{framework.inspect}. " \
502
+ "Pass a module or one of #{MOCKING_ADAPTERS.keys.inspect}"
503
+ end
504
+
505
+ RSpec::Support.require_rspec_core "mocking_adapters/#{const_name.to_s.downcase}"
506
+ RSpec::Core::MockingAdapters.const_get(const_name)
507
+ end
508
+
509
+ new_name, old_name = [framework_module, @mock_framework].map do |mod|
510
+ mod.respond_to?(:framework_name) ? mod.framework_name : :unnamed
511
+ end
512
+
513
+ unless new_name == old_name
514
+ assert_no_example_groups_defined(:mock_framework)
515
+ end
516
+
517
+ if block_given?
518
+ raise "#{framework_module} must respond to `configuration` so that mock_with can yield it." unless framework_module.respond_to?(:configuration)
519
+ yield framework_module.configuration
520
+ end
521
+
522
+ @mock_framework = framework_module
523
+ end
524
+
525
+ # Returns the configured expectation framework adapter module(s)
526
+ def expectation_frameworks
527
+ if @expectation_frameworks.empty?
528
+ begin
529
+ expect_with :rspec
530
+ rescue LoadError
531
+ expect_with Module.new
532
+ end
533
+ end
534
+ @expectation_frameworks
535
+ end
536
+
537
+ # Delegates to expect_with(framework)
538
+ def expectation_framework=(framework)
539
+ expect_with(framework)
540
+ end
541
+
542
+ # Sets the expectation framework module(s) to be included in each example
543
+ # group.
544
+ #
545
+ # `frameworks` can be `:rspec`, `:test_unit`, `:minitest`, a custom
546
+ # module, or any combination thereof:
547
+ #
548
+ # config.expect_with :rspec
549
+ # config.expect_with :test_unit
550
+ # config.expect_with :minitest
551
+ # config.expect_with :rspec, :minitest
552
+ # config.expect_with OtherExpectationFramework
553
+ #
554
+ # RSpec will translate `:rspec`, `:minitest`, and `:test_unit` into the
555
+ # appropriate modules.
556
+ #
557
+ # ## Configuration
558
+ #
559
+ # If the module responds to `configuration`, `expect_with` will
560
+ # yield the `configuration` object if given a block:
561
+ #
562
+ # config.expect_with OtherExpectationFramework do |custom_config|
563
+ # custom_config.custom_setting = true
564
+ # end
565
+ def expect_with(*frameworks)
566
+ modules = frameworks.map do |framework|
567
+ case framework
568
+ when Module
569
+ framework
570
+ when :rspec
571
+ require 'rspec/expectations'
572
+ self.expecting_with_rspec = true
573
+ ::RSpec::Matchers
574
+ when :test_unit
575
+ require 'rspec/core/test_unit_assertions_adapter'
576
+ ::RSpec::Core::TestUnitAssertionsAdapter
577
+ when :minitest
578
+ require 'rspec/core/minitest_assertions_adapter'
579
+ ::RSpec::Core::MinitestAssertionsAdapter
580
+ else
581
+ raise ArgumentError, "#{framework.inspect} is not supported"
582
+ end
583
+ end
584
+
585
+ if (modules - @expectation_frameworks).any?
586
+ assert_no_example_groups_defined(:expect_with)
587
+ end
588
+
589
+ if block_given?
590
+ raise "expect_with only accepts a block with a single argument. Call expect_with #{modules.length} times, once with each argument, instead." if modules.length > 1
591
+ raise "#{modules.first} must respond to `configuration` so that expect_with can yield it." unless modules.first.respond_to?(:configuration)
592
+ yield modules.first.configuration
593
+ end
594
+
595
+ @expectation_frameworks.push(*modules)
596
+ end
597
+
598
+ # Check if full backtrace is enabled
599
+ # @return [Boolean] is full backtrace enabled
600
+ def full_backtrace?
601
+ @backtrace_formatter.full_backtrace?
602
+ end
603
+
604
+ # Toggle full backtrace
605
+ # @attr true_or_false [Boolean] toggle full backtrace display
606
+ def full_backtrace=(true_or_false)
607
+ @backtrace_formatter.full_backtrace = true_or_false
608
+ end
609
+
610
+ # Returns the configuration option for color, but should not
611
+ # be used to check if color is supported.
612
+ #
613
+ # @see color_enabled?
614
+ # @return [Boolean]
615
+ def color
616
+ value_for(:color, @color)
617
+ end
618
+
619
+ # Check if color is enabled for a particular output
620
+ # @param output [IO] an output stream to use, defaults to the current
621
+ # `output_stream`
622
+ # @return [Boolean]
623
+ def color_enabled?(output=output_stream)
624
+ output_to_tty?(output) && color
625
+ end
626
+
627
+ # Toggle output color
628
+ # @attr true_or_false [Boolean] toggle color enabled
629
+ def color=(true_or_false)
630
+ return unless true_or_false
631
+
632
+ if RSpec.world.windows_os? && !ENV['ANSICON']
633
+ RSpec.warning "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
634
+ @color = false
635
+ else
636
+ @color = true
637
+ end
638
+ end
639
+
640
+ # @private
641
+ def libs=(libs)
642
+ libs.map do |lib|
643
+ @libs.unshift lib
644
+ $LOAD_PATH.unshift lib
645
+ end
646
+ end
647
+
648
+ # Run examples matching on `description` in all files to run.
649
+ # @param description [String, Regexp] the pattern to filter on
650
+ def full_description=(description)
651
+ filter_run :full_description => Regexp.union(*Array(description).map { |d| Regexp.new(d) })
652
+ end
653
+
654
+ # @return [Array] full description filter
655
+ def full_description
656
+ filter.fetch :full_description, nil
657
+ end
658
+
659
+ # @overload add_formatter(formatter)
660
+ #
661
+ # Adds a formatter to the formatters collection. `formatter` can be a
662
+ # string representing any of the built-in formatters (see
663
+ # `built_in_formatter`), or a custom formatter class.
664
+ #
665
+ # ### Note
666
+ #
667
+ # For internal purposes, `add_formatter` also accepts the name of a class
668
+ # and paths to use for output streams, but you should consider that a
669
+ # private api that may change at any time without notice.
670
+ def add_formatter(formatter_to_use, *paths)
671
+ paths << output_stream if paths.empty?
672
+ formatter_loader.add formatter_to_use, *paths
673
+ end
674
+ alias_method :formatter=, :add_formatter
675
+
676
+ # The formatter that will be used if no formatter has been set.
677
+ # Defaults to 'progress'.
678
+ def default_formatter
679
+ formatter_loader.default_formatter
680
+ end
681
+
682
+ # Sets a fallback formatter to use if none other has been set.
683
+ #
684
+ # @example
685
+ #
686
+ # RSpec.configure do |rspec|
687
+ # rspec.default_formatter = 'doc'
688
+ # end
689
+ def default_formatter=(value)
690
+ formatter_loader.default_formatter = value
691
+ end
692
+
693
+ # Returns a duplicate of the formatters currently loaded in
694
+ # the `FormatterLoader` for introspection.
695
+ #
696
+ # Note as this is a duplicate, any mutations will be disregarded.
697
+ #
698
+ # @return [Array] the formatters currently loaded
699
+ def formatters
700
+ formatter_loader.formatters.dup
701
+ end
702
+
703
+ # @private
704
+ def formatter_loader
705
+ @formatter_loader ||= Formatters::Loader.new(Reporter.new(self))
706
+ end
707
+
708
+ # @private
709
+ #
710
+ # This buffer is used to capture all messages sent to the reporter during
711
+ # reporter initialization. It can then replay those messages after the
712
+ # formatter is correctly initialized. Otherwise, deprecation warnings
713
+ # during formatter initialization can cause an infinite loop.
714
+ class DeprecationReporterBuffer
715
+ def initialize
716
+ @calls = []
717
+ end
718
+
719
+ def deprecation(*args)
720
+ @calls << args
721
+ end
722
+
723
+ def play_onto(reporter)
724
+ @calls.each do |args|
725
+ reporter.deprecation(*args)
726
+ end
727
+ end
728
+ end
729
+
730
+ # @private
731
+ def reporter
732
+ # @reporter_buffer should only ever be set in this method to cover
733
+ # initialization of @reporter.
734
+ @reporter_buffer || @reporter ||=
735
+ begin
736
+ @reporter_buffer = DeprecationReporterBuffer.new
737
+ formatter_loader.setup_default output_stream, deprecation_stream
738
+ @reporter_buffer.play_onto(formatter_loader.reporter)
739
+ @reporter_buffer = nil
740
+ formatter_loader.reporter
741
+ end
742
+ end
743
+
744
+ # @api private
745
+ #
746
+ # Defaults `profile_examples` to 10 examples when `@profile_examples` is `true`.
747
+ #
748
+ def profile_examples
749
+ profile = value_for(:profile_examples, @profile_examples)
750
+ if profile && !profile.is_a?(Integer)
751
+ 10
752
+ else
753
+ profile
754
+ end
755
+ end
756
+
757
+ # @private
758
+ def files_or_directories_to_run=(*files)
759
+ files = files.flatten
760
+ files << default_path if (command == 'rspec' || Runner.running_in_drb?) && default_path && files.empty?
761
+ @files_or_directories_to_run = files
762
+ @files_to_run = nil
763
+ end
764
+
765
+ # The spec files RSpec will run
766
+ # @return [Array] specified files about to run
767
+ def files_to_run
768
+ @files_to_run ||= get_files_to_run(@files_or_directories_to_run)
769
+ end
770
+
771
+ # Creates a method that delegates to `example` including the submitted
772
+ # `args`. Used internally to add variants of `example` like `pending`:
773
+ # @param name [String] example name alias
774
+ # @param args [Array<Symbol>, Hash] metadata for the generated example
775
+ #
776
+ # @note The specific example alias below (`pending`) is already
777
+ # defined for you.
778
+ # @note Use with caution. This extends the language used in your
779
+ # specs, but does not add any additional documentation. We use this
780
+ # in rspec to define methods like `focus` and `xit`, but we also add
781
+ # docs for those methods.
782
+ #
783
+ # @example
784
+ # RSpec.configure do |config|
785
+ # config.alias_example_to :pending, :pending => true
786
+ # end
787
+ #
788
+ # # This lets you do this:
789
+ #
790
+ # describe Thing do
791
+ # pending "does something" do
792
+ # thing = Thing.new
793
+ # end
794
+ # end
795
+ #
796
+ # # ... which is the equivalent of
797
+ #
798
+ # describe Thing do
799
+ # it "does something", :pending => true do
800
+ # thing = Thing.new
801
+ # end
802
+ # end
803
+ def alias_example_to(name, *args)
804
+ extra_options = Metadata.build_hash_from(args)
805
+ RSpec::Core::ExampleGroup.define_example_method(name, extra_options)
806
+ end
807
+
808
+ # Creates a method that defines an example group with the provided
809
+ # metadata. Can be used to define example group/metadata shortcuts.
810
+ #
811
+ # @example
812
+ # RSpec.configure do |config|
813
+ # config.alias_example_group_to :describe_model, :type => :model
814
+ # end
815
+ #
816
+ # shared_context_for "model tests", :type => :model do
817
+ # # define common model test helper methods, `let` declarations, etc
818
+ # end
819
+ #
820
+ # # This lets you do this:
821
+ #
822
+ # RSpec.describe_model User do
823
+ # end
824
+ #
825
+ # # ... which is the equivalent of
826
+ #
827
+ # RSpec.describe User, :type => :model do
828
+ # end
829
+ #
830
+ # @note The defined aliased will also be added to the top level
831
+ # (e.g. `main` and from within modules) if
832
+ # `expose_dsl_globally` is set to true.
833
+ # @see #alias_example_to
834
+ # @see #expose_dsl_globally=
835
+ def alias_example_group_to(new_name, *args)
836
+ extra_options = Metadata.build_hash_from(args)
837
+ RSpec::Core::ExampleGroup.define_example_group_method(new_name, extra_options)
838
+ end
839
+
840
+ # Define an alias for it_should_behave_like that allows different
841
+ # language (like "it_has_behavior" or "it_behaves_like") to be
842
+ # employed when including shared examples.
843
+ #
844
+ # @example
845
+ # RSpec.configure do |config|
846
+ # config.alias_it_behaves_like_to(:it_has_behavior, 'has behavior:')
847
+ # end
848
+ #
849
+ # # allows the user to include a shared example group like:
850
+ #
851
+ # describe Entity do
852
+ # it_has_behavior 'sortability' do
853
+ # let(:sortable) { Entity.new }
854
+ # end
855
+ # end
856
+ #
857
+ # # which is reported in the output as:
858
+ # # Entity
859
+ # # has behavior: sortability
860
+ # # ...sortability examples here
861
+ #
862
+ # @note Use with caution. This extends the language used in your
863
+ # specs, but does not add any additional documentation. We use this
864
+ # in rspec to define `it_should_behave_like` (for backward
865
+ # compatibility), but we also add docs for that method.
866
+ def alias_it_behaves_like_to(new_name, report_label='')
867
+ RSpec::Core::ExampleGroup.define_nested_shared_group_method(new_name, report_label)
868
+ end
869
+ alias_method :alias_it_should_behave_like_to, :alias_it_behaves_like_to
870
+
871
+ # Adds key/value pairs to the `inclusion_filter`. If `args`
872
+ # includes any symbols that are not part of the hash, each symbol
873
+ # is treated as a key in the hash with the value `true`.
874
+ #
875
+ # ### Note
876
+ #
877
+ # Filters set using this method can be overridden from the command line
878
+ # or config files (e.g. `.rspec`).
879
+ #
880
+ # @example
881
+ # # given this declaration
882
+ # describe "something", :foo => 'bar' do
883
+ # # ...
884
+ # end
885
+ #
886
+ # # any of the following will include that group
887
+ # config.filter_run_including :foo => 'bar'
888
+ # config.filter_run_including :foo => /^ba/
889
+ # config.filter_run_including :foo => lambda {|v| v == 'bar'}
890
+ # config.filter_run_including :foo => lambda {|v,m| m[:foo] == 'bar'}
891
+ #
892
+ # # given a proc with an arity of 1, the lambda is passed the value related to the key, e.g.
893
+ # config.filter_run_including :foo => lambda {|v| v == 'bar'}
894
+ #
895
+ # # given a proc with an arity of 2, the lambda is passed the value related to the key,
896
+ # # and the metadata itself e.g.
897
+ # config.filter_run_including :foo => lambda {|v,m| m[:foo] == 'bar'}
898
+ #
899
+ # filter_run_including :foo # same as filter_run_including :foo => true
900
+ def filter_run_including(*args)
901
+ meta = Metadata.build_hash_from(args, :warn_about_example_group_filtering)
902
+ filter_manager.include_with_low_priority meta
903
+ end
904
+
905
+ alias_method :filter_run, :filter_run_including
906
+
907
+ # Clears and reassigns the `inclusion_filter`. Set to `nil` if you don't
908
+ # want any inclusion filter at all.
909
+ #
910
+ # ### Warning
911
+ #
912
+ # This overrides any inclusion filters/tags set on the command line or in
913
+ # configuration files.
914
+ def inclusion_filter=(filter)
915
+ meta = Metadata.build_hash_from([filter], :warn_about_example_group_filtering)
916
+ filter_manager.include_only meta
917
+ end
918
+
919
+ alias_method :filter=, :inclusion_filter=
920
+
921
+ # Returns the `inclusion_filter`. If none has been set, returns an empty
922
+ # hash.
923
+ def inclusion_filter
924
+ filter_manager.inclusions
925
+ end
926
+
927
+ alias_method :filter, :inclusion_filter
928
+
929
+ # Adds key/value pairs to the `exclusion_filter`. If `args`
930
+ # includes any symbols that are not part of the hash, each symbol
931
+ # is treated as a key in the hash with the value `true`.
932
+ #
933
+ # ### Note
934
+ #
935
+ # Filters set using this method can be overridden from the command line
936
+ # or config files (e.g. `.rspec`).
937
+ #
938
+ # @example
939
+ # # given this declaration
940
+ # describe "something", :foo => 'bar' do
941
+ # # ...
942
+ # end
943
+ #
944
+ # # any of the following will exclude that group
945
+ # config.filter_run_excluding :foo => 'bar'
946
+ # config.filter_run_excluding :foo => /^ba/
947
+ # config.filter_run_excluding :foo => lambda {|v| v == 'bar'}
948
+ # config.filter_run_excluding :foo => lambda {|v,m| m[:foo] == 'bar'}
949
+ #
950
+ # # given a proc with an arity of 1, the lambda is passed the value related to the key, e.g.
951
+ # config.filter_run_excluding :foo => lambda {|v| v == 'bar'}
952
+ #
953
+ # # given a proc with an arity of 2, the lambda is passed the value related to the key,
954
+ # # and the metadata itself e.g.
955
+ # config.filter_run_excluding :foo => lambda {|v,m| m[:foo] == 'bar'}
956
+ #
957
+ # filter_run_excluding :foo # same as filter_run_excluding :foo => true
958
+ def filter_run_excluding(*args)
959
+ meta = Metadata.build_hash_from(args, :warn_about_example_group_filtering)
960
+ filter_manager.exclude_with_low_priority meta
961
+ end
962
+
963
+ # Clears and reassigns the `exclusion_filter`. Set to `nil` if you don't
964
+ # want any exclusion filter at all.
965
+ #
966
+ # ### Warning
967
+ #
968
+ # This overrides any exclusion filters/tags set on the command line or in
969
+ # configuration files.
970
+ def exclusion_filter=(filter)
971
+ meta = Metadata.build_hash_from([filter], :warn_about_example_group_filtering)
972
+ filter_manager.exclude_only meta
973
+ end
974
+
975
+ # Returns the `exclusion_filter`. If none has been set, returns an empty
976
+ # hash.
977
+ def exclusion_filter
978
+ filter_manager.exclusions
979
+ end
980
+
981
+ # Tells RSpec to include `mod` in example groups. Methods defined in
982
+ # `mod` are exposed to examples (not example groups). Use `filters` to
983
+ # constrain the groups in which to include the module.
984
+ #
985
+ # @example
986
+ #
987
+ # module AuthenticationHelpers
988
+ # def login_as(user)
989
+ # # ...
990
+ # end
991
+ # end
992
+ #
993
+ # module UserHelpers
994
+ # def users(username)
995
+ # # ...
996
+ # end
997
+ # end
998
+ #
999
+ # RSpec.configure do |config|
1000
+ # config.include(UserHelpers) # included in all modules
1001
+ # config.include(AuthenticationHelpers, :type => :request)
1002
+ # end
1003
+ #
1004
+ # describe "edit profile", :type => :request do
1005
+ # it "can be viewed by owning user" do
1006
+ # login_as users(:jdoe)
1007
+ # get "/profiles/jdoe"
1008
+ # assert_select ".username", :text => 'jdoe'
1009
+ # end
1010
+ # end
1011
+ #
1012
+ # @see #extend
1013
+ def include(mod, *filters)
1014
+ meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
1015
+ include_or_extend_modules << [:include, mod, meta]
1016
+ end
1017
+
1018
+ # Tells RSpec to extend example groups with `mod`. Methods defined in
1019
+ # `mod` are exposed to example groups (not examples). Use `filters` to
1020
+ # constrain the groups to extend.
1021
+ #
1022
+ # Similar to `include`, but behavior is added to example groups, which
1023
+ # are classes, rather than the examples, which are instances of those
1024
+ # classes.
1025
+ #
1026
+ # @example
1027
+ #
1028
+ # module UiHelpers
1029
+ # def run_in_browser
1030
+ # # ...
1031
+ # end
1032
+ # end
1033
+ #
1034
+ # RSpec.configure do |config|
1035
+ # config.extend(UiHelpers, :type => :request)
1036
+ # end
1037
+ #
1038
+ # describe "edit profile", :type => :request do
1039
+ # run_in_browser
1040
+ #
1041
+ # it "does stuff in the client" do
1042
+ # # ...
1043
+ # end
1044
+ # end
1045
+ #
1046
+ # @see #include
1047
+ def extend(mod, *filters)
1048
+ meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
1049
+ include_or_extend_modules << [:extend, mod, meta]
1050
+ end
1051
+
1052
+ # @private
1053
+ #
1054
+ # Used internally to extend a group with modules using `include` and/or
1055
+ # `extend`.
1056
+ def configure_group(group)
1057
+ include_or_extend_modules.each do |include_or_extend, mod, filters|
1058
+ next unless filters.empty? || group.any_apply?(filters)
1059
+ __send__("safe_#{include_or_extend}", mod, group)
1060
+ end
1061
+ end
1062
+
1063
+ # @private
1064
+ def safe_include(mod, host)
1065
+ host.__send__(:include, mod) unless host < mod
1066
+ end
1067
+
1068
+ # @private
1069
+ def requires=(paths)
1070
+ directories = ['lib', default_path].select { |p| File.directory? p }
1071
+ RSpec::Core::RubyProject.add_to_load_path(*directories)
1072
+ paths.each { |path| require path }
1073
+ @requires += paths
1074
+ end
1075
+
1076
+ # @private
1077
+ if RUBY_VERSION.to_f >= 1.9
1078
+ # @private
1079
+ def safe_extend(mod, host)
1080
+ host.extend(mod) unless host.singleton_class < mod
1081
+ end
1082
+ else
1083
+ # @private
1084
+ def safe_extend(mod, host)
1085
+ host.extend(mod) unless (class << host; self; end).included_modules.include?(mod)
1086
+ end
1087
+ end
1088
+
1089
+ # @private
1090
+ def configure_mock_framework
1091
+ RSpec::Core::ExampleGroup.__send__(:include, mock_framework)
1092
+ conditionally_disable_mocks_monkey_patching
1093
+ end
1094
+
1095
+ # @private
1096
+ def configure_expectation_framework
1097
+ expectation_frameworks.each do |framework|
1098
+ RSpec::Core::ExampleGroup.__send__(:include, framework)
1099
+ end
1100
+ conditionally_disable_expectations_monkey_patching
1101
+ end
1102
+
1103
+ # @private
1104
+ def load_spec_files
1105
+ files_to_run.uniq.each { |f| load File.expand_path(f) }
1106
+ @spec_files_loaded = true
1107
+ end
1108
+
1109
+ # @private
1110
+ DEFAULT_FORMATTER = lambda { |string| string }
1111
+
1112
+ # Formats the docstring output using the block provided.
1113
+ #
1114
+ # @example
1115
+ # # This will strip the descriptions of both examples and example groups.
1116
+ # RSpec.configure do |config|
1117
+ # config.format_docstrings { |s| s.strip }
1118
+ # end
1119
+ def format_docstrings(&block)
1120
+ @format_docstrings_block = block_given? ? block : DEFAULT_FORMATTER
1121
+ end
1122
+
1123
+ # @private
1124
+ def format_docstrings_block
1125
+ @format_docstrings_block ||= DEFAULT_FORMATTER
1126
+ end
1127
+
1128
+ # @private
1129
+ # @macro [attach] delegate_to_ordering_manager
1130
+ # @!method $1
1131
+ def self.delegate_to_ordering_manager(*methods)
1132
+ methods.each do |method|
1133
+ define_method method do |*args, &block|
1134
+ ordering_manager.__send__(method, *args, &block)
1135
+ end
1136
+ end
1137
+ end
1138
+
1139
+ # @macro delegate_to_ordering_manager
1140
+ #
1141
+ # Sets the seed value and sets the default global ordering to random.
1142
+ delegate_to_ordering_manager :seed=
1143
+
1144
+ # @macro delegate_to_ordering_manager
1145
+ # Seed for random ordering (default: generated randomly each run).
1146
+ #
1147
+ # When you run specs with `--order random`, RSpec generates a random seed
1148
+ # for the randomization and prints it to the `output_stream` (assuming
1149
+ # you're using RSpec's built-in formatters). If you discover an ordering
1150
+ # dependency (i.e. examples fail intermittently depending on order), set
1151
+ # this (on Configuration or on the command line with `--seed`) to run
1152
+ # using the same seed while you debug the issue.
1153
+ #
1154
+ # We recommend, actually, that you use the command line approach so you
1155
+ # don't accidentally leave the seed encoded.
1156
+ delegate_to_ordering_manager :seed
1157
+
1158
+ # @macro delegate_to_ordering_manager
1159
+ #
1160
+ # Sets the default global order and, if order is `'rand:<seed>'`, also sets the seed.
1161
+ delegate_to_ordering_manager :order=
1162
+
1163
+ # @macro delegate_to_ordering_manager
1164
+ # Registers a named ordering strategy that can later be
1165
+ # used to order an example group's subgroups by adding
1166
+ # `:order => <name>` metadata to the example group.
1167
+ #
1168
+ # @param name [Symbol] The name of the ordering.
1169
+ # @yield Block that will order the given examples or example groups
1170
+ # @yieldparam list [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGroup>] The examples or groups to order
1171
+ # @yieldreturn [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGroup>] The re-ordered examples or groups
1172
+ #
1173
+ # @example
1174
+ # RSpec.configure do |rspec|
1175
+ # rspec.register_ordering :reverse do |list|
1176
+ # list.reverse
1177
+ # end
1178
+ # end
1179
+ #
1180
+ # describe MyClass, :order => :reverse do
1181
+ # # ...
1182
+ # end
1183
+ #
1184
+ # @note Pass the symbol `:global` to set the ordering strategy that
1185
+ # will be used to order the top-level example groups and any example
1186
+ # groups that do not have declared `:order` metadata.
1187
+ delegate_to_ordering_manager :register_ordering
1188
+
1189
+ # @private
1190
+ delegate_to_ordering_manager :seed_used?, :ordering_registry
1191
+
1192
+ # Set Ruby warnings on or off
1193
+ def warnings=(value)
1194
+ $VERBOSE = !!value
1195
+ end
1196
+
1197
+ # @return [Boolean] Whether or not ruby warnings are enabled.
1198
+ def warnings?
1199
+ $VERBOSE
1200
+ end
1201
+
1202
+ # Exposes the current running example via the named
1203
+ # helper method. RSpec 2.x exposed this via `example`,
1204
+ # but in RSpec 3.0, the example is instead exposed via
1205
+ # an arg yielded to `it`, `before`, `let`, etc. However,
1206
+ # some extension gems (such as Capybara) depend on the
1207
+ # RSpec 2.x's `example` method, so this config option
1208
+ # can be used to maintain compatibility.
1209
+ #
1210
+ # @param method_name [Symbol] the name of the helper method
1211
+ #
1212
+ # @example
1213
+ #
1214
+ # RSpec.configure do |rspec|
1215
+ # rspec.expose_current_running_example_as :example
1216
+ # end
1217
+ #
1218
+ # describe MyClass do
1219
+ # before do
1220
+ # # `example` can be used here because of the above config.
1221
+ # do_something if example.metadata[:type] == "foo"
1222
+ # end
1223
+ # end
1224
+ def expose_current_running_example_as(method_name)
1225
+ ExposeCurrentExample.module_exec do
1226
+ extend RSpec::SharedContext
1227
+ let(method_name) { |ex| ex }
1228
+ end
1229
+
1230
+ include ExposeCurrentExample
1231
+ end
1232
+
1233
+ # @private
1234
+ module ExposeCurrentExample; end
1235
+
1236
+ # Turns deprecation warnings into errors, in order to surface
1237
+ # the full backtrace of the call site. This can be useful when
1238
+ # you need more context to address a deprecation than the
1239
+ # single-line call site normally provided.
1240
+ #
1241
+ # @example
1242
+ #
1243
+ # RSpec.configure do |rspec|
1244
+ # rspec.raise_errors_for_deprecations!
1245
+ # end
1246
+ def raise_errors_for_deprecations!
1247
+ self.deprecation_stream = Formatters::DeprecationFormatter::RaiseErrorStream.new
1248
+ end
1249
+
1250
+ # Enables zero monkey patching mode for RSpec. It removes monkey
1251
+ # patching of the top-level DSL methods (`describe`,
1252
+ # `shared_examples_for`, etc) onto `main` and `Module`, instead
1253
+ # requiring you to prefix these methods with `RSpec.`. It enables
1254
+ # expect-only syntax for rspec-mocks and rspec-expectations. It
1255
+ # simply disables monkey patching on whatever pieces of rspec
1256
+ # the user is using.
1257
+ #
1258
+ # @note It configures rspec-mocks and rspec-expectations only
1259
+ # if the user is using those (either explicitly or implicitly
1260
+ # by not setting `mock_with` or `expect_with` to anything else).
1261
+ #
1262
+ # @note If the user uses this options with `mock_with :mocha`
1263
+ # (or similiar) they will still have monkey patching active
1264
+ # in their test environment from mocha.
1265
+ #
1266
+ # @example
1267
+ #
1268
+ # # It disables all monkey patching
1269
+ # RSpec.configure do |config|
1270
+ # config.disable_monkey_patching!
1271
+ # end
1272
+ #
1273
+ # # Is an equivalent to
1274
+ # RSpec.configure do |config|
1275
+ # config.expose_dsl_globally = false
1276
+ #
1277
+ # config.mock_with :rspec do |mocks|
1278
+ # mocks.syntax = :expect
1279
+ # mocks.patch_marshal_to_support_partial_doubles = false
1280
+ # end
1281
+ #
1282
+ # config.mock_with :rspec do |expectations|
1283
+ # expectations.syntax = :expect
1284
+ # end
1285
+ # end
1286
+ def disable_monkey_patching!
1287
+ self.expose_dsl_globally = false
1288
+ self.disable_monkey_patching = true
1289
+ conditionally_disable_mocks_monkey_patching
1290
+ conditionally_disable_expectations_monkey_patching
1291
+ end
1292
+
1293
+ # @private
1294
+ attr_accessor :disable_monkey_patching
1295
+
1296
+ # Defines a callback that can assign derived metadata values.
1297
+ #
1298
+ # @param filters [Array<Symbol>, Hash] metadata filters that determine which example
1299
+ # or group metadata hashes the callback will be triggered for. If none are given,
1300
+ # the callback will be run against the metadata hashes of all groups and examples.
1301
+ # @yieldparam metadata [Hash] original metadata hash from an example or group. Mutate this in
1302
+ # your block as needed.
1303
+ #
1304
+ # @example
1305
+ # RSpec.configure do |config|
1306
+ # # Tag all groups and examples in the spec/unit directory with :type => :unit
1307
+ # config.define_derived_metadata(:file_path => %r{/spec/unit/}) do |metadata|
1308
+ # metadata[:type] = :unit
1309
+ # end
1310
+ # end
1311
+ def define_derived_metadata(*filters, &block)
1312
+ meta = Metadata.build_hash_from(filters, :warn_about_example_group_filtering)
1313
+ @derived_metadata_blocks << [meta, block]
1314
+ end
1315
+
1316
+ # @private
1317
+ def apply_derived_metadata_to(metadata)
1318
+ @derived_metadata_blocks.each do |filter, block|
1319
+ block.call(metadata) if filter.empty? || MetadataFilter.any_apply?(filter, metadata)
1320
+ end
1321
+ end
1322
+
1323
+ private
1324
+
1325
+ def get_files_to_run(paths)
1326
+ FlatMap.flat_map(paths_to_check(paths)) do |path|
1327
+ path = path.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
1328
+ File.directory?(path) ? gather_directories(path) : extract_location(path)
1329
+ end.sort.uniq
1330
+ end
1331
+
1332
+ def paths_to_check(paths)
1333
+ return paths if pattern_might_load_specs_from_vendored_dirs?
1334
+ paths + ['.']
1335
+ end
1336
+
1337
+ def pattern_might_load_specs_from_vendored_dirs?
1338
+ pattern.split(File::SEPARATOR).first.include?('**')
1339
+ end
1340
+
1341
+ def gather_directories(path)
1342
+ include_files = get_matching_files(path, pattern)
1343
+ exclude_files = get_matching_files(path, exclude_pattern)
1344
+ (include_files - exclude_files).sort.uniq
1345
+ end
1346
+
1347
+ def get_matching_files(path, pattern)
1348
+ Dir[file_glob_from(path, pattern)].map { |file| File.expand_path(file) }
1349
+ end
1350
+
1351
+ def file_glob_from(path, pattern)
1352
+ stripped = "{#{pattern.gsub(/\s*,\s*/, ',')}}"
1353
+ return stripped if pattern =~ /^(\.\/)?#{Regexp.escape path}/ || absolute_pattern?(pattern)
1354
+ File.join(path, stripped)
1355
+ end
1356
+
1357
+ if RSpec::Support::OS.windows?
1358
+ def absolute_pattern?(pattern)
1359
+ pattern =~ /\A[A-Z]:\\/ || windows_absolute_network_path?(pattern)
1360
+ end
1361
+
1362
+ def windows_absolute_network_path?(pattern)
1363
+ return false unless ::File::ALT_SEPARATOR
1364
+ pattern.start_with?(::File::ALT_SEPARATOR + ::File::ALT_SEPARATOR)
1365
+ end
1366
+ else
1367
+ def absolute_pattern?(pattern)
1368
+ pattern.start_with?(File::Separator)
1369
+ end
1370
+ end
1371
+
1372
+ def extract_location(path)
1373
+ match = /^(.*?)((?:\:\d+)+)$/.match(path)
1374
+
1375
+ if match
1376
+ captures = match.captures
1377
+ path, lines = captures[0], captures[1][1..-1].split(":").map { |n| n.to_i }
1378
+ filter_manager.add_location path, lines
1379
+ end
1380
+
1381
+ return [] if path == default_path
1382
+ path
1383
+ end
1384
+
1385
+ def command
1386
+ $0.split(File::SEPARATOR).last
1387
+ end
1388
+
1389
+ def value_for(key, default=nil)
1390
+ @preferred_options.key?(key) ? @preferred_options[key] : default
1391
+ end
1392
+
1393
+ def assert_no_example_groups_defined(config_option)
1394
+ return unless RSpec.world.example_groups.any?
1395
+
1396
+ raise MustBeConfiguredBeforeExampleGroupsError.new(
1397
+ "RSpec's #{config_option} configuration option must be configured before " \
1398
+ "any example groups are defined, but you have already defined a group."
1399
+ )
1400
+ end
1401
+
1402
+ def output_to_tty?(output=output_stream)
1403
+ tty? || (output.respond_to?(:tty?) && output.tty?)
1404
+ end
1405
+
1406
+ def conditionally_disable_mocks_monkey_patching
1407
+ return unless disable_monkey_patching && rspec_mocks_loaded?
1408
+
1409
+ RSpec::Mocks.configuration.tap do |config|
1410
+ config.syntax = :expect
1411
+ config.patch_marshal_to_support_partial_doubles = false
1412
+ end
1413
+ end
1414
+
1415
+ def conditionally_disable_expectations_monkey_patching
1416
+ return unless disable_monkey_patching && rspec_expectations_loaded?
1417
+
1418
+ RSpec::Expectations.configuration.syntax = :expect
1419
+ end
1420
+
1421
+ def rspec_mocks_loaded?
1422
+ defined?(RSpec::Mocks.configuration)
1423
+ end
1424
+
1425
+ def rspec_expectations_loaded?
1426
+ defined?(RSpec::Expectations.configuration)
1427
+ end
1428
+
1429
+ def update_pattern_attr(name, value)
1430
+ if @spec_files_loaded
1431
+ RSpec.warning "Configuring `#{name}` to #{value} has no effect since RSpec has already loaded the spec files."
1432
+ end
1433
+
1434
+ instance_variable_set(:"@#{name}", value)
1435
+ @files_to_run = nil
1436
+ end
1437
+ end
1438
+ # rubocop:enable Style/ClassLength
1439
+ end
1440
+ end