opal-rspec-cj 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.gitmodules +15 -0
  4. data/.travis.yml +13 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +25 -0
  7. data/Gemfile +8 -0
  8. data/README.md +147 -0
  9. data/Rakefile +26 -0
  10. data/config.ru +10 -0
  11. data/example/Gemfile +4 -0
  12. data/example/README.md +13 -0
  13. data/example/Rakefile +8 -0
  14. data/example/opal/user.rb +11 -0
  15. data/example/spec/user_spec.rb +15 -0
  16. data/lib/opal-rspec.rb +2 -0
  17. data/lib/opal/rspec.rb +20 -0
  18. data/lib/opal/rspec/rake_task.rb +63 -0
  19. data/lib/opal/rspec/version.rb +5 -0
  20. data/opal-rspec.gemspec +21 -0
  21. data/opal/opal-rspec.rb +1 -0
  22. data/opal/opal/rspec.rb +25 -0
  23. data/opal/opal/rspec/async.rb +289 -0
  24. data/opal/opal/rspec/browser_formatter.rb +188 -0
  25. data/opal/opal/rspec/fixes.rb +116 -0
  26. data/opal/opal/rspec/requires.rb +45 -0
  27. data/opal/opal/rspec/runner.rb +69 -0
  28. data/opal/opal/rspec/sprockets_runner.rb.erb +11 -0
  29. data/opal/opal/rspec/text_formatter.rb +74 -0
  30. data/spec/async_spec.rb +38 -0
  31. data/spec/example_spec.rb +163 -0
  32. data/spec/matchers_spec.rb +201 -0
  33. data/spec/mock_spec.rb +63 -0
  34. data/spec/named_subject_spec.rb +11 -0
  35. data/spec/should_syntax_spec.rb +17 -0
  36. data/vendor/spec_runner.js +50 -0
  37. data/vendor_lib/rspec-expectations.rb +1 -0
  38. data/vendor_lib/rspec.rb +3 -0
  39. data/vendor_lib/rspec/autorun.rb +2 -0
  40. data/vendor_lib/rspec/core.rb +203 -0
  41. data/vendor_lib/rspec/core/backport_random.rb +302 -0
  42. data/vendor_lib/rspec/core/backtrace_formatter.rb +65 -0
  43. data/vendor_lib/rspec/core/command_line.rb +36 -0
  44. data/vendor_lib/rspec/core/configuration.rb +1129 -0
  45. data/vendor_lib/rspec/core/configuration_options.rb +143 -0
  46. data/vendor_lib/rspec/core/drb_command_line.rb +26 -0
  47. data/vendor_lib/rspec/core/drb_options.rb +87 -0
  48. data/vendor_lib/rspec/core/dsl.rb +26 -0
  49. data/vendor_lib/rspec/core/example.rb +312 -0
  50. data/vendor_lib/rspec/core/example_group.rb +540 -0
  51. data/vendor_lib/rspec/core/filter_manager.rb +224 -0
  52. data/vendor_lib/rspec/core/flat_map.rb +17 -0
  53. data/vendor_lib/rspec/core/formatters.rb +54 -0
  54. data/vendor_lib/rspec/core/formatters/base_formatter.rb +291 -0
  55. data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +307 -0
  56. data/vendor_lib/rspec/core/formatters/deprecation_formatter.rb +193 -0
  57. data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +67 -0
  58. data/vendor_lib/rspec/core/formatters/helpers.rb +82 -0
  59. data/vendor_lib/rspec/core/formatters/html_formatter.rb +155 -0
  60. data/vendor_lib/rspec/core/formatters/html_printer.rb +408 -0
  61. data/vendor_lib/rspec/core/formatters/json_formatter.rb +99 -0
  62. data/vendor_lib/rspec/core/formatters/progress_formatter.rb +32 -0
  63. data/vendor_lib/rspec/core/formatters/snippet_extractor.rb +101 -0
  64. data/vendor_lib/rspec/core/hooks.rb +535 -0
  65. data/vendor_lib/rspec/core/memoized_helpers.rb +431 -0
  66. data/vendor_lib/rspec/core/metadata.rb +313 -0
  67. data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +11 -0
  68. data/vendor_lib/rspec/core/mocking/with_flexmock.rb +27 -0
  69. data/vendor_lib/rspec/core/mocking/with_mocha.rb +52 -0
  70. data/vendor_lib/rspec/core/mocking/with_rr.rb +27 -0
  71. data/vendor_lib/rspec/core/mocking/with_rspec.rb +27 -0
  72. data/vendor_lib/rspec/core/option_parser.rb +234 -0
  73. data/vendor_lib/rspec/core/ordering.rb +154 -0
  74. data/vendor_lib/rspec/core/pending.rb +110 -0
  75. data/vendor_lib/rspec/core/project_initializer.rb +88 -0
  76. data/vendor_lib/rspec/core/rake_task.rb +128 -0
  77. data/vendor_lib/rspec/core/reporter.rb +132 -0
  78. data/vendor_lib/rspec/core/ruby_project.rb +44 -0
  79. data/vendor_lib/rspec/core/runner.rb +97 -0
  80. data/vendor_lib/rspec/core/shared_context.rb +53 -0
  81. data/vendor_lib/rspec/core/shared_example_group.rb +146 -0
  82. data/vendor_lib/rspec/core/shared_example_group/collection.rb +27 -0
  83. data/vendor_lib/rspec/core/version.rb +7 -0
  84. data/vendor_lib/rspec/core/warnings.rb +22 -0
  85. data/vendor_lib/rspec/core/world.rb +131 -0
  86. data/vendor_lib/rspec/expectations.rb +75 -0
  87. data/vendor_lib/rspec/expectations/differ.rb +154 -0
  88. data/vendor_lib/rspec/expectations/errors.rb +9 -0
  89. data/vendor_lib/rspec/expectations/expectation_target.rb +87 -0
  90. data/vendor_lib/rspec/expectations/extensions.rb +1 -0
  91. data/vendor_lib/rspec/expectations/extensions/object.rb +29 -0
  92. data/vendor_lib/rspec/expectations/fail_with.rb +79 -0
  93. data/vendor_lib/rspec/expectations/handler.rb +68 -0
  94. data/vendor_lib/rspec/expectations/syntax.rb +182 -0
  95. data/vendor_lib/rspec/expectations/version.rb +8 -0
  96. data/vendor_lib/rspec/matchers.rb +633 -0
  97. data/vendor_lib/rspec/matchers/built_in.rb +39 -0
  98. data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +68 -0
  99. data/vendor_lib/rspec/matchers/built_in/be.rb +213 -0
  100. data/vendor_lib/rspec/matchers/built_in/be_instance_of.rb +15 -0
  101. data/vendor_lib/rspec/matchers/built_in/be_kind_of.rb +11 -0
  102. data/vendor_lib/rspec/matchers/built_in/be_within.rb +55 -0
  103. data/vendor_lib/rspec/matchers/built_in/change.rb +141 -0
  104. data/vendor_lib/rspec/matchers/built_in/cover.rb +21 -0
  105. data/vendor_lib/rspec/matchers/built_in/eq.rb +22 -0
  106. data/vendor_lib/rspec/matchers/built_in/eql.rb +23 -0
  107. data/vendor_lib/rspec/matchers/built_in/equal.rb +48 -0
  108. data/vendor_lib/rspec/matchers/built_in/exist.rb +26 -0
  109. data/vendor_lib/rspec/matchers/built_in/has.rb +48 -0
  110. data/vendor_lib/rspec/matchers/built_in/include.rb +61 -0
  111. data/vendor_lib/rspec/matchers/built_in/match.rb +17 -0
  112. data/vendor_lib/rspec/matchers/built_in/match_array.rb +51 -0
  113. data/vendor_lib/rspec/matchers/built_in/raise_error.rb +154 -0
  114. data/vendor_lib/rspec/matchers/built_in/respond_to.rb +74 -0
  115. data/vendor_lib/rspec/matchers/built_in/satisfy.rb +30 -0
  116. data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +48 -0
  117. data/vendor_lib/rspec/matchers/built_in/throw_symbol.rb +94 -0
  118. data/vendor_lib/rspec/matchers/built_in/yield.rb +297 -0
  119. data/vendor_lib/rspec/matchers/compatibility.rb +14 -0
  120. data/vendor_lib/rspec/matchers/configuration.rb +113 -0
  121. data/vendor_lib/rspec/matchers/dsl.rb +23 -0
  122. data/vendor_lib/rspec/matchers/generated_descriptions.rb +35 -0
  123. data/vendor_lib/rspec/matchers/matcher.rb +301 -0
  124. data/vendor_lib/rspec/matchers/method_missing.rb +12 -0
  125. data/vendor_lib/rspec/matchers/operator_matcher.rb +99 -0
  126. data/vendor_lib/rspec/matchers/pretty.rb +70 -0
  127. data/vendor_lib/rspec/matchers/test_unit_integration.rb +11 -0
  128. data/vendor_lib/rspec/mocks.rb +100 -0
  129. data/vendor_lib/rspec/mocks/any_instance/chain.rb +92 -0
  130. data/vendor_lib/rspec/mocks/any_instance/expectation_chain.rb +47 -0
  131. data/vendor_lib/rspec/mocks/any_instance/message_chains.rb +75 -0
  132. data/vendor_lib/rspec/mocks/any_instance/recorder.rb +200 -0
  133. data/vendor_lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
  134. data/vendor_lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
  135. data/vendor_lib/rspec/mocks/argument_list_matcher.rb +104 -0
  136. data/vendor_lib/rspec/mocks/argument_matchers.rb +264 -0
  137. data/vendor_lib/rspec/mocks/arity_calculator.rb +66 -0
  138. data/vendor_lib/rspec/mocks/configuration.rb +111 -0
  139. data/vendor_lib/rspec/mocks/error_generator.rb +203 -0
  140. data/vendor_lib/rspec/mocks/errors.rb +12 -0
  141. data/vendor_lib/rspec/mocks/example_methods.rb +201 -0
  142. data/vendor_lib/rspec/mocks/extensions/marshal.rb +17 -0
  143. data/vendor_lib/rspec/mocks/framework.rb +36 -0
  144. data/vendor_lib/rspec/mocks/instance_method_stasher.rb +112 -0
  145. data/vendor_lib/rspec/mocks/matchers/have_received.rb +99 -0
  146. data/vendor_lib/rspec/mocks/matchers/receive.rb +112 -0
  147. data/vendor_lib/rspec/mocks/matchers/receive_messages.rb +72 -0
  148. data/vendor_lib/rspec/mocks/message_expectation.rb +643 -0
  149. data/vendor_lib/rspec/mocks/method_double.rb +209 -0
  150. data/vendor_lib/rspec/mocks/method_reference.rb +95 -0
  151. data/vendor_lib/rspec/mocks/mock.rb +7 -0
  152. data/vendor_lib/rspec/mocks/mutate_const.rb +406 -0
  153. data/vendor_lib/rspec/mocks/object_reference.rb +90 -0
  154. data/vendor_lib/rspec/mocks/order_group.rb +82 -0
  155. data/vendor_lib/rspec/mocks/proxy.rb +269 -0
  156. data/vendor_lib/rspec/mocks/proxy_for_nil.rb +37 -0
  157. data/vendor_lib/rspec/mocks/space.rb +95 -0
  158. data/vendor_lib/rspec/mocks/standalone.rb +3 -0
  159. data/vendor_lib/rspec/mocks/stub_chain.rb +51 -0
  160. data/vendor_lib/rspec/mocks/syntax.rb +374 -0
  161. data/vendor_lib/rspec/mocks/targets.rb +90 -0
  162. data/vendor_lib/rspec/mocks/test_double.rb +109 -0
  163. data/vendor_lib/rspec/mocks/verifying_double.rb +77 -0
  164. data/vendor_lib/rspec/mocks/verifying_message_expecation.rb +60 -0
  165. data/vendor_lib/rspec/mocks/verifying_proxy.rb +151 -0
  166. data/vendor_lib/rspec/mocks/version.rb +7 -0
  167. data/vendor_lib/rspec/support.rb +6 -0
  168. data/vendor_lib/rspec/support/caller_filter.rb +56 -0
  169. data/vendor_lib/rspec/support/spec.rb +14 -0
  170. data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +29 -0
  171. data/vendor_lib/rspec/support/spec/in_sub_process.rb +40 -0
  172. data/vendor_lib/rspec/support/spec/stderr_splitter.rb +50 -0
  173. data/vendor_lib/rspec/support/version.rb +7 -0
  174. data/vendor_lib/rspec/support/warnings.rb +41 -0
  175. data/vendor_lib/rspec/version.rb +5 -0
  176. metadata +268 -0
@@ -0,0 +1,302 @@
1
+ # This code was (mostly) ported from the backports gem (https://github.com/marcandre/backports).
2
+ # The goal is to provide a random number generator in Ruby versions that do not have one.
3
+ # This was added to support localization of random spec ordering.
4
+ #
5
+ # These were in multiple files in backports, but merged into one here.
6
+
7
+ module RSpec
8
+ module Core
9
+ # Methods used internally by the backports.
10
+ module Backports
11
+ # Helper method to coerce a value into a specific class.
12
+ # Raises a TypeError if the coercion fails or the returned value
13
+ # is not of the right class.
14
+ # (from Rubinius)
15
+ def self.coerce_to(obj, cls, meth)
16
+ return obj if obj.kind_of?(cls)
17
+
18
+ begin
19
+ ret = obj.__send__(meth)
20
+ rescue Exception => e
21
+ raise TypeError, "Coercion error: #{obj.inspect}.#{meth} => #{cls} failed:\n" \
22
+ "(#{e.message})"
23
+ end
24
+ raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.kind_of? cls
25
+ ret
26
+ end
27
+
28
+ def self.coerce_to_int(obj)
29
+ coerce_to(obj, Integer, :to_int)
30
+ end
31
+
32
+ # Used internally to make it easy to deal with optional arguments
33
+ # (from Rubinius)
34
+ Undefined = Object.new
35
+
36
+ class Random
37
+ # An implementation of Mersenne Twister MT19937 in Ruby
38
+ class MT19937
39
+ STATE_SIZE = 624
40
+ LAST_STATE = STATE_SIZE - 1
41
+ PAD_32_BITS = 0xffffffff
42
+
43
+ # See seed=
44
+ def initialize(seed)
45
+ self.seed = seed
46
+ end
47
+
48
+ LAST_31_BITS = 0x7fffffff
49
+ OFFSET = 397
50
+
51
+ # Generates a completely new state out of the previous one.
52
+ def next_state
53
+ STATE_SIZE.times do |i|
54
+ mix = @state[i] & 0x80000000 | @state[i+1 - STATE_SIZE] & 0x7fffffff
55
+ @state[i] = @state[i+OFFSET - STATE_SIZE] ^ (mix >> 1)
56
+ @state[i] ^= 0x9908b0df if mix.odd?
57
+ end
58
+ @last_read = -1
59
+ end
60
+
61
+ # Seed must be either an Integer (only the first 32 bits will be used)
62
+ # or an Array of Integers (of which only the first 32 bits will be used)
63
+ #
64
+ # No conversion or type checking is done at this level
65
+ def seed=(seed)
66
+ case seed
67
+ when Integer
68
+ @state = Array.new(STATE_SIZE)
69
+ @state[0] = seed & PAD_32_BITS
70
+ (1..LAST_STATE).each do |i|
71
+ @state[i] = (1812433253 * (@state[i-1] ^ @state[i-1]>>30) + i)& PAD_32_BITS
72
+ end
73
+ @last_read = LAST_STATE
74
+ when Array
75
+ self.seed = 19650218
76
+ i=1
77
+ j=0
78
+ [STATE_SIZE, seed.size].max.times do
79
+ @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1664525) + j + seed[j] & PAD_32_BITS
80
+ if (i+=1) >= STATE_SIZE
81
+ @state[0] = @state[-1]
82
+ i = 1
83
+ end
84
+ j = 0 if (j+=1) >= seed.size
85
+ end
86
+ (STATE_SIZE-1).times do
87
+ @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1566083941) - i & PAD_32_BITS
88
+ if (i+=1) >= STATE_SIZE
89
+ @state[0] = @state[-1]
90
+ i = 1
91
+ end
92
+ end
93
+ @state[0] = 0x80000000
94
+ else
95
+ raise ArgumentError, "Seed must be an Integer or an Array"
96
+ end
97
+ end
98
+
99
+ # Returns a random Integer from the range 0 ... (1 << 32)
100
+ def random_32_bits
101
+ next_state if @last_read >= LAST_STATE
102
+ @last_read += 1
103
+ y = @state[@last_read]
104
+ # Tempering
105
+ y ^= (y >> 11)
106
+ y ^= (y << 7) & 0x9d2c5680
107
+ y ^= (y << 15) & 0xefc60000
108
+ y ^= (y >> 18)
109
+ end
110
+
111
+ # Supplement the MT19937 class with methods to do
112
+ # conversions the same way as MRI.
113
+ # No argument checking is done here either.
114
+
115
+ FLOAT_FACTOR = 1.0/9007199254740992.0
116
+ # generates a random number on [0,1) with 53-bit resolution
117
+ def random_float
118
+ ((random_32_bits >> 5) * 67108864.0 + (random_32_bits >> 6)) * FLOAT_FACTOR;
119
+ end
120
+
121
+ # Returns an integer within 0...upto
122
+ def random_integer(upto)
123
+ n = upto - 1
124
+ nb_full_32 = 0
125
+ while n > PAD_32_BITS
126
+ n >>= 32
127
+ nb_full_32 += 1
128
+ end
129
+ mask = mask_32_bits(n)
130
+ begin
131
+ rand = random_32_bits & mask
132
+ nb_full_32.times do
133
+ rand <<= 32
134
+ rand |= random_32_bits
135
+ end
136
+ end until rand < upto
137
+ rand
138
+ end
139
+
140
+ def random_bytes(nb)
141
+ nb_32_bits = (nb + 3) / 4
142
+ random = nb_32_bits.times.map { random_32_bits }
143
+ random.pack("L" * nb_32_bits)[0, nb]
144
+ end
145
+
146
+ def state_as_bignum
147
+ b = 0
148
+ @state.each_with_index do |val, i|
149
+ b |= val << (32 * i)
150
+ end
151
+ b
152
+ end
153
+
154
+ def left # It's actually the number of words left + 1, as per MRI...
155
+ MT19937::STATE_SIZE - @last_read
156
+ end
157
+
158
+ def marshal_dump
159
+ [state_as_bignum, left]
160
+ end
161
+
162
+ def marshal_load(ary)
163
+ b, left = ary
164
+ @last_read = MT19937::STATE_SIZE - left
165
+ @state = Array.new(STATE_SIZE)
166
+ STATE_SIZE.times do |i|
167
+ @state[i] = b & PAD_32_BITS
168
+ b >>= 32
169
+ end
170
+ end
171
+
172
+ # Convert an Integer seed of arbitrary size to either a single 32 bit integer, or an Array of 32 bit integers
173
+ def self.convert_seed(seed)
174
+ seed = seed.abs
175
+ long_values = []
176
+ begin
177
+ long_values << (seed & PAD_32_BITS)
178
+ seed >>= 32
179
+ end until seed == 0
180
+
181
+ long_values.pop if long_values[-1] == 1 && long_values.size > 1 # Done to allow any kind of sequence of integers
182
+
183
+ long_values.size > 1 ? long_values : long_values.first
184
+ end
185
+
186
+ def self.[](seed)
187
+ new(convert_seed(seed))
188
+ end
189
+
190
+ private
191
+
192
+ MASK_BY = [1,2,4,8,16]
193
+ def mask_32_bits(n)
194
+ MASK_BY.each do |shift|
195
+ n |= n >> shift
196
+ end
197
+ n
198
+ end
199
+ end
200
+
201
+ # Implementation corresponding to the actual Random class of Ruby
202
+ # The actual random generator (mersenne twister) is in MT19937.
203
+ # Ruby specific conversions are handled in bits_and_bytes.
204
+ # The high level stuff (argument checking) is done here.
205
+ module Implementation
206
+ attr_reader :seed
207
+
208
+ def initialize(seed = 0)
209
+ super()
210
+ seed_rand seed
211
+ end
212
+
213
+ def seed_rand(new_seed = 0)
214
+ new_seed = Backports.coerce_to_int(new_seed)
215
+ @seed = nil unless defined?(@seed)
216
+ old, @seed = @seed, new_seed.nonzero? || Random.new_seed
217
+ @mt = MT19937[ @seed ]
218
+ old
219
+ end
220
+
221
+ def rand(limit = Backports::Undefined)
222
+ case limit
223
+ when Backports::Undefined
224
+ @mt.random_float
225
+ when Float
226
+ limit * @mt.random_float unless limit <= 0
227
+ when Range
228
+ _rand_range(limit)
229
+ else
230
+ limit = Backports.coerce_to_int(limit)
231
+ @mt.random_integer(limit) unless limit <= 0
232
+ end || raise(ArgumentError, "invalid argument #{limit}")
233
+ end
234
+
235
+ def bytes(nb)
236
+ nb = Backports.coerce_to_int(nb)
237
+ raise ArgumentError, "negative size" if nb < 0
238
+ @mt.random_bytes(nb)
239
+ end
240
+
241
+ def ==(other)
242
+ other.is_a?(Random) &&
243
+ seed == other.seed &&
244
+ left == other.send(:left) &&
245
+ state == other.send(:state)
246
+ end
247
+
248
+ def marshal_dump
249
+ @mt.marshal_dump << @seed
250
+ end
251
+
252
+ def marshal_load(ary)
253
+ @seed = ary.pop
254
+ @mt = MT19937.allocate
255
+ @mt.marshal_load(ary)
256
+ end
257
+
258
+ private
259
+
260
+ def state
261
+ @mt.state_as_bignum
262
+ end
263
+
264
+ def left
265
+ @mt.left
266
+ end
267
+
268
+ def _rand_range(limit)
269
+ range = limit.end - limit.begin
270
+ if (!range.is_a?(Float)) && range.respond_to?(:to_int) && range = Backports.coerce_to_int(range)
271
+ range += 1 unless limit.exclude_end?
272
+ limit.begin + @mt.random_integer(range) unless range <= 0
273
+ elsif range = Backports.coerce_to(range, Float, :to_f)
274
+ if range < 0
275
+ nil
276
+ elsif limit.exclude_end?
277
+ limit.begin + @mt.random_float * range unless range <= 0
278
+ else
279
+ # cheat a bit... this will reduce the nb of random bits
280
+ loop do
281
+ r = @mt.random_float * range * 1.0001
282
+ break limit.begin + r unless r > range
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ def self.new_seed
290
+ (2 ** 62) + Kernel.rand(2 ** 62)
291
+ end
292
+ end
293
+
294
+ class Random
295
+ include Implementation
296
+ class << self
297
+ include Implementation
298
+ end
299
+ end
300
+ end
301
+ end
302
+ end
@@ -0,0 +1,65 @@
1
+ module RSpec
2
+ module Core
3
+ class BacktraceFormatter
4
+ # This is only used externally by rspec-expectations. Can be removed once
5
+ # rspec-expectations uses
6
+ # RSpec.configuration.backtrace_formatter.format_backtrace instead.
7
+ def self.format_backtrace(backtrace, options = {})
8
+ RSpec.configuration.backtrace_formatter.format_backtrace(backtrace, options)
9
+ end
10
+
11
+ attr_accessor :exclusion_patterns, :inclusion_patterns
12
+
13
+ def initialize
14
+ @full_backtrace = false
15
+ @exclusion_patterns = [] << Regexp.union(
16
+ *["/lib\d*/ruby/",
17
+ "org/jruby/",
18
+ "bin/",
19
+ "/gems/",
20
+ "lib/rspec/(core|expectations|matchers|mocks)"].
21
+ map {|s| Regexp.new(s.gsub("/", File::SEPARATOR))}
22
+ )
23
+ @inclusion_patterns = [Regexp.new(Dir.getwd)]
24
+ end
25
+
26
+ def full_backtrace=(full_backtrace)
27
+ @full_backtrace = full_backtrace
28
+ end
29
+
30
+ def full_backtrace?
31
+ @full_backtrace || @exclusion_patterns.empty?
32
+ end
33
+
34
+ def format_backtrace(backtrace, options = {})
35
+ return backtrace if options[:full_backtrace]
36
+ backtrace.
37
+ take_while {|l| l != RSpec::Core::Runner::AT_EXIT_HOOK_BACKTRACE_LINE}.
38
+ map {|l| backtrace_line(l)}.
39
+ compact.
40
+ tap do |filtered|
41
+ if filtered.empty?
42
+ filtered.concat backtrace
43
+ filtered << ""
44
+ filtered << " Showing full backtrace because every line was filtered out."
45
+ filtered << " See docs for RSpec::Configuration#backtrace_exclusion_patterns and"
46
+ filtered << " RSpec::Configuration#backtrace_inclusion_patterns for more information."
47
+ end
48
+ end
49
+ end
50
+
51
+ # @api private
52
+ def backtrace_line(line)
53
+ RSpec::Core::Metadata::relative_path(line) unless exclude?(line)
54
+ rescue SecurityError
55
+ nil
56
+ end
57
+
58
+ # @api private
59
+ def exclude?(line)
60
+ return false if @full_backtrace
61
+ @exclusion_patterns.any? {|p| p =~ line} && @inclusion_patterns.none? {|p| p =~ line}
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,36 @@
1
+ module RSpec
2
+ module Core
3
+ class CommandLine
4
+ def initialize(options, configuration=RSpec::configuration, world=RSpec::world)
5
+ if Array === options
6
+ options = ConfigurationOptions.new(options)
7
+ options.parse_options
8
+ end
9
+ @options = options
10
+ @configuration = configuration
11
+ @world = world
12
+ end
13
+
14
+ # Configures and runs a suite
15
+ #
16
+ # @param [IO] err
17
+ # @param [IO] out
18
+ def run(err, out)
19
+ @configuration.error_stream = err
20
+ @configuration.output_stream = out if @configuration.output_stream == $stdout
21
+ @options.configure(@configuration)
22
+ @configuration.load_spec_files
23
+ @world.announce_filters
24
+
25
+ @configuration.reporter.report(@world.example_count) do |reporter|
26
+ begin
27
+ @configuration.run_hook(:before, :suite)
28
+ @world.ordered_example_groups.map {|g| g.run(reporter) }.all? ? 0 : @configuration.failure_exit_code
29
+ ensure
30
+ @configuration.run_hook(:after, :suite)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,1129 @@
1
+ require 'fileutils'
2
+ require 'rspec/core/backtrace_formatter'
3
+ require 'rspec/core/ruby_project'
4
+ require 'rspec/core/formatters/deprecation_formatter'
5
+
6
+ module RSpec
7
+ module Core
8
+ # Stores runtime configuration information.
9
+ #
10
+ # Configuration options are loaded from `~/.rspec`, `.rspec`,
11
+ # `.rspec-local`, command line switches, and the `SPEC_OPTS` environment
12
+ # variable (listed in lowest to highest precedence; for example, an option
13
+ # in `~/.rspec` can be overridden by an option in `.rspec-local`).
14
+ #
15
+ # @example Standard settings
16
+ # RSpec.configure do |c|
17
+ # c.drb = true
18
+ # c.drb_port = 1234
19
+ # c.default_path = 'behavior'
20
+ # end
21
+ #
22
+ # @example Hooks
23
+ # RSpec.configure do |c|
24
+ # c.before(:suite) { establish_connection }
25
+ # c.before(:each) { log_in_as :authorized }
26
+ # c.around(:each) { |ex| Database.transaction(&ex) }
27
+ # end
28
+ #
29
+ # @see RSpec.configure
30
+ # @see Hooks
31
+ class Configuration
32
+ include RSpec::Core::Hooks
33
+
34
+ class MustBeConfiguredBeforeExampleGroupsError < StandardError; end
35
+
36
+ # @private
37
+ def self.define_reader(name)
38
+ define_method(name) do
39
+ variable = instance_variable_defined?("@#{name}") ? instance_variable_get("@#{name}") : nil
40
+ value_for(name, variable)
41
+ end
42
+ end
43
+
44
+ # @private
45
+ def self.deprecate_alias_key
46
+ RSpec.deprecate("add_setting with :alias option", :replacement => ":alias_with")
47
+ end
48
+
49
+ # @private
50
+ def self.define_aliases(name, alias_name)
51
+ alias_method alias_name, name
52
+ alias_method "#{alias_name}=", "#{name}="
53
+ define_predicate_for alias_name
54
+ end
55
+
56
+ # @private
57
+ def self.define_predicate_for(*names)
58
+ names.each {|name| alias_method "#{name}?", name}
59
+ end
60
+
61
+ # @private
62
+ #
63
+ # Invoked by the `add_setting` instance method. Use that method on a
64
+ # `Configuration` instance rather than this class method.
65
+ def self.add_setting(name, opts={})
66
+ raise "Use the instance add_setting method if you want to set a default" if opts.has_key?(:default)
67
+ if opts[:alias]
68
+ deprecate_alias_key
69
+ define_aliases(opts[:alias], name)
70
+ else
71
+ attr_writer name
72
+ define_reader name
73
+ define_predicate_for name
74
+ end
75
+ Array(opts[:alias_with]).each do |alias_name|
76
+ define_aliases(name, alias_name)
77
+ end
78
+ end
79
+
80
+ # @macro [attach] add_setting
81
+ # @attribute $1
82
+ #
83
+ # @macro [attach] define_reader
84
+ # @attribute $1
85
+
86
+ # @macro add_setting
87
+ # Path to use if no path is provided to the `rspec` command (default:
88
+ # `"spec"`). Allows you to just type `rspec` instead of `rspec spec` to
89
+ # run all the examples in the `spec` directory.
90
+ add_setting :default_path
91
+
92
+ # @macro add_setting
93
+ # Run examples over DRb (default: `false`). RSpec doesn't supply the DRb
94
+ # server, but you can use tools like spork.
95
+ add_setting :drb
96
+
97
+ # @macro add_setting
98
+ # The drb_port (default: nil).
99
+ add_setting :drb_port
100
+
101
+ # @macro add_setting
102
+ # Default: `$stderr`.
103
+ add_setting :error_stream
104
+
105
+ # @macro add_setting
106
+ # Default: `$stderr`.
107
+ add_setting :deprecation_stream
108
+
109
+ # @macro add_setting
110
+ # Clean up and exit after the first failure (default: `false`).
111
+ add_setting :fail_fast
112
+
113
+ # @macro add_setting
114
+ # Prints the formatter output of your suite without running any
115
+ # examples or hooks.
116
+ add_setting :dry_run
117
+
118
+ # @macro add_setting
119
+ # The exit code to return if there are any failures (default: 1).
120
+ add_setting :failure_exit_code
121
+
122
+ # @macro define_reader
123
+ # Indicates files configured to be required
124
+ define_reader :requires
125
+
126
+ # @macro define_reader
127
+ # Returns dirs that have been prepended to the load path by #lib=
128
+ define_reader :libs
129
+
130
+ # @macro add_setting
131
+ # Default: `$stdout`.
132
+ # Also known as `output` and `out`
133
+ define_reader :output_stream
134
+ def output_stream=(value)
135
+ if @reporter && !value.equal?(@output_stream)
136
+ warn "RSpec's reporter has already been initialized with " +
137
+ "#{output_stream.inspect} as the output stream, so your change to "+
138
+ "`output_stream` will be ignored. You should configure it earlier for " +
139
+ "it to take effect. (Called from #{CallerFilter.first_non_rspec_line})"
140
+ else
141
+ @output_stream = value
142
+ end
143
+ end
144
+
145
+ # @macro add_setting
146
+ # Load files matching this pattern (default: `'**/*_spec.rb'`)
147
+ add_setting :pattern, :alias_with => :filename_pattern
148
+
149
+ def pattern= value
150
+ if @spec_files_loaded
151
+ RSpec.warning "Configuring `pattern` to #{value} has no effect since RSpec has already loaded the spec files."
152
+ end
153
+ @pattern = value
154
+ end
155
+ alias :filename_pattern= :pattern=
156
+
157
+ # @macro add_setting
158
+ # Report the times for the slowest examples (default: `false`).
159
+ # Use this to specify the number of examples to include in the profile.
160
+ add_setting :profile_examples
161
+
162
+ # @macro add_setting
163
+ # Run all examples if none match the configured filters (default: `false`).
164
+ add_setting :run_all_when_everything_filtered
165
+
166
+ # @macro add_setting
167
+ # Color to use to indicate success.
168
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
169
+ add_setting :success_color
170
+
171
+ # @macro add_setting
172
+ # Color to use to print pending examples.
173
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
174
+ add_setting :pending_color
175
+
176
+ # @macro add_setting
177
+ # Color to use to indicate failure.
178
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
179
+ add_setting :failure_color
180
+
181
+ # @macro add_setting
182
+ # The default output color.
183
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
184
+ add_setting :default_color
185
+
186
+ # @macro add_setting
187
+ # Color used when a pending example is fixed.
188
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
189
+ add_setting :fixed_color
190
+
191
+ # @macro add_setting
192
+ # Color used to print details.
193
+ # @param [Symbol] color one of the following: [:black, :white, :red, :green, :yellow, :blue, :magenta, :cyan]
194
+ add_setting :detail_color
195
+
196
+ # @macro add_setting
197
+ # When a block passed to pending fails (as expected), display the failure
198
+ # without reporting it as a failure (default: false).
199
+ add_setting :show_failures_in_pending_blocks
200
+
201
+ # Deprecated. This config option was added in RSpec 2 to pave the way
202
+ # for this being the default behavior in RSpec 3. Now this option is
203
+ # a no-op.
204
+ def treat_symbols_as_metadata_keys_with_true_values=(value)
205
+ RSpec.deprecate("RSpec::Core::Configuration#treat_symbols_as_metadata_keys_with_true_values=")
206
+ end
207
+
208
+ # @private
209
+ add_setting :tty
210
+ # @private
211
+ add_setting :include_or_extend_modules
212
+ # @private
213
+ add_setting :files_to_run
214
+ # @private
215
+ add_setting :expecting_with_rspec
216
+ # @private
217
+ attr_accessor :filter_manager
218
+ # @private
219
+ attr_reader :backtrace_formatter, :ordering_manager
220
+
221
+ # Alias for rspec-2.x's backtrace_cleaner (now backtrace_formatter)
222
+ #
223
+ # TODO: consider deprecating and removing this rather than aliasing in rspec-3?
224
+ alias backtrace_cleaner backtrace_formatter
225
+
226
+ def initialize
227
+ @expectation_frameworks = []
228
+ @include_or_extend_modules = []
229
+ @mock_framework = nil
230
+ @files_to_run = []
231
+ @formatters = []
232
+ @color = false
233
+ @pattern = '**/*_spec.rb'
234
+ @failure_exit_code = 1
235
+ @spec_files_loaded = false
236
+
237
+ @backtrace_formatter = BacktraceFormatter.new
238
+
239
+ @default_path = 'spec'
240
+ @deprecation_stream = $stderr
241
+ @output_stream = $stdout
242
+ @reporter = nil
243
+ @filter_manager = FilterManager.new
244
+ @ordering_manager = Ordering::ConfigurationManager.new
245
+ @preferred_options = {}
246
+ @failure_color = :red
247
+ @success_color = :green
248
+ @pending_color = :yellow
249
+ @default_color = :white
250
+ @fixed_color = :blue
251
+ @detail_color = :cyan
252
+ @profile_examples = false
253
+ @requires = []
254
+ @libs = []
255
+ end
256
+
257
+ # @private
258
+ #
259
+ # Used to set higher priority option values from the command line.
260
+ def force(hash)
261
+ ordering_manager.force(hash)
262
+ @preferred_options.merge!(hash)
263
+ self.warnings = value_for :warnings, nil
264
+ end
265
+
266
+ # @private
267
+ def reset
268
+ @spec_files_loaded = false
269
+ @reporter = nil
270
+ @formatters.clear
271
+ end
272
+
273
+ # @overload add_setting(name)
274
+ # @overload add_setting(name, opts)
275
+ # @option opts [Symbol] :default
276
+ #
277
+ # set a default value for the generated getter and predicate methods:
278
+ #
279
+ # add_setting(:foo, :default => "default value")
280
+ #
281
+ # @option opts [Symbol] :alias_with
282
+ #
283
+ # Use `:alias_with` to alias the setter, getter, and predicate to another
284
+ # name, or names:
285
+ #
286
+ # add_setting(:foo, :alias_with => :bar)
287
+ # add_setting(:foo, :alias_with => [:bar, :baz])
288
+ #
289
+ # Adds a custom setting to the RSpec.configuration object.
290
+ #
291
+ # RSpec.configuration.add_setting :foo
292
+ #
293
+ # Used internally and by extension frameworks like rspec-rails, so they
294
+ # can add config settings that are domain specific. For example:
295
+ #
296
+ # RSpec.configure do |c|
297
+ # c.add_setting :use_transactional_fixtures,
298
+ # :default => true,
299
+ # :alias_with => :use_transactional_examples
300
+ # end
301
+ #
302
+ # `add_setting` creates three methods on the configuration object, a
303
+ # setter, a getter, and a predicate:
304
+ #
305
+ # RSpec.configuration.foo=(value)
306
+ # RSpec.configuration.foo
307
+ # RSpec.configuration.foo? # returns true if foo returns anything but nil or false
308
+ def add_setting(name, opts={})
309
+ default = opts.delete(:default)
310
+ (class << self; self; end).class_eval do
311
+ add_setting(name, opts)
312
+ end
313
+ send("#{name}=", default) if default
314
+ end
315
+
316
+ # Returns the configured mock framework adapter module
317
+ def mock_framework
318
+ mock_with :rspec unless @mock_framework
319
+ @mock_framework
320
+ end
321
+
322
+ # Delegates to mock_framework=(framework)
323
+ def mock_framework=(framework)
324
+ mock_with framework
325
+ end
326
+
327
+ # Regexps used to exclude lines from backtraces.
328
+ #
329
+ # Excludes lines from ruby (and jruby) source, installed gems, anything
330
+ # in any "bin" directory, and any of the rspec libs (outside gem
331
+ # installs) by default.
332
+ #
333
+ # You can modify the list via the getter, or replace it with the setter.
334
+ #
335
+ # To override this behaviour and display a full backtrace, use
336
+ # `--backtrace`on the command line, in a `.rspec` file, or in the
337
+ # `rspec_options` attribute of RSpec's rake task.
338
+ def backtrace_exclusion_patterns
339
+ @backtrace_formatter.exclusion_patterns
340
+ end
341
+
342
+ def backtrace_exclusion_patterns=(patterns)
343
+ @backtrace_formatter.exclusion_patterns = patterns
344
+ end
345
+
346
+ # Regexps used to include lines in backtraces.
347
+ #
348
+ # Defaults to [Regexp.new Dir.getwd].
349
+ #
350
+ # Lines that match an exclusion _and_ an inclusion pattern
351
+ # will be included.
352
+ #
353
+ # You can modify the list via the getter, or replace it with the setter.
354
+ def backtrace_inclusion_patterns
355
+ @backtrace_formatter.inclusion_patterns
356
+ end
357
+
358
+ def backtrace_inclusion_patterns=(patterns)
359
+ @backtrace_formatter.inclusion_patterns = patterns
360
+ end
361
+
362
+ # Sets the mock framework adapter module.
363
+ #
364
+ # `framework` can be a Symbol or a Module.
365
+ #
366
+ # Given any of `:rspec`, `:mocha`, `:flexmock`, or `:rr`, configures the
367
+ # named framework.
368
+ #
369
+ # Given `:nothing`, configures no framework. Use this if you don't use
370
+ # any mocking framework to save a little bit of overhead.
371
+ #
372
+ # Given a Module, includes that module in every example group. The module
373
+ # should adhere to RSpec's mock framework adapter API:
374
+ #
375
+ # setup_mocks_for_rspec
376
+ # - called before each example
377
+ #
378
+ # verify_mocks_for_rspec
379
+ # - called after each example. Framework should raise an exception
380
+ # when expectations fail
381
+ #
382
+ # teardown_mocks_for_rspec
383
+ # - called after verify_mocks_for_rspec (even if there are errors)
384
+ #
385
+ # If the module responds to `configuration` and `mock_with` receives a block,
386
+ # it will yield the configuration object to the block e.g.
387
+ #
388
+ # config.mock_with OtherMockFrameworkAdapter do |mod_config|
389
+ # mod_config.custom_setting = true
390
+ # end
391
+ def mock_with(framework)
392
+ framework_module = case framework
393
+ when Module
394
+ framework
395
+ when String, Symbol
396
+ require case framework.to_s
397
+ when /rspec/i
398
+ 'rspec/core/mocking/with_rspec'
399
+ when /mocha/i
400
+ 'rspec/core/mocking/with_mocha'
401
+ when /rr/i
402
+ 'rspec/core/mocking/with_rr'
403
+ when /flexmock/i
404
+ 'rspec/core/mocking/with_flexmock'
405
+ else
406
+ 'rspec/core/mocking/with_absolutely_nothing'
407
+ end
408
+ RSpec::Core::MockFrameworkAdapter
409
+ end
410
+
411
+ new_name, old_name = [framework_module, @mock_framework].map do |mod|
412
+ mod.respond_to?(:framework_name) ? mod.framework_name : :unnamed
413
+ end
414
+
415
+ unless new_name == old_name
416
+ assert_no_example_groups_defined(:mock_framework)
417
+ end
418
+
419
+ if block_given?
420
+ raise "#{framework_module} must respond to `configuration` so that mock_with can yield it." unless framework_module.respond_to?(:configuration)
421
+ yield framework_module.configuration
422
+ end
423
+
424
+ @mock_framework = framework_module
425
+ end
426
+
427
+ # Returns the configured expectation framework adapter module(s)
428
+ def expectation_frameworks
429
+ expect_with :rspec if @expectation_frameworks.empty?
430
+ @expectation_frameworks
431
+ end
432
+
433
+ # Delegates to expect_with(framework)
434
+ def expectation_framework=(framework)
435
+ expect_with(framework)
436
+ end
437
+
438
+ # Sets the expectation framework module(s) to be included in each example
439
+ # group.
440
+ #
441
+ # `frameworks` can be `:rspec`, `:stdlib`, a custom module, or any
442
+ # combination thereof:
443
+ #
444
+ # config.expect_with :rspec
445
+ # config.expect_with :stdlib
446
+ # config.expect_with :rspec, :stdlib
447
+ # config.expect_with OtherExpectationFramework
448
+ #
449
+ # RSpec will translate `:rspec` and `:stdlib` into the appropriate
450
+ # modules.
451
+ #
452
+ # ## Configuration
453
+ #
454
+ # If the module responds to `configuration`, `expect_with` will
455
+ # yield the `configuration` object if given a block:
456
+ #
457
+ # config.expect_with OtherExpectationFramework do |custom_config|
458
+ # custom_config.custom_setting = true
459
+ # end
460
+ def expect_with(*frameworks)
461
+ modules = frameworks.map do |framework|
462
+ case framework
463
+ when Module
464
+ framework
465
+ when :rspec
466
+ require 'rspec/expectations'
467
+ self.expecting_with_rspec = true
468
+ ::RSpec::Matchers
469
+ when :stdlib
470
+ require 'test/unit/assertions'
471
+ ::Test::Unit::Assertions
472
+ else
473
+ raise ArgumentError, "#{framework.inspect} is not supported"
474
+ end
475
+ end
476
+
477
+ if (modules - @expectation_frameworks).any?
478
+ assert_no_example_groups_defined(:expect_with)
479
+ end
480
+
481
+ if block_given?
482
+ 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
483
+ raise "#{modules.first} must respond to `configuration` so that expect_with can yield it." unless modules.first.respond_to?(:configuration)
484
+ yield modules.first.configuration
485
+ end
486
+
487
+ @expectation_frameworks.push(*modules)
488
+ end
489
+
490
+ def full_backtrace?
491
+ @backtrace_formatter.full_backtrace?
492
+ end
493
+
494
+ def full_backtrace=(true_or_false)
495
+ @backtrace_formatter.full_backtrace = true_or_false
496
+ end
497
+
498
+ def color(output=output_stream)
499
+ # rspec's built-in formatters all call this with the output argument,
500
+ # but defaulting to output_stream for backward compatibility with
501
+ # formatters in extension libs
502
+ return false unless output_to_tty?(output)
503
+ value_for(:color, @color)
504
+ end
505
+
506
+ def color=(bool)
507
+ if bool
508
+ if RSpec.windows_os? and not ENV['ANSICON']
509
+ RSpec.warning "You must use ANSICON 1.31 or later (http://adoxa.3eeweb.com/ansicon/) to use colour on Windows"
510
+ @color = false
511
+ else
512
+ @color = true
513
+ end
514
+ end
515
+ end
516
+
517
+ # TODO - deprecate color_enabled - probably not until the last 2.x
518
+ # release before 3.0
519
+ alias_method :color_enabled, :color
520
+ alias_method :color_enabled=, :color=
521
+ define_predicate_for :color_enabled, :color
522
+
523
+ def libs=(libs)
524
+ libs.map do |lib|
525
+ @libs.unshift lib
526
+ $LOAD_PATH.unshift lib
527
+ end
528
+ end
529
+
530
+ def requires=(paths)
531
+ RSpec.deprecate("RSpec::Core::Configuration#requires=(paths)",
532
+ :replacement => "paths.each {|path| require path}")
533
+ paths.map {|path| require path}
534
+ @requires += paths
535
+ end
536
+
537
+ # Run examples defined on `line_numbers` in all files to run.
538
+ def line_numbers=(line_numbers)
539
+ filter_run :line_numbers => line_numbers.map{|l| l.to_i}
540
+ end
541
+
542
+ def line_numbers
543
+ filter.fetch(:line_numbers,[])
544
+ end
545
+
546
+ def full_description=(description)
547
+ filter_run :full_description => Regexp.union(*Array(description).map {|d| Regexp.new(d) })
548
+ end
549
+
550
+ def full_description
551
+ filter.fetch :full_description, nil
552
+ end
553
+
554
+ # @overload add_formatter(formatter)
555
+ #
556
+ # Adds a formatter to the formatters collection. `formatter` can be a
557
+ # string representing any of the built-in formatters (see
558
+ # `built_in_formatter`), or a custom formatter class.
559
+ #
560
+ # ### Note
561
+ #
562
+ # For internal purposes, `add_formatter` also accepts the name of a class
563
+ # and paths to use for output streams, but you should consider that a
564
+ # private api that may change at any time without notice.
565
+ def add_formatter(formatter_to_use, *paths)
566
+ formatter_class =
567
+ built_in_formatter(formatter_to_use) ||
568
+ custom_formatter(formatter_to_use) ||
569
+ (raise ArgumentError, "Formatter '#{formatter_to_use}' unknown - maybe you meant 'documentation' or 'progress'?.")
570
+
571
+ paths << output_stream if paths.empty?
572
+ formatters << formatter_class.new(*paths.map {|p| String === p ? file_at(p) : p})
573
+ end
574
+
575
+ alias_method :formatter=, :add_formatter
576
+
577
+ def formatters
578
+ @formatters ||= []
579
+ end
580
+
581
+ def reporter
582
+ @reporter ||= begin
583
+ add_formatter('progress') if formatters.empty?
584
+ add_formatter(RSpec::Core::Formatters::DeprecationFormatter, deprecation_stream, output_stream)
585
+ Reporter.new(self, *formatters)
586
+ end
587
+ end
588
+
589
+ # @api private
590
+ #
591
+ # Defaults `profile_examples` to 10 examples when `@profile_examples` is `true`.
592
+ #
593
+ def profile_examples
594
+ profile = value_for(:profile_examples, @profile_examples)
595
+ if profile && !profile.is_a?(Integer)
596
+ 10
597
+ else
598
+ profile
599
+ end
600
+ end
601
+
602
+ # @private
603
+ def files_or_directories_to_run=(*files)
604
+ files = files.flatten
605
+ files << default_path if (command == 'rspec' || Runner.running_in_drb?) && default_path && files.empty?
606
+ self.files_to_run = get_files_to_run(files)
607
+ end
608
+
609
+ # Creates a method that delegates to `example` including the submitted
610
+ # `args`. Used internally to add variants of `example` like `pending`:
611
+ #
612
+ # @example
613
+ # alias_example_to :pending, :pending => true
614
+ #
615
+ # # This lets you do this:
616
+ #
617
+ # describe Thing do
618
+ # pending "does something" do
619
+ # thing = Thing.new
620
+ # end
621
+ # end
622
+ #
623
+ # # ... which is the equivalent of
624
+ #
625
+ # describe Thing do
626
+ # it "does something", :pending => true do
627
+ # thing = Thing.new
628
+ # end
629
+ # end
630
+ def alias_example_to(new_name, *args)
631
+ extra_options = Metadata.build_hash_from(args)
632
+ RSpec::Core::ExampleGroup.alias_example_to(new_name, extra_options)
633
+ end
634
+
635
+ # Define an alias for it_should_behave_like that allows different
636
+ # language (like "it_has_behavior" or "it_behaves_like") to be
637
+ # employed when including shared examples.
638
+ #
639
+ # Example:
640
+ #
641
+ # alias_it_behaves_like_to(:it_has_behavior, 'has behavior:')
642
+ #
643
+ # allows the user to include a shared example group like:
644
+ #
645
+ # describe Entity do
646
+ # it_has_behavior 'sortability' do
647
+ # let(:sortable) { Entity.new }
648
+ # end
649
+ # end
650
+ #
651
+ # which is reported in the output as:
652
+ #
653
+ # Entity
654
+ # has behavior: sortability
655
+ # # sortability examples here
656
+ def alias_it_behaves_like_to(new_name, report_label = '')
657
+ RSpec::Core::ExampleGroup.alias_it_behaves_like_to(new_name, report_label)
658
+ end
659
+
660
+ alias_method :alias_it_should_behave_like_to, :alias_it_behaves_like_to
661
+
662
+ # Adds key/value pairs to the `inclusion_filter`. If `args`
663
+ # includes any symbols that are not part of the hash, each symbol
664
+ # is treated as a key in the hash with the value `true`.
665
+ #
666
+ # ### Note
667
+ #
668
+ # Filters set using this method can be overridden from the command line
669
+ # or config files (e.g. `.rspec`).
670
+ #
671
+ # @example
672
+ # # given this declaration
673
+ # describe "something", :foo => 'bar' do
674
+ # # ...
675
+ # end
676
+ #
677
+ # # any of the following will include that group
678
+ # config.filter_run_including :foo => 'bar'
679
+ # config.filter_run_including :foo => /^ba/
680
+ # config.filter_run_including :foo => lambda {|v| v == 'bar'}
681
+ # config.filter_run_including :foo => lambda {|v,m| m[:foo] == 'bar'}
682
+ #
683
+ # # given a proc with an arity of 1, the lambda is passed the value related to the key, e.g.
684
+ # config.filter_run_including :foo => lambda {|v| v == 'bar'}
685
+ #
686
+ # # given a proc with an arity of 2, the lambda is passed the value related to the key,
687
+ # # and the metadata itself e.g.
688
+ # config.filter_run_including :foo => lambda {|v,m| m[:foo] == 'bar'}
689
+ #
690
+ # filter_run_including :foo # same as filter_run_including :foo => true
691
+ def filter_run_including(*args)
692
+ filter_manager.include_with_low_priority Metadata.build_hash_from(args)
693
+ end
694
+
695
+ alias_method :filter_run, :filter_run_including
696
+
697
+ # Clears and reassigns the `inclusion_filter`. Set to `nil` if you don't
698
+ # want any inclusion filter at all.
699
+ #
700
+ # ### Warning
701
+ #
702
+ # This overrides any inclusion filters/tags set on the command line or in
703
+ # configuration files.
704
+ def inclusion_filter=(filter)
705
+ filter_manager.include! Metadata.build_hash_from([filter])
706
+ end
707
+
708
+ alias_method :filter=, :inclusion_filter=
709
+
710
+ # Returns the `inclusion_filter`. If none has been set, returns an empty
711
+ # hash.
712
+ def inclusion_filter
713
+ filter_manager.inclusions
714
+ end
715
+
716
+ alias_method :filter, :inclusion_filter
717
+
718
+ # Adds key/value pairs to the `exclusion_filter`. If `args`
719
+ # includes any symbols that are not part of the hash, each symbol
720
+ # is treated as a key in the hash with the value `true`.
721
+ #
722
+ # ### Note
723
+ #
724
+ # Filters set using this method can be overridden from the command line
725
+ # or config files (e.g. `.rspec`).
726
+ #
727
+ # @example
728
+ # # given this declaration
729
+ # describe "something", :foo => 'bar' do
730
+ # # ...
731
+ # end
732
+ #
733
+ # # any of the following will exclude that group
734
+ # config.filter_run_excluding :foo => 'bar'
735
+ # config.filter_run_excluding :foo => /^ba/
736
+ # config.filter_run_excluding :foo => lambda {|v| v == 'bar'}
737
+ # config.filter_run_excluding :foo => lambda {|v,m| m[:foo] == 'bar'}
738
+ #
739
+ # # given a proc with an arity of 1, the lambda is passed the value related to the key, e.g.
740
+ # config.filter_run_excluding :foo => lambda {|v| v == 'bar'}
741
+ #
742
+ # # given a proc with an arity of 2, the lambda is passed the value related to the key,
743
+ # # and the metadata itself e.g.
744
+ # config.filter_run_excluding :foo => lambda {|v,m| m[:foo] == 'bar'}
745
+ #
746
+ # filter_run_excluding :foo # same as filter_run_excluding :foo => true
747
+ def filter_run_excluding(*args)
748
+ filter_manager.exclude_with_low_priority Metadata.build_hash_from(args)
749
+ end
750
+
751
+ # Clears and reassigns the `exclusion_filter`. Set to `nil` if you don't
752
+ # want any exclusion filter at all.
753
+ #
754
+ # ### Warning
755
+ #
756
+ # This overrides any exclusion filters/tags set on the command line or in
757
+ # configuration files.
758
+ def exclusion_filter=(filter)
759
+ filter_manager.exclude! Metadata.build_hash_from([filter])
760
+ end
761
+
762
+ # Returns the `exclusion_filter`. If none has been set, returns an empty
763
+ # hash.
764
+ def exclusion_filter
765
+ filter_manager.exclusions
766
+ end
767
+
768
+ # Tells RSpec to include `mod` in example groups. Methods defined in
769
+ # `mod` are exposed to examples (not example groups). Use `filters` to
770
+ # constrain the groups in which to include the module.
771
+ #
772
+ # @example
773
+ #
774
+ # module AuthenticationHelpers
775
+ # def login_as(user)
776
+ # # ...
777
+ # end
778
+ # end
779
+ #
780
+ # module UserHelpers
781
+ # def users(username)
782
+ # # ...
783
+ # end
784
+ # end
785
+ #
786
+ # RSpec.configure do |config|
787
+ # config.include(UserHelpers) # included in all modules
788
+ # config.include(AuthenticationHelpers, :type => :request)
789
+ # end
790
+ #
791
+ # describe "edit profile", :type => :request do
792
+ # it "can be viewed by owning user" do
793
+ # login_as users(:jdoe)
794
+ # get "/profiles/jdoe"
795
+ # assert_select ".username", :text => 'jdoe'
796
+ # end
797
+ # end
798
+ #
799
+ # @see #extend
800
+ def include(mod, *filters)
801
+ include_or_extend_modules << [:include, mod, Metadata.build_hash_from(filters)]
802
+ end
803
+
804
+ # Tells RSpec to extend example groups with `mod`. Methods defined in
805
+ # `mod` are exposed to example groups (not examples). Use `filters` to
806
+ # constrain the groups to extend.
807
+ #
808
+ # Similar to `include`, but behavior is added to example groups, which
809
+ # are classes, rather than the examples, which are instances of those
810
+ # classes.
811
+ #
812
+ # @example
813
+ #
814
+ # module UiHelpers
815
+ # def run_in_browser
816
+ # # ...
817
+ # end
818
+ # end
819
+ #
820
+ # RSpec.configure do |config|
821
+ # config.extend(UiHelpers, :type => :request)
822
+ # end
823
+ #
824
+ # describe "edit profile", :type => :request do
825
+ # run_in_browser
826
+ #
827
+ # it "does stuff in the client" do
828
+ # # ...
829
+ # end
830
+ # end
831
+ #
832
+ # @see #include
833
+ def extend(mod, *filters)
834
+ include_or_extend_modules << [:extend, mod, Metadata.build_hash_from(filters)]
835
+ end
836
+
837
+ # @private
838
+ #
839
+ # Used internally to extend a group with modules using `include` and/or
840
+ # `extend`.
841
+ def configure_group(group)
842
+ include_or_extend_modules.each do |include_or_extend, mod, filters|
843
+ next unless filters.empty? || group.any_apply?(filters)
844
+ send("safe_#{include_or_extend}", mod, group)
845
+ end
846
+ end
847
+
848
+ # @private
849
+ def safe_include(mod, host)
850
+ host.send(:include,mod) unless host < mod
851
+ end
852
+
853
+ # @private
854
+ def setup_load_path_and_require(paths)
855
+ directories = ['lib', default_path].select { |p| File.directory? p }
856
+ RSpec::Core::RubyProject.add_to_load_path(*directories)
857
+ paths.each {|path| require path}
858
+ @requires += paths
859
+ end
860
+
861
+ # @private
862
+ if RUBY_VERSION.to_f >= 1.9
863
+ def safe_extend(mod, host)
864
+ host.extend(mod) unless (class << host; self; end) < mod
865
+ end
866
+ else
867
+ def safe_extend(mod, host)
868
+ host.extend(mod) unless (class << host; self; end).included_modules.include?(mod)
869
+ end
870
+ end
871
+
872
+ # @private
873
+ def configure_mock_framework
874
+ RSpec::Core::ExampleGroup.send(:include, mock_framework)
875
+ end
876
+
877
+ # @private
878
+ def configure_expectation_framework
879
+ expectation_frameworks.each do |framework|
880
+ RSpec::Core::ExampleGroup.send(:include, framework)
881
+ end
882
+ end
883
+
884
+ # @private
885
+ def load_spec_files
886
+ files_to_run.uniq.each {|f| load File.expand_path(f) }
887
+ @spec_files_loaded = true
888
+ end
889
+
890
+ # @private
891
+ DEFAULT_FORMATTER = lambda { |string| string }
892
+
893
+ # Formats the docstring output using the block provided.
894
+ #
895
+ # @example
896
+ # # This will strip the descriptions of both examples and example groups.
897
+ # RSpec.configure do |config|
898
+ # config.format_docstrings { |s| s.strip }
899
+ # end
900
+ def format_docstrings(&block)
901
+ @format_docstrings_block = block_given? ? block : DEFAULT_FORMATTER
902
+ end
903
+
904
+ # @private
905
+ def format_docstrings_block
906
+ @format_docstrings_block ||= DEFAULT_FORMATTER
907
+ end
908
+
909
+ # @private
910
+ def self.delegate_to_ordering_manager(*methods)
911
+ methods.each do |method|
912
+ define_method method do |*args, &block|
913
+ ordering_manager.__send__(method, *args, &block)
914
+ end
915
+ end
916
+ end
917
+
918
+ # @macro delegate_to_ordering_manager
919
+ #
920
+ # Sets the seed value and sets the default global ordering to random.
921
+ delegate_to_ordering_manager :seed=
922
+
923
+ # @macro delegate_to_ordering_manager
924
+ # Seed for random ordering (default: generated randomly each run).
925
+ #
926
+ # When you run specs with `--order random`, RSpec generates a random seed
927
+ # for the randomization and prints it to the `output_stream` (assuming
928
+ # you're using RSpec's built-in formatters). If you discover an ordering
929
+ # dependency (i.e. examples fail intermittently depending on order), set
930
+ # this (on Configuration or on the command line with `--seed`) to run
931
+ # using the same seed while you debug the issue.
932
+ #
933
+ # We recommend, actually, that you use the command line approach so you
934
+ # don't accidentally leave the seed encoded.
935
+ delegate_to_ordering_manager :seed
936
+
937
+ # @macro delegate_to_ordering_manager
938
+ #
939
+ # Sets the default global order and, if order is `'rand:<seed>'`, also sets the seed.
940
+ delegate_to_ordering_manager :order=
941
+
942
+ # @macro delegate_to_ordering_manager
943
+ # Registers a named ordering strategy that can later be
944
+ # used to order an example group's subgroups by adding
945
+ # `:order => <name>` metadata to the example group.
946
+ #
947
+ # @param name [Symbol] The name of the ordering.
948
+ # @yield Block that will order the given examples or example groups
949
+ # @yieldparam list [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGroup>] The examples or groups to order
950
+ # @yieldreturn [Array<RSpec::Core::Example>, Array<RSpec::Core::ExampleGroup>] The re-ordered examples or groups
951
+ #
952
+ # @example
953
+ # RSpec.configure do |rspec|
954
+ # rspec.register_ordering :reverse do |list|
955
+ # list.reverse
956
+ # end
957
+ # end
958
+ #
959
+ # describe MyClass, :order => :reverse do
960
+ # # ...
961
+ # end
962
+ #
963
+ # @note Pass the symbol `:global` to set the ordering strategy that
964
+ # will be used to order the top-level example groups and any example
965
+ # groups that do not have declared `:order` metadata.
966
+ delegate_to_ordering_manager :register_ordering
967
+
968
+ # @private
969
+ delegate_to_ordering_manager :seed_used?, :ordering_registry
970
+
971
+ # Set Ruby warnings on or off
972
+ def warnings= value
973
+ $VERBOSE = !!value
974
+ end
975
+
976
+ def warnings
977
+ $VERBOSE
978
+ end
979
+
980
+ # Exposes the current running example via the named
981
+ # helper method. RSpec 2.x exposed this via `example`,
982
+ # but in RSpec 3.0, the example is instead exposed via
983
+ # an arg yielded to `it`, `before`, `let`, etc. However,
984
+ # some extension gems (such as Capybara) depend on the
985
+ # RSpec 2.x's `example` method, so this config option
986
+ # can be used to maintain compatibility.
987
+ #
988
+ # @param method_name [Symbol] the name of the helper method
989
+ #
990
+ # @example
991
+ #
992
+ # RSpec.configure do |rspec|
993
+ # rspec.expose_current_running_example_as :example
994
+ # end
995
+ #
996
+ # describe MyClass do
997
+ # before do
998
+ # # `example` can be used here because of the above config.
999
+ # do_something if example.metadata[:type] == "foo"
1000
+ # end
1001
+ # end
1002
+ def expose_current_running_example_as(method_name)
1003
+ ExposeCurrentExample.module_eval do
1004
+ extend RSpec::SharedContext
1005
+ let(method_name) { |ex| ex }
1006
+ end
1007
+
1008
+ include ExposeCurrentExample
1009
+ end
1010
+
1011
+ module ExposeCurrentExample; end
1012
+
1013
+ # Turns deprecation warnings into errors, in order to surface
1014
+ # the full backtrace of the call site. This can be useful when
1015
+ # you need more context to address a deprecation than the
1016
+ # single-line call site normally provided.
1017
+ #
1018
+ # @example
1019
+ #
1020
+ # RSpec.configure do |rspec|
1021
+ # rspec.raise_errors_for_deprecations!
1022
+ # end
1023
+ def raise_errors_for_deprecations!
1024
+ self.deprecation_stream = Formatters::DeprecationFormatter::RaiseErrorStream.new
1025
+ end
1026
+
1027
+ private
1028
+
1029
+ def get_files_to_run(paths)
1030
+ FlatMap.flat_map(paths) do |path|
1031
+ path = path.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
1032
+ File.directory?(path) ? gather_directories(path) : extract_location(path)
1033
+ end.sort
1034
+ end
1035
+
1036
+ def gather_directories(path)
1037
+ stripped = "{#{pattern.gsub(/\s*,\s*/, ',')}}"
1038
+ files = pattern =~ /^#{Regexp.escape path}/ ? Dir[stripped] : Dir["#{path}/#{stripped}"]
1039
+ files.sort
1040
+ end
1041
+
1042
+ def extract_location(path)
1043
+ if path =~ /^(.*?)((?:\:\d+)+)$/
1044
+ path, lines = $1, $2[1..-1].split(":").map{|n| n.to_i}
1045
+ filter_manager.add_location path, lines
1046
+ end
1047
+ path
1048
+ end
1049
+
1050
+ def command
1051
+ $0.split(File::SEPARATOR).last
1052
+ end
1053
+
1054
+ def value_for(key, default=nil)
1055
+ @preferred_options.has_key?(key) ? @preferred_options[key] : default
1056
+ end
1057
+
1058
+ def assert_no_example_groups_defined(config_option)
1059
+ if RSpec.world.example_groups.any?
1060
+ raise MustBeConfiguredBeforeExampleGroupsError.new(
1061
+ "RSpec's #{config_option} configuration option must be configured before " +
1062
+ "any example groups are defined, but you have already defined a group."
1063
+ )
1064
+ end
1065
+ end
1066
+
1067
+ def output_to_tty?(output=output_stream)
1068
+ tty? || (output.respond_to?(:tty?) && output.tty?)
1069
+ end
1070
+
1071
+ def built_in_formatter(key)
1072
+ case key.to_s
1073
+ when 'd', 'doc', 'documentation', 's', 'n', 'spec', 'nested'
1074
+ require 'rspec/core/formatters/documentation_formatter'
1075
+ RSpec::Core::Formatters::DocumentationFormatter
1076
+ when 'h', 'html'
1077
+ require 'rspec/core/formatters/html_formatter'
1078
+ RSpec::Core::Formatters::HtmlFormatter
1079
+ when 'p', 'progress'
1080
+ require 'rspec/core/formatters/progress_formatter'
1081
+ RSpec::Core::Formatters::ProgressFormatter
1082
+ when 'j', 'json'
1083
+ require 'rspec/core/formatters/json_formatter'
1084
+ RSpec::Core::Formatters::JsonFormatter
1085
+ end
1086
+ end
1087
+
1088
+ def custom_formatter(formatter_ref)
1089
+ if Class === formatter_ref
1090
+ formatter_ref
1091
+ elsif string_const?(formatter_ref)
1092
+ begin
1093
+ formatter_ref.gsub(/^::/,'').split('::').inject(Object) { |const,string| const.const_get string }
1094
+ rescue NameError
1095
+ require( path_for(formatter_ref) ) ? retry : raise
1096
+ end
1097
+ end
1098
+ end
1099
+
1100
+ def string_const?(str)
1101
+ str.is_a?(String) && /\A[A-Z][a-zA-Z0-9_:]*\z/ =~ str
1102
+ end
1103
+
1104
+ def path_for(const_ref)
1105
+ underscore_with_fix_for_non_standard_rspec_naming(const_ref)
1106
+ end
1107
+
1108
+ def underscore_with_fix_for_non_standard_rspec_naming(string)
1109
+ underscore(string).sub(%r{(^|/)r_spec($|/)}, '\\1rspec\\2')
1110
+ end
1111
+
1112
+ # activesupport/lib/active_support/inflector/methods.rb, line 48
1113
+ def underscore(camel_cased_word)
1114
+ word = camel_cased_word.to_s.dup
1115
+ word.gsub!(/::/, '/')
1116
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
1117
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
1118
+ word.tr!("-", "_")
1119
+ word.downcase!
1120
+ word
1121
+ end
1122
+
1123
+ def file_at(path)
1124
+ FileUtils.mkdir_p(File.dirname(path))
1125
+ File.new(path, 'w')
1126
+ end
1127
+ end
1128
+ end
1129
+ end