rspec-rails 4.0.0.beta3 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Capybara.md +5 -54
  5. data/Changelog.md +61 -7
  6. data/README.md +20 -19
  7. data/lib/generators/rspec.rb +0 -6
  8. data/lib/generators/rspec/controller/controller_generator.rb +13 -5
  9. data/lib/generators/rspec/controller/templates/request_spec.rb +14 -0
  10. data/lib/generators/rspec/controller/templates/routing_spec.rb +1 -1
  11. data/lib/generators/rspec/feature/feature_generator.rb +2 -2
  12. data/lib/generators/rspec/{generators → generator}/generator_generator.rb +2 -2
  13. data/lib/generators/rspec/{generators → generator}/templates/generator_spec.rb +0 -0
  14. data/lib/generators/rspec/helper/helper_generator.rb +1 -1
  15. data/lib/generators/rspec/install/install_generator.rb +4 -4
  16. data/lib/generators/rspec/install/templates/spec/rails_helper.rb +17 -16
  17. data/lib/generators/rspec/integration/integration_generator.rb +3 -3
  18. data/lib/generators/rspec/mailer/mailer_generator.rb +1 -1
  19. data/lib/generators/rspec/model/model_generator.rb +4 -4
  20. data/lib/generators/rspec/scaffold/scaffold_generator.rb +26 -18
  21. data/lib/generators/rspec/scaffold/templates/api_controller_spec.rb +0 -36
  22. data/lib/generators/rspec/scaffold/templates/api_request_spec.rb +131 -0
  23. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +10 -10
  24. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +1 -1
  25. data/lib/generators/rspec/scaffold/templates/index_spec.rb +2 -2
  26. data/lib/generators/rspec/scaffold/templates/new_spec.rb +1 -1
  27. data/lib/generators/rspec/scaffold/templates/request_spec.rb +133 -0
  28. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +8 -10
  29. data/lib/generators/rspec/scaffold/templates/show_spec.rb +1 -1
  30. data/lib/generators/rspec/system/system_generator.rb +1 -1
  31. data/lib/generators/rspec/view/view_generator.rb +2 -2
  32. data/lib/rspec-rails.rb +6 -9
  33. data/lib/rspec/rails/adapters.rb +10 -76
  34. data/lib/rspec/rails/configuration.rb +72 -36
  35. data/lib/rspec/rails/example/channel_example_group.rb +2 -2
  36. data/lib/rspec/rails/example/controller_example_group.rb +4 -4
  37. data/lib/rspec/rails/example/feature_example_group.rb +6 -26
  38. data/lib/rspec/rails/example/helper_example_group.rb +2 -10
  39. data/lib/rspec/rails/example/mailbox_example_group.rb +1 -1
  40. data/lib/rspec/rails/example/mailer_example_group.rb +2 -2
  41. data/lib/rspec/rails/example/rails_example_group.rb +1 -1
  42. data/lib/rspec/rails/example/system_example_group.rb +14 -7
  43. data/lib/rspec/rails/example/view_example_group.rb +38 -48
  44. data/lib/rspec/rails/extensions/active_record/proxy.rb +5 -10
  45. data/lib/rspec/rails/feature_check.rb +1 -28
  46. data/lib/rspec/rails/fixture_file_upload_support.rb +8 -13
  47. data/lib/rspec/rails/fixture_support.rb +37 -31
  48. data/lib/rspec/rails/matchers/action_cable.rb +1 -1
  49. data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +3 -3
  50. data/lib/rspec/rails/matchers/active_job.rb +132 -18
  51. data/lib/rspec/rails/matchers/base_matcher.rb +4 -10
  52. data/lib/rspec/rails/matchers/have_enqueued_mail.rb +9 -6
  53. data/lib/rspec/rails/matchers/have_http_status.rb +7 -7
  54. data/lib/rspec/rails/matchers/relation_match_array.rb +1 -1
  55. data/lib/rspec/rails/matchers/routing_matchers.rb +11 -11
  56. data/lib/rspec/rails/tasks/rspec.rake +7 -17
  57. data/lib/rspec/rails/vendor/capybara.rb +10 -15
  58. data/lib/rspec/rails/version.rb +1 -1
  59. data/lib/rspec/rails/view_path_builder.rb +1 -1
  60. data/lib/rspec/rails/view_rendering.rb +3 -3
  61. metadata +34 -33
  62. metadata.gz.sig +0 -0
  63. data/lib/generators/rspec/observer/observer_generator.rb +0 -13
  64. data/lib/generators/rspec/observer/templates/observer_spec.rb +0 -7
@@ -48,7 +48,7 @@ module RSpec
48
48
  def have_broadcasted_to(target = nil)
49
49
  check_action_cable_adapter
50
50
 
51
- ActionCable::HaveBroadcastedTo.new(target, :channel => described_class)
51
+ ActionCable::HaveBroadcastedTo.new(target, channel: described_class)
52
52
  end
53
53
  alias_method :broadcast_to, :have_broadcasted_to
54
54
 
@@ -8,15 +8,15 @@ module RSpec
8
8
  def initialize(target, channel:)
9
9
  @target = target
10
10
  @channel = channel
11
- @block = Proc.new {}
11
+ @block = proc { }
12
12
  @data = nil
13
13
  set_expected_number(:exactly, 1)
14
14
  end
15
15
 
16
- def with(data = nil)
16
+ def with(data = nil, &block)
17
17
  @data = data
18
18
  @data = @data.with_indifferent_access if @data.is_a?(Hash)
19
- @block = Proc.new if block_given?
19
+ @block = block if block
20
20
  self
21
21
  end
22
22
 
@@ -15,7 +15,7 @@ module RSpec
15
15
  @args = []
16
16
  @queue = nil
17
17
  @at = nil
18
- @block = Proc.new {}
18
+ @block = proc { }
19
19
  set_expected_number(:exactly, 1)
20
20
  end
21
21
 
@@ -26,12 +26,16 @@ module RSpec
26
26
  end
27
27
 
28
28
  def on_queue(queue)
29
- @queue = queue
29
+ @queue = queue.to_s
30
30
  self
31
31
  end
32
32
 
33
- def at(date)
34
- @at = date
33
+ def at(time_or_date)
34
+ case time_or_date
35
+ when Time then @at = Time.at(time_or_date.to_f)
36
+ else
37
+ @at = time_or_date
38
+ end
35
39
  self
36
40
  end
37
41
 
@@ -67,7 +71,7 @@ module RSpec
67
71
  end
68
72
 
69
73
  def failure_message
70
- "expected to enqueue #{base_message}".tap do |msg|
74
+ "expected to #{self.class::FAILURE_MESSAGE_EXPECTATION_ACTION} #{base_message}".tap do |msg|
71
75
  if @unmatching_jobs.any?
72
76
  msg << "\nQueued jobs:"
73
77
  @unmatching_jobs.each do |job|
@@ -78,7 +82,7 @@ module RSpec
78
82
  end
79
83
 
80
84
  def failure_message_when_negated
81
- "expected not to enqueue #{base_message}"
85
+ "expected not to #{self.class::FAILURE_MESSAGE_EXPECTATION_ACTION} #{base_message}"
82
86
  end
83
87
 
84
88
  def message_expectation_modifier
@@ -97,7 +101,7 @@ module RSpec
97
101
 
98
102
  def check(jobs)
99
103
  @matching_jobs, @unmatching_jobs = jobs.partition do |job|
100
- if job_match?(job) && arguments_match?(job) && other_attributes_match?(job)
104
+ if job_match?(job) && arguments_match?(job) && queue_match?(job) && at_match?(job)
101
105
  args = deserialize_arguments(job)
102
106
  @block.call(*args)
103
107
  true
@@ -119,7 +123,7 @@ module RSpec
119
123
  msg << " with #{@args}," if @args.any?
120
124
  msg << " on queue #{@queue}," if @queue
121
125
  msg << " at #{@at.inspect}," if @at
122
- msg << " but enqueued #{@matching_jobs_count}"
126
+ msg << " but #{self.class::MESSAGE_EXPECTATION_ACTION} #{@matching_jobs_count}"
123
127
  end
124
128
  end
125
129
 
@@ -148,19 +152,18 @@ module RSpec
148
152
  end
149
153
  end
150
154
 
151
- def other_attributes_match?(job)
152
- serialized_attributes.all? { |key, value| value == job[key] }
153
- end
155
+ def queue_match?(job)
156
+ return true unless @queue
154
157
 
155
- def serialized_attributes
156
- {}.tap do |attributes|
157
- attributes[:at] = serialized_at if @at
158
- attributes[:queue] = @queue if @queue
159
- end
158
+ @queue == job[:queue]
160
159
  end
161
160
 
162
- def serialized_at
163
- @at == :no_wait ? nil : @at.to_f
161
+ def at_match?(job)
162
+ return true unless @at
163
+ return job[:at].nil? if @at == :no_wait
164
+ return false unless job[:at]
165
+
166
+ values_match?(@at, Time.at(job[:at]))
164
167
  end
165
168
 
166
169
  def set_expected_number(relativity, count)
@@ -194,6 +197,9 @@ module RSpec
194
197
 
195
198
  # @private
196
199
  class HaveEnqueuedJob < Base
200
+ FAILURE_MESSAGE_EXPECTATION_ACTION = 'enqueue'.freeze
201
+ MESSAGE_EXPECTATION_ACTION = 'enqueued'.freeze
202
+
197
203
  def initialize(job)
198
204
  super()
199
205
  @job = job
@@ -218,6 +224,9 @@ module RSpec
218
224
 
219
225
  # @private
220
226
  class HaveBeenEnqueued < Base
227
+ FAILURE_MESSAGE_EXPECTATION_ACTION = 'enqueue'.freeze
228
+ MESSAGE_EXPECTATION_ACTION = 'enqueued'.freeze
229
+
221
230
  def matches?(job)
222
231
  @job = job
223
232
  check(queue_adapter.enqueued_jobs)
@@ -229,6 +238,38 @@ module RSpec
229
238
  !matches?(proc)
230
239
  end
231
240
  end
241
+
242
+ # @private
243
+ class HavePerformedJob < Base
244
+ FAILURE_MESSAGE_EXPECTATION_ACTION = 'perform'.freeze
245
+ MESSAGE_EXPECTATION_ACTION = 'performed'.freeze
246
+
247
+ def initialize(job)
248
+ super()
249
+ @job = job
250
+ end
251
+
252
+ def matches?(proc)
253
+ raise ArgumentError, "have_performed_job only supports block expectations" unless Proc === proc
254
+
255
+ original_performed_jobs_count = queue_adapter.performed_jobs.count
256
+ proc.call
257
+ in_block_jobs = queue_adapter.performed_jobs.drop(original_performed_jobs_count)
258
+
259
+ check(in_block_jobs)
260
+ end
261
+ end
262
+
263
+ # @private
264
+ class HaveBeenPerformed < Base
265
+ FAILURE_MESSAGE_EXPECTATION_ACTION = 'perform'.freeze
266
+ MESSAGE_EXPECTATION_ACTION = 'performed'.freeze
267
+
268
+ def matches?(job)
269
+ @job = job
270
+ check(queue_adapter.performed_jobs)
271
+ end
272
+ end
232
273
  end
233
274
 
234
275
  # @api public
@@ -316,6 +357,79 @@ module RSpec
316
357
  ActiveJob::HaveBeenEnqueued.new
317
358
  end
318
359
 
360
+ # @api public
361
+ # Passes if a job has been performed inside block. May chain at_least, at_most or exactly to specify a number of times.
362
+ #
363
+ # @example
364
+ # expect {
365
+ # perform_jobs { HeavyLiftingJob.perform_later }
366
+ # }.to have_performed_job
367
+ #
368
+ # expect {
369
+ # perform_jobs {
370
+ # HelloJob.perform_later
371
+ # HeavyLiftingJob.perform_later
372
+ # }
373
+ # }.to have_performed_job(HelloJob).exactly(:once)
374
+ #
375
+ # expect {
376
+ # perform_jobs { 3.times { HelloJob.perform_later } }
377
+ # }.to have_performed_job(HelloJob).at_least(2).times
378
+ #
379
+ # expect {
380
+ # perform_jobs { HelloJob.perform_later }
381
+ # }.to have_performed_job(HelloJob).at_most(:twice)
382
+ #
383
+ # expect {
384
+ # perform_jobs {
385
+ # HelloJob.perform_later
386
+ # HeavyLiftingJob.perform_later
387
+ # }
388
+ # }.to have_performed_job(HelloJob).and have_performed_job(HeavyLiftingJob)
389
+ #
390
+ # expect {
391
+ # perform_jobs {
392
+ # HelloJob.set(wait_until: Date.tomorrow.noon, queue: "low").perform_later(42)
393
+ # }
394
+ # }.to have_performed_job.with(42).on_queue("low").at(Date.tomorrow.noon)
395
+ def have_performed_job(job = nil)
396
+ check_active_job_adapter
397
+ ActiveJob::HavePerformedJob.new(job)
398
+ end
399
+ alias_method :perform_job, :have_performed_job
400
+
401
+ # @api public
402
+ # Passes if a job has been performed. May chain at_least, at_most or exactly to specify a number of times.
403
+ #
404
+ # @example
405
+ # before do
406
+ # ActiveJob::Base.queue_adapter.performed_jobs.clear
407
+ # ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
408
+ # ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
409
+ # end
410
+ #
411
+ # HeavyLiftingJob.perform_later
412
+ # expect(HeavyLiftingJob).to have_been_performed
413
+ #
414
+ # HelloJob.perform_later
415
+ # HeavyLiftingJob.perform_later
416
+ # expect(HeavyLiftingJob).to have_been_performed.exactly(:once)
417
+ #
418
+ # 3.times { HelloJob.perform_later }
419
+ # expect(HelloJob).to have_been_performed.at_least(2).times
420
+ #
421
+ # HelloJob.perform_later
422
+ # HeavyLiftingJob.perform_later
423
+ # expect(HelloJob).to have_been_performed
424
+ # expect(HeavyLiftingJob).to have_been_performed
425
+ #
426
+ # HelloJob.set(wait_until: Date.tomorrow.noon, queue: "low").perform_later(42)
427
+ # expect(HelloJob).to have_been_performed.with(42).on_queue("low").at(Date.tomorrow.noon)
428
+ def have_been_performed
429
+ check_active_job_adapter
430
+ ActiveJob::HaveBeenPerformed.new
431
+ end
432
+
319
433
  private
320
434
 
321
435
  # @private
@@ -1,7 +1,9 @@
1
1
  module RSpec
2
2
  module Rails
3
3
  module Matchers
4
- # @ api private
4
+ # @api private
5
+ #
6
+ # Base class to build matchers. Should not be instantiated directly.
5
7
  class BaseMatcher
6
8
  include RSpec::Matchers::Composable
7
9
 
@@ -119,15 +121,7 @@ module RSpec
119
121
  raise "#{self.class.name} needs to supply#{ivar_list}"
120
122
  end
121
123
 
122
- if RUBY_VERSION.to_f < 1.9
123
- # :nocov:
124
- def present_ivars
125
- instance_variables.map(&:to_sym)
126
- end
127
- # :nocov:
128
- else
129
- alias present_ivars instance_variables
130
- end
124
+ alias present_ivars instance_variables
131
125
 
132
126
  # @private
133
127
  module HashFormatting
@@ -1,4 +1,7 @@
1
- require "rspec/mocks"
1
+ # We require the minimum amount of rspec-mocks possible to avoid
2
+ # conflicts with other mocking frameworks.
3
+ # See: https://github.com/rspec/rspec-rails/issues/2252
4
+ require "rspec/mocks/argument_matchers"
2
5
  require "rspec/rails/matchers/active_job"
3
6
 
4
7
  module RSpec
@@ -11,7 +14,7 @@ module RSpec
11
14
  class HaveEnqueuedMail < ActiveJob::HaveEnqueuedJob
12
15
  MAILER_JOB_METHOD = 'deliver_now'.freeze
13
16
 
14
- include RSpec::Mocks::ExampleMethods
17
+ include RSpec::Mocks::ArgumentMatchers
15
18
 
16
19
  def initialize(mailer_class, method_name)
17
20
  super(nil)
@@ -90,7 +93,7 @@ module RSpec
90
93
  end
91
94
 
92
95
  def yield_mail_args(block)
93
- Proc.new { |*job_args| block.call(*(job_args - base_mailer_args)) }
96
+ proc { |*job_args| block.call(*(job_args - base_mailer_args)) }
94
97
  end
95
98
 
96
99
  def check_active_job_adapter
@@ -128,15 +131,15 @@ module RSpec
128
131
  end
129
132
 
130
133
  def legacy_mail?(job)
131
- job[:job] == ActionMailer::DeliveryJob
134
+ job[:job] <= ActionMailer::DeliveryJob
132
135
  end
133
136
 
134
137
  def parameterized_mail?(job)
135
- RSpec::Rails::FeatureCheck.has_action_mailer_parameterized? && job[:job] == ActionMailer::Parameterized::DeliveryJob
138
+ RSpec::Rails::FeatureCheck.has_action_mailer_parameterized? && job[:job] <= ActionMailer::Parameterized::DeliveryJob
136
139
  end
137
140
 
138
141
  def unified_mail?(job)
139
- RSpec::Rails::FeatureCheck.has_action_mailer_unified_delivery? && job[:job] == ActionMailer::MailDeliveryJob
142
+ RSpec::Rails::FeatureCheck.has_action_mailer_unified_delivery? && job[:job] <= ActionMailer::MailDeliveryJob
140
143
  end
141
144
  end
142
145
  # @api public
@@ -73,7 +73,7 @@ module RSpec
73
73
  # @example
74
74
  # expect(response).to have_http_status(404)
75
75
  #
76
- # @see RSpec::Rails::Matchers.have_http_status
76
+ # @see RSpec::Rails::Matchers#have_http_status
77
77
  class NumericCode < RSpec::Rails::Matchers::BaseMatcher
78
78
  include HaveHttpStatus
79
79
 
@@ -123,7 +123,7 @@ module RSpec
123
123
  # @example
124
124
  # expect(response).to have_http_status(:created)
125
125
  #
126
- # @see RSpec::Rails::Matchers.have_http_status
126
+ # @see RSpec::Rails::Matchers#have_http_status
127
127
  # @see https://github.com/rack/rack/blob/master/lib/rack/utils.rb `Rack::Utils::SYMBOL_TO_STATUS_CODE`
128
128
  class SymbolicStatus < RSpec::Rails::Matchers::BaseMatcher
129
129
  include HaveHttpStatus
@@ -236,8 +236,8 @@ module RSpec
236
236
  # expect(response).to have_http_status(:missing)
237
237
  # expect(response).to have_http_status(:redirect)
238
238
  #
239
- # @see RSpec::Rails::Matchers.have_http_status
240
- # @see ActionDispatch::TestResponse
239
+ # @see RSpec::Rails::Matchers#have_http_status
240
+ # @see https://github.com/rails/rails/blob/6-0-stable/actionpack/lib/action_dispatch/testing/test_response.rb `ActionDispatch::TestResponse`
241
241
  class GenericStatus < RSpec::Rails::Matchers::BaseMatcher
242
242
  include HaveHttpStatus
243
243
 
@@ -293,9 +293,9 @@ module RSpec
293
293
  protected
294
294
 
295
295
  RESPONSE_METHODS = {
296
- :success => 'successful',
297
- :error => 'server_error',
298
- :missing => 'not_found'
296
+ success: 'successful',
297
+ error: 'server_error',
298
+ missing: 'not_found'
299
299
  }.freeze
300
300
 
301
301
  def check_expected_status(test_response, expected)
@@ -1,3 +1,3 @@
1
- if defined?(ActiveRecord::Relation)
1
+ if defined?(ActiveRecord::Relation) && defined?(RSpec::Matchers::BuiltIn::OperatorMatcher) # RSpec 4 removed OperatorMatcher
2
2
  RSpec::Matchers::BuiltIn::OperatorMatcher.register(ActiveRecord::Relation, '=~', RSpec::Matchers::BuiltIn::ContainExactly)
3
3
  end
@@ -14,7 +14,7 @@ module RSpec
14
14
  @expected.merge!(expected[0])
15
15
  else
16
16
  controller, action = expected[0].split('#')
17
- @expected.merge!(:controller => controller, :action => action)
17
+ @expected.merge!(controller: controller, action: action)
18
18
  end
19
19
  end
20
20
 
@@ -26,7 +26,7 @@ module RSpec
26
26
  path, query = *verb_to_path_map.values.first.split('?')
27
27
  @scope.assert_recognizes(
28
28
  @expected,
29
- { :method => verb_to_path_map.keys.first, :path => path },
29
+ {method: verb_to_path_map.keys.first, path: path},
30
30
  Rack::Utils.parse_nested_query(query)
31
31
  )
32
32
  end
@@ -50,12 +50,12 @@ module RSpec
50
50
  #
51
51
  # @example
52
52
  #
53
- # expect(:get => "/things/special").to route_to(
54
- # :controller => "things",
55
- # :action => "special"
53
+ # expect(get: "/things/special").to route_to(
54
+ # controller: "things",
55
+ # action: "special"
56
56
  # )
57
57
  #
58
- # expect(:get => "/things/special").to route_to("things#special")
58
+ # expect(get: "/things/special").to route_to("things#special")
59
59
  #
60
60
  # @see https://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html#method-i-assert_recognizes
61
61
  def route_to(*expected)
@@ -72,7 +72,7 @@ module RSpec
72
72
  @actual = path
73
73
  match_unless_raises ActionController::RoutingError do
74
74
  @routing_options = @scope.routes.recognize_path(
75
- path.values.first, :method => path.keys.first
75
+ path.values.first, method: path.keys.first
76
76
  )
77
77
  end
78
78
  end
@@ -95,9 +95,9 @@ module RSpec
95
95
  # `RouteSet#recognize_path`.
96
96
  #
97
97
  # @example You can use route helpers provided by rspec-rails.
98
- # expect(:get => "/a/path").to be_routable
99
- # expect(:post => "/another/path").to be_routable
100
- # expect(:put => "/yet/another/path").to be_routable
98
+ # expect(get: "/a/path").to be_routable
99
+ # expect(post: "/another/path").to be_routable
100
+ # expect(put: "/yet/another/path").to be_routable
101
101
  def be_routable
102
102
  BeRoutableMatcher.new(self)
103
103
  end
@@ -115,7 +115,7 @@ module RSpec
115
115
  # Shorthand method for matching this type of route.
116
116
  %w[get post put patch delete options head].each do |method|
117
117
  define_method method do |path|
118
- { method.to_sym => path }
118
+ {method.to_sym => path}
119
119
  end
120
120
  end
121
121
  end
@@ -3,19 +3,19 @@ if default = Rake.application.instance_variable_get('@tasks')['default']
3
3
  default.prerequisites.delete('test')
4
4
  end
5
5
 
6
- task :default => :spec
6
+ task default: :spec
7
7
 
8
- task :stats => "spec:statsetup"
8
+ task stats: "spec:statsetup"
9
9
 
10
10
  desc "Run all specs in spec directory (excluding plugin specs)"
11
- RSpec::Core::RakeTask.new(:spec => "spec:prepare")
11
+ RSpec::Core::RakeTask.new(spec: "spec:prepare")
12
12
 
13
13
  namespace :spec do
14
14
  types = begin
15
- dirs = Dir['./spec/**/*_spec.rb'].
16
- map { |f| f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') }.
17
- uniq.
18
- select { |f| File.directory?(f) }
15
+ dirs = Dir['./spec/**/*_spec.rb']
16
+ .map { |f| f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') }
17
+ .uniq
18
+ .select { |f| File.directory?(f) }
19
19
  Hash[dirs.map { |d| [d.split('/').last, d] }]
20
20
  end
21
21
 
@@ -35,16 +35,6 @@ namespace :spec do
35
35
  end
36
36
  end
37
37
 
38
- # RCov task only enabled for Ruby 1.8
39
- if RUBY_VERSION < '1.9'
40
- desc "Run all specs with rcov"
41
- RSpec::Core::RakeTask.new(:rcov => "spec:prepare") do |t|
42
- t.rcov = true
43
- t.pattern = "./spec/**/*_spec.rb"
44
- t.rcov_opts = '--exclude /gems/,/Library/,/usr/,lib/tasks,.bundle,config,/lib/rspec/,/lib/rspec-,spec'
45
- end
46
- end
47
-
48
38
  task :statsetup do
49
39
  require 'rails/code_statistics'
50
40
  types.each do |type, dir|