rspec-core 2.11.1 → 3.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.document +1 -1
  4. data/.yardopts +3 -1
  5. data/Changelog.md +1814 -29
  6. data/{License.txt → LICENSE.md} +6 -4
  7. data/README.md +197 -48
  8. data/exe/rspec +2 -23
  9. data/lib/rspec/autorun.rb +1 -0
  10. data/lib/rspec/core/backtrace_formatter.rb +65 -0
  11. data/lib/rspec/core/bisect/coordinator.rb +62 -0
  12. data/lib/rspec/core/bisect/example_minimizer.rb +173 -0
  13. data/lib/rspec/core/bisect/fork_runner.rb +138 -0
  14. data/lib/rspec/core/bisect/server.rb +61 -0
  15. data/lib/rspec/core/bisect/shell_command.rb +126 -0
  16. data/lib/rspec/core/bisect/shell_runner.rb +73 -0
  17. data/lib/rspec/core/bisect/utilities.rb +69 -0
  18. data/lib/rspec/core/configuration.rb +1846 -407
  19. data/lib/rspec/core/configuration_options.rb +154 -50
  20. data/lib/rspec/core/did_you_mean.rb +46 -0
  21. data/lib/rspec/core/drb.rb +120 -0
  22. data/lib/rspec/core/dsl.rb +90 -18
  23. data/lib/rspec/core/example.rb +488 -152
  24. data/lib/rspec/core/example_group.rb +733 -294
  25. data/lib/rspec/core/example_status_persister.rb +235 -0
  26. data/lib/rspec/core/filter_manager.rb +175 -147
  27. data/lib/rspec/core/flat_map.rb +20 -0
  28. data/lib/rspec/core/formatters/base_bisect_formatter.rb +45 -0
  29. data/lib/rspec/core/formatters/base_formatter.rb +32 -130
  30. data/lib/rspec/core/formatters/base_text_formatter.rb +62 -190
  31. data/lib/rspec/core/formatters/bisect_drb_formatter.rb +29 -0
  32. data/lib/rspec/core/formatters/bisect_progress_formatter.rb +157 -0
  33. data/lib/rspec/core/formatters/console_codes.rb +76 -0
  34. data/lib/rspec/core/formatters/deprecation_formatter.rb +223 -0
  35. data/lib/rspec/core/formatters/documentation_formatter.rb +62 -27
  36. data/lib/rspec/core/formatters/exception_presenter.rb +521 -0
  37. data/lib/rspec/core/formatters/failure_list_formatter.rb +23 -0
  38. data/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
  39. data/lib/rspec/core/formatters/helpers.rb +93 -14
  40. data/lib/rspec/core/formatters/html_formatter.rb +104 -415
  41. data/lib/rspec/core/formatters/html_printer.rb +414 -0
  42. data/lib/rspec/core/formatters/html_snippet_extractor.rb +120 -0
  43. data/lib/rspec/core/formatters/json_formatter.rb +102 -0
  44. data/lib/rspec/core/formatters/profile_formatter.rb +68 -0
  45. data/lib/rspec/core/formatters/progress_formatter.rb +12 -15
  46. data/lib/rspec/core/formatters/protocol.rb +182 -0
  47. data/lib/rspec/core/formatters/snippet_extractor.rb +115 -39
  48. data/lib/rspec/core/formatters/syntax_highlighter.rb +91 -0
  49. data/lib/rspec/core/formatters.rb +279 -0
  50. data/lib/rspec/core/hooks.rb +451 -300
  51. data/lib/rspec/core/invocations.rb +87 -0
  52. data/lib/rspec/core/memoized_helpers.rb +580 -0
  53. data/lib/rspec/core/metadata.rb +395 -173
  54. data/lib/rspec/core/metadata_filter.rb +255 -0
  55. data/lib/rspec/core/minitest_assertions_adapter.rb +31 -0
  56. data/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
  57. data/lib/rspec/core/mocking_adapters/mocha.rb +57 -0
  58. data/lib/rspec/core/mocking_adapters/null.rb +14 -0
  59. data/lib/rspec/core/mocking_adapters/rr.rb +31 -0
  60. data/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
  61. data/lib/rspec/core/notifications.rb +521 -0
  62. data/lib/rspec/core/option_parser.rb +208 -64
  63. data/lib/rspec/core/ordering.rb +169 -0
  64. data/lib/rspec/core/output_wrapper.rb +29 -0
  65. data/lib/rspec/core/pending.rb +115 -59
  66. data/lib/rspec/core/profiler.rb +34 -0
  67. data/lib/rspec/core/project_initializer/.rspec +1 -0
  68. data/lib/rspec/core/project_initializer/spec/spec_helper.rb +98 -0
  69. data/lib/rspec/core/project_initializer.rb +26 -65
  70. data/lib/rspec/core/rake_task.rb +140 -131
  71. data/lib/rspec/core/reporter.rb +207 -44
  72. data/lib/rspec/core/ruby_project.rb +15 -6
  73. data/lib/rspec/core/runner.rb +180 -44
  74. data/lib/rspec/core/sandbox.rb +37 -0
  75. data/lib/rspec/core/set.rb +54 -0
  76. data/lib/rspec/core/shared_context.rb +25 -19
  77. data/lib/rspec/core/shared_example_group.rb +229 -54
  78. data/lib/rspec/core/shell_escape.rb +49 -0
  79. data/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  80. data/lib/rspec/core/version.rb +3 -1
  81. data/lib/rspec/core/warnings.rb +40 -0
  82. data/lib/rspec/core/world.rb +208 -49
  83. data/lib/rspec/core.rb +166 -80
  84. data.tar.gz.sig +0 -0
  85. metadata +230 -445
  86. metadata.gz.sig +0 -0
  87. data/exe/autospec +0 -13
  88. data/features/Autotest.md +0 -38
  89. data/features/README.md +0 -17
  90. data/features/Upgrade.md +0 -364
  91. data/features/command_line/README.md +0 -28
  92. data/features/command_line/example_name_option.feature +0 -101
  93. data/features/command_line/exit_status.feature +0 -83
  94. data/features/command_line/format_option.feature +0 -81
  95. data/features/command_line/init.feature +0 -18
  96. data/features/command_line/line_number_appended_to_path.feature +0 -140
  97. data/features/command_line/line_number_option.feature +0 -58
  98. data/features/command_line/order.feature +0 -29
  99. data/features/command_line/pattern_option.feature +0 -31
  100. data/features/command_line/rake_task.feature +0 -68
  101. data/features/command_line/ruby.feature +0 -22
  102. data/features/command_line/tag.feature +0 -91
  103. data/features/configuration/alias_example_to.feature +0 -48
  104. data/features/configuration/custom_settings.feature +0 -84
  105. data/features/configuration/default_path.feature +0 -38
  106. data/features/configuration/fail_fast.feature +0 -77
  107. data/features/configuration/read_options_from_file.feature +0 -87
  108. data/features/example_groups/basic_structure.feature +0 -55
  109. data/features/example_groups/shared_context.feature +0 -74
  110. data/features/example_groups/shared_examples.feature +0 -204
  111. data/features/expectation_framework_integration/configure_expectation_framework.feature +0 -102
  112. data/features/filtering/exclusion_filters.feature +0 -139
  113. data/features/filtering/if_and_unless.feature +0 -168
  114. data/features/filtering/inclusion_filters.feature +0 -105
  115. data/features/filtering/run_all_when_everything_filtered.feature +0 -46
  116. data/features/formatters/custom_formatter.feature +0 -36
  117. data/features/formatters/text_formatter.feature +0 -46
  118. data/features/helper_methods/arbitrary_methods.feature +0 -40
  119. data/features/helper_methods/let.feature +0 -50
  120. data/features/helper_methods/modules.feature +0 -149
  121. data/features/hooks/around_hooks.feature +0 -343
  122. data/features/hooks/before_and_after_hooks.feature +0 -423
  123. data/features/hooks/filtering.feature +0 -234
  124. data/features/metadata/current_example.feature +0 -17
  125. data/features/metadata/described_class.feature +0 -17
  126. data/features/metadata/user_defined.feature +0 -113
  127. data/features/mock_framework_integration/use_any_framework.feature +0 -106
  128. data/features/mock_framework_integration/use_flexmock.feature +0 -96
  129. data/features/mock_framework_integration/use_mocha.feature +0 -97
  130. data/features/mock_framework_integration/use_rr.feature +0 -98
  131. data/features/mock_framework_integration/use_rspec.feature +0 -97
  132. data/features/pending/pending_examples.feature +0 -229
  133. data/features/spec_files/arbitrary_file_suffix.feature +0 -13
  134. data/features/step_definitions/additional_cli_steps.rb +0 -30
  135. data/features/subject/attribute_of_subject.feature +0 -124
  136. data/features/subject/explicit_subject.feature +0 -82
  137. data/features/subject/implicit_receiver.feature +0 -29
  138. data/features/subject/implicit_subject.feature +0 -63
  139. data/features/support/env.rb +0 -12
  140. data/lib/autotest/discover.rb +0 -1
  141. data/lib/autotest/rspec2.rb +0 -73
  142. data/lib/rspec/core/backward_compatibility.rb +0 -65
  143. data/lib/rspec/core/command_line.rb +0 -36
  144. data/lib/rspec/core/deprecation.rb +0 -36
  145. data/lib/rspec/core/drb_command_line.rb +0 -26
  146. data/lib/rspec/core/drb_options.rb +0 -87
  147. data/lib/rspec/core/extensions/instance_eval_with_args.rb +0 -44
  148. data/lib/rspec/core/extensions/kernel.rb +0 -9
  149. data/lib/rspec/core/extensions/module_eval_with_args.rb +0 -38
  150. data/lib/rspec/core/extensions/ordered.rb +0 -21
  151. data/lib/rspec/core/extensions.rb +0 -4
  152. data/lib/rspec/core/formatters/text_mate_formatter.rb +0 -34
  153. data/lib/rspec/core/let.rb +0 -110
  154. data/lib/rspec/core/load_path.rb +0 -3
  155. data/lib/rspec/core/metadata_hash_builder.rb +0 -97
  156. data/lib/rspec/core/mocking/with_absolutely_nothing.rb +0 -11
  157. data/lib/rspec/core/mocking/with_flexmock.rb +0 -27
  158. data/lib/rspec/core/mocking/with_mocha.rb +0 -29
  159. data/lib/rspec/core/mocking/with_rr.rb +0 -27
  160. data/lib/rspec/core/mocking/with_rspec.rb +0 -23
  161. data/lib/rspec/core/subject.rb +0 -219
  162. data/spec/autotest/discover_spec.rb +0 -19
  163. data/spec/autotest/failed_results_re_spec.rb +0 -45
  164. data/spec/autotest/rspec_spec.rb +0 -123
  165. data/spec/command_line/order_spec.rb +0 -137
  166. data/spec/rspec/core/command_line_spec.rb +0 -108
  167. data/spec/rspec/core/command_line_spec_output.txt +0 -0
  168. data/spec/rspec/core/configuration_options_spec.rb +0 -377
  169. data/spec/rspec/core/configuration_spec.rb +0 -1196
  170. data/spec/rspec/core/deprecations_spec.rb +0 -66
  171. data/spec/rspec/core/drb_command_line_spec.rb +0 -108
  172. data/spec/rspec/core/drb_options_spec.rb +0 -180
  173. data/spec/rspec/core/dsl_spec.rb +0 -17
  174. data/spec/rspec/core/example_group_spec.rb +0 -1098
  175. data/spec/rspec/core/example_spec.rb +0 -370
  176. data/spec/rspec/core/filter_manager_spec.rb +0 -256
  177. data/spec/rspec/core/formatters/base_formatter_spec.rb +0 -80
  178. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +0 -363
  179. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +0 -88
  180. data/spec/rspec/core/formatters/helpers_spec.rb +0 -66
  181. data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +0 -410
  182. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +0 -409
  183. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +0 -416
  184. data/spec/rspec/core/formatters/html_formatted-1.9.3.html +0 -416
  185. data/spec/rspec/core/formatters/html_formatter_spec.rb +0 -82
  186. data/spec/rspec/core/formatters/progress_formatter_spec.rb +0 -30
  187. data/spec/rspec/core/formatters/snippet_extractor_spec.rb +0 -18
  188. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +0 -410
  189. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +0 -409
  190. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +0 -416
  191. data/spec/rspec/core/formatters/text_mate_formatted-1.9.3.html +0 -416
  192. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +0 -83
  193. data/spec/rspec/core/hooks_filtering_spec.rb +0 -227
  194. data/spec/rspec/core/hooks_spec.rb +0 -250
  195. data/spec/rspec/core/kernel_extensions_spec.rb +0 -9
  196. data/spec/rspec/core/let_spec.rb +0 -55
  197. data/spec/rspec/core/metadata_spec.rb +0 -447
  198. data/spec/rspec/core/option_parser_spec.rb +0 -166
  199. data/spec/rspec/core/pending_example_spec.rb +0 -220
  200. data/spec/rspec/core/project_initializer_spec.rb +0 -130
  201. data/spec/rspec/core/rake_task_spec.rb +0 -138
  202. data/spec/rspec/core/reporter_spec.rb +0 -103
  203. data/spec/rspec/core/resources/a_bar.rb +0 -0
  204. data/spec/rspec/core/resources/a_foo.rb +0 -0
  205. data/spec/rspec/core/resources/a_spec.rb +0 -1
  206. data/spec/rspec/core/resources/custom_example_group_runner.rb +0 -14
  207. data/spec/rspec/core/resources/formatter_specs.rb +0 -60
  208. data/spec/rspec/core/resources/utf8_encoded.rb +0 -8
  209. data/spec/rspec/core/rspec_matchers_spec.rb +0 -45
  210. data/spec/rspec/core/ruby_project_spec.rb +0 -24
  211. data/spec/rspec/core/runner_spec.rb +0 -81
  212. data/spec/rspec/core/shared_context_spec.rb +0 -67
  213. data/spec/rspec/core/shared_example_group_spec.rb +0 -84
  214. data/spec/rspec/core/subject_spec.rb +0 -244
  215. data/spec/rspec/core/world_spec.rb +0 -144
  216. data/spec/rspec/core_spec.rb +0 -35
  217. data/spec/spec_helper.rb +0 -98
  218. data/spec/support/config_options_helper.rb +0 -24
  219. data/spec/support/helper_methods.rb +0 -5
  220. data/spec/support/matchers.rb +0 -65
  221. data/spec/support/shared_example_groups.rb +0 -41
  222. data/spec/support/spec_files.rb +0 -44
@@ -0,0 +1,255 @@
1
+ module RSpec
2
+ module Core
3
+ # Contains metadata filtering logic. This has been extracted from
4
+ # the metadata classes because it operates ON a metadata hash but
5
+ # does not manage any of the state in the hash. We're moving towards
6
+ # having metadata be a raw hash (not a custom subclass), so externalizing
7
+ # this filtering logic helps us move in that direction.
8
+ module MetadataFilter
9
+ class << self
10
+ # @private
11
+ def apply?(predicate, filters, metadata)
12
+ filters.__send__(predicate) { |k, v| filter_applies?(k, v, metadata) }
13
+ end
14
+
15
+ # @private
16
+ def filter_applies?(key, filter_value, metadata)
17
+ silence_metadata_example_group_deprecations do
18
+ return location_filter_applies?(filter_value, metadata) if key == :locations
19
+ return id_filter_applies?(filter_value, metadata) if key == :ids
20
+ return filters_apply?(key, filter_value, metadata) if Hash === filter_value
21
+
22
+ meta_value = metadata.fetch(key) { return false }
23
+
24
+ return true if TrueClass === filter_value && meta_value
25
+ return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value
26
+ return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value
27
+
28
+ filter_value === meta_value || filter_value.to_s == meta_value.to_s
29
+ end
30
+ end
31
+
32
+ # @private
33
+ def silence_metadata_example_group_deprecations
34
+ RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true
35
+ yield
36
+ ensure
37
+ RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations)
38
+ end
39
+
40
+ private
41
+
42
+ def filter_applies_to_any_value?(key, value, metadata)
43
+ metadata[key].any? { |v| filter_applies?(key, v, key => value) }
44
+ end
45
+
46
+ def id_filter_applies?(rerun_paths_to_scoped_ids, metadata)
47
+ scoped_ids = rerun_paths_to_scoped_ids.fetch(metadata[:rerun_file_path]) { return false }
48
+
49
+ Metadata.ascend(metadata).any? do |meta|
50
+ scoped_ids.include?(meta[:scoped_id])
51
+ end
52
+ end
53
+
54
+ def location_filter_applies?(locations, metadata)
55
+ Metadata.ascend(metadata).any? do |meta|
56
+ file_path = meta[:absolute_file_path]
57
+ line_num = meta[:line_number]
58
+
59
+ locations[file_path].any? do |filter_line_num|
60
+ line_num == RSpec.world.preceding_declaration_line(file_path, filter_line_num)
61
+ end
62
+ end
63
+ end
64
+
65
+ def proc_filter_applies?(key, proc, metadata)
66
+ case proc.arity
67
+ when 0 then proc.call
68
+ when 2 then proc.call(metadata[key], metadata)
69
+ else proc.call(metadata[key])
70
+ end
71
+ end
72
+
73
+ def filters_apply?(key, value, metadata)
74
+ subhash = metadata[key]
75
+ return false unless Hash === subhash || HashImitatable === subhash
76
+ value.all? { |k, v| filter_applies?(k, v, subhash) }
77
+ end
78
+ end
79
+ end
80
+
81
+ # Tracks a collection of filterable items (e.g. modules, hooks, etc)
82
+ # and provides an optimized API to get the applicable items for the
83
+ # metadata of an example or example group.
84
+ #
85
+ # There are two implementations, optimized for different uses.
86
+ # @private
87
+ module FilterableItemRepository
88
+ # This implementation is simple, and is optimized for frequent
89
+ # updates but rare queries. `append` and `prepend` do no extra
90
+ # processing, and no internal memoization is done, since this
91
+ # is not optimized for queries.
92
+ #
93
+ # This is ideal for use by a example or example group, which may
94
+ # be updated multiple times with globally configured hooks, etc,
95
+ # but will not be queried frequently by other examples or examle
96
+ # groups.
97
+ # @private
98
+ class UpdateOptimized
99
+ attr_reader :items_and_filters
100
+
101
+ def initialize(applies_predicate)
102
+ @applies_predicate = applies_predicate
103
+ @items_and_filters = []
104
+ end
105
+
106
+ def append(item, metadata)
107
+ @items_and_filters << [item, metadata]
108
+ end
109
+
110
+ def prepend(item, metadata)
111
+ @items_and_filters.unshift [item, metadata]
112
+ end
113
+
114
+ def delete(item, metadata)
115
+ @items_and_filters.delete [item, metadata]
116
+ end
117
+
118
+ def items_for(request_meta)
119
+ @items_and_filters.each_with_object([]) do |(item, item_meta), to_return|
120
+ to_return << item if item_meta.empty? ||
121
+ MetadataFilter.apply?(@applies_predicate, item_meta, request_meta)
122
+ end
123
+ end
124
+
125
+ unless [].respond_to?(:each_with_object) # For 1.8.7
126
+ # :nocov:
127
+ undef items_for
128
+ def items_for(request_meta)
129
+ @items_and_filters.inject([]) do |to_return, (item, item_meta)|
130
+ to_return << item if item_meta.empty? ||
131
+ MetadataFilter.apply?(@applies_predicate, item_meta, request_meta)
132
+ to_return
133
+ end
134
+ end
135
+ # :nocov:
136
+ end
137
+ end
138
+
139
+ # This implementation is much more complex, and is optimized for
140
+ # rare (or hopefully no) updates once the queries start. Updates
141
+ # incur a cost as it has to clear the memoization and keep track
142
+ # of applicable keys. Queries will be O(N) the first time an item
143
+ # is provided with a given set of applicable metadata; subsequent
144
+ # queries with items with the same set of applicable metadata will
145
+ # be O(1) due to internal memoization.
146
+ #
147
+ # This is ideal for use by config, where filterable items (e.g. hooks)
148
+ # are typically added at the start of the process (e.g. in `spec_helper`)
149
+ # and then repeatedly queried as example groups and examples are defined.
150
+ # @private
151
+ class QueryOptimized < UpdateOptimized
152
+ alias find_items_for items_for
153
+ private :find_items_for
154
+
155
+ def initialize(applies_predicate)
156
+ super
157
+ @applicable_keys = Set.new
158
+ @proc_keys = Set.new
159
+ @memoized_lookups = Hash.new do |hash, applicable_metadata|
160
+ hash[applicable_metadata] = find_items_for(applicable_metadata)
161
+ end
162
+ end
163
+
164
+ def append(item, metadata)
165
+ super
166
+ handle_mutation(metadata)
167
+ end
168
+
169
+ def prepend(item, metadata)
170
+ super
171
+ handle_mutation(metadata)
172
+ end
173
+
174
+ def delete(item, metadata)
175
+ super
176
+ reconstruct_caches
177
+ end
178
+
179
+ def items_for(metadata)
180
+ # The filtering of `metadata` to `applicable_metadata` is the key thing
181
+ # that makes the memoization actually useful in practice, since each
182
+ # example and example group have different metadata (e.g. location and
183
+ # description). By filtering to the metadata keys our items care about,
184
+ # we can ignore extra metadata keys that differ for each example/group.
185
+ # For example, given `config.include DBHelpers, :db`, example groups
186
+ # can be split into these two sets: those that are tagged with `:db` and those
187
+ # that are not. For each set, this method for the first group in the set is
188
+ # still an `O(N)` calculation, but all subsequent groups in the set will be
189
+ # constant time lookups when they call this method.
190
+ applicable_metadata = applicable_metadata_from(metadata)
191
+
192
+ if applicable_metadata.any? { |k, _| @proc_keys.include?(k) }
193
+ # It's unsafe to memoize lookups involving procs (since they can
194
+ # be non-deterministic), so we skip the memoization in this case.
195
+ find_items_for(applicable_metadata)
196
+ else
197
+ @memoized_lookups[applicable_metadata]
198
+ end
199
+ end
200
+
201
+ private
202
+
203
+ def reconstruct_caches
204
+ @applicable_keys.clear
205
+ @proc_keys.clear
206
+ @items_and_filters.each do |_item, metadata|
207
+ handle_mutation(metadata)
208
+ end
209
+ end
210
+
211
+ def handle_mutation(metadata)
212
+ @applicable_keys.merge(metadata.keys)
213
+ @proc_keys.merge(proc_keys_from metadata)
214
+ @memoized_lookups.clear
215
+ end
216
+
217
+ def applicable_metadata_from(metadata)
218
+ MetadataFilter.silence_metadata_example_group_deprecations do
219
+ @applicable_keys.inject({}) do |hash, key|
220
+ # :example_group is treated special here because...
221
+ # - In RSpec 2, example groups had an `:example_group` key
222
+ # - In RSpec 3, that key is deprecated (it was confusing!).
223
+ # - The key is not technically present in an example group metadata hash
224
+ # (and thus would fail the `metadata.key?(key)` check) but a value
225
+ # is provided when accessed via the hash's `default_proc`
226
+ # - Thus, for backwards compatibility, we have to explicitly check
227
+ # for `:example_group` here if it is one of the keys being used to
228
+ # filter.
229
+ hash[key] = metadata[key] if metadata.key?(key) || key == :example_group
230
+ hash
231
+ end
232
+ end
233
+ end
234
+
235
+ def proc_keys_from(metadata)
236
+ metadata.each_with_object([]) do |(key, value), to_return|
237
+ to_return << key if Proc === value
238
+ end
239
+ end
240
+
241
+ unless [].respond_to?(:each_with_object) # For 1.8.7
242
+ # :nocov:
243
+ undef proc_keys_from
244
+ def proc_keys_from(metadata)
245
+ metadata.inject([]) do |to_return, (key, value)|
246
+ to_return << key if Proc === value
247
+ to_return
248
+ end
249
+ end
250
+ # :nocov:
251
+ end
252
+ end
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,31 @@
1
+ begin
2
+ # Only the minitest 5.x gem includes the minitest.rb and assertions.rb files.
3
+ require 'minitest'
4
+ require 'minitest/assertions'
5
+ rescue LoadError
6
+ # We must be using Ruby Core's MiniTest or the Minitest gem 4.x.
7
+ require 'minitest/unit'
8
+ Minitest = MiniTest
9
+ end
10
+
11
+ module RSpec
12
+ module Core
13
+ # @private
14
+ module MinitestAssertionsAdapter
15
+ include ::Minitest::Assertions
16
+ # Need to forcefully include Pending after Minitest::Assertions
17
+ # to make sure our own #skip method beats Minitest's.
18
+ include ::RSpec::Core::Pending
19
+
20
+ # Minitest 5.x requires this accessor to be available. See
21
+ # https://github.com/seattlerb/minitest/blob/38f0a5fcbd9c37c3f80a3eaad4ba84d3fc9947a0/lib/minitest/assertions.rb#L8
22
+ #
23
+ # It is not required for other extension libraries, and RSpec does not
24
+ # report or make this information available to formatters.
25
+ attr_writer :assertions
26
+ def assertions
27
+ @assertions ||= 0
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # Created by Jim Weirich on 2007-04-10.
2
+ # Copyright (c) 2007. All rights reserved.
3
+
4
+ require 'flexmock/rspec'
5
+
6
+ module RSpec
7
+ module Core
8
+ module MockingAdapters
9
+ # @private
10
+ module Flexmock
11
+ include ::FlexMock::MockContainer
12
+
13
+ def self.framework_name
14
+ :flexmock
15
+ end
16
+
17
+ def setup_mocks_for_rspec
18
+ # No setup required.
19
+ end
20
+
21
+ def verify_mocks_for_rspec
22
+ flexmock_verify
23
+ end
24
+
25
+ def teardown_mocks_for_rspec
26
+ flexmock_close
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,57 @@
1
+ # In order to support all versions of mocha, we have to jump through some
2
+ # hoops here.
3
+ #
4
+ # mocha >= '0.13.0':
5
+ # require 'mocha/api' is required.
6
+ # require 'mocha/object' raises a LoadError b/c the file no longer exists.
7
+ # mocha < '0.13.0', >= '0.9.7'
8
+ # require 'mocha/api' is required.
9
+ # require 'mocha/object' is required.
10
+ # mocha < '0.9.7':
11
+ # require 'mocha/api' raises a LoadError b/c the file does not yet exist.
12
+ # require 'mocha/standalone' is required.
13
+ # require 'mocha/object' is required.
14
+ begin
15
+ require 'mocha/api'
16
+
17
+ begin
18
+ require 'mocha/object'
19
+ rescue LoadError
20
+ # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded.
21
+ end
22
+ rescue LoadError
23
+ require 'mocha/standalone'
24
+ require 'mocha/object'
25
+ end
26
+
27
+ module RSpec
28
+ module Core
29
+ module MockingAdapters
30
+ # @private
31
+ module Mocha
32
+ def self.framework_name
33
+ :mocha
34
+ end
35
+
36
+ # Mocha::Standalone was deprecated as of Mocha 0.9.7.
37
+ begin
38
+ include ::Mocha::API
39
+ rescue NameError
40
+ include ::Mocha::Standalone
41
+ end
42
+
43
+ def setup_mocks_for_rspec
44
+ mocha_setup
45
+ end
46
+
47
+ def verify_mocks_for_rspec
48
+ mocha_verify
49
+ end
50
+
51
+ def teardown_mocks_for_rspec
52
+ mocha_teardown
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,14 @@
1
+ module RSpec
2
+ module Core
3
+ module MockingAdapters
4
+ # @private
5
+ module Null
6
+ def setup_mocks_for_rspec; end
7
+
8
+ def verify_mocks_for_rspec; end
9
+
10
+ def teardown_mocks_for_rspec; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ require 'rr'
2
+
3
+ RSpec.configuration.backtrace_exclusion_patterns.push(RR::Errors::BACKTRACE_IDENTIFIER)
4
+
5
+ module RSpec
6
+ module Core
7
+ # @private
8
+ module MockingAdapters
9
+ # @private
10
+ module RR
11
+ def self.framework_name
12
+ :rr
13
+ end
14
+
15
+ include ::RR::Extensions::InstanceMethods
16
+
17
+ def setup_mocks_for_rspec
18
+ ::RR::Space.instance.reset
19
+ end
20
+
21
+ def verify_mocks_for_rspec
22
+ ::RR::Space.instance.verify_doubles
23
+ end
24
+
25
+ def teardown_mocks_for_rspec
26
+ ::RR::Space.instance.reset
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ require 'rspec/mocks'
2
+
3
+ module RSpec
4
+ module Core
5
+ module MockingAdapters
6
+ # @private
7
+ module RSpec
8
+ include ::RSpec::Mocks::ExampleMethods
9
+
10
+ def self.framework_name
11
+ :rspec
12
+ end
13
+
14
+ def self.configuration
15
+ ::RSpec::Mocks.configuration
16
+ end
17
+
18
+ def setup_mocks_for_rspec
19
+ ::RSpec::Mocks.setup
20
+ end
21
+
22
+ def verify_mocks_for_rspec
23
+ ::RSpec::Mocks.verify
24
+ end
25
+
26
+ def teardown_mocks_for_rspec
27
+ ::RSpec::Mocks.teardown
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end