rspec-core 2.14.3 → 2.14.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,26 @@
1
+ ### 2.14.4 / 2013-07-21
2
+ [full changelog](http://github.com/rspec/rspec-core/compare/v2.14.3...v2.14.4)
3
+
4
+ Bug fixes
5
+
6
+ * Fix regression in 2.14: ensure configured requires (via `-r` option)
7
+ are loaded before spec files are loaded. This allows the spec files
8
+ to programatically change the file pattern (Jon Rowe).
9
+ * Autoload `RSpec::Mocks` and `RSpec::Expectations` when referenced if
10
+ they are not already loaded (`RSpec::Matches` has been autoloaded
11
+ for a while). In the `rspec` gem, we changed it recently to stop
12
+ loading `rspec/mocks` and `rspec/expectations` by default, as some
13
+ users reported problems where they were intending to use mocha,
14
+ not rspec-mocks, but rspec-mocks was loaded and causing a conflict.
15
+ rspec-core loads mocks and expectations at the appropriate time, so
16
+ it seemed like a safe change -- but caused a problem for some authors
17
+ of libraries that integrate with RSpec. This fixes that problem.
18
+ (Myron Marston)
19
+ * Gracefully handle a command like `rspec --profile path/to/spec.rb`:
20
+ the `path/to/spec.rb` arg was being wrongly treated as the `profile`
21
+ integer arg, which got cast `0` using `to_i`, causing no profiled
22
+ examples to be printed. (Jon Rowe)
23
+
1
24
  ### 2.14.3 / 2013-07-13
2
25
  [full changelog](http://github.com/rspec/rspec-core/compare/v2.14.2...v2.14.3)
3
26
 
@@ -29,3 +29,21 @@ Feature: pattern option
29
29
  """
30
30
  When I run `rspec --pattern "spec/**/*.spec"`
31
31
  Then the output should contain "1 example, 0 failures"
32
+
33
+ Scenario: override the default pattern in configuration
34
+ Given a file named "spec/spec_helper.rb" with:
35
+ """ruby
36
+ RSpec.configure do |config|
37
+ config.pattern << ',**/*.spec'
38
+ end
39
+ """
40
+ And a file named "spec/example.spec" with:
41
+ """ruby
42
+ describe "addition" do
43
+ it "adds things" do
44
+ (1 + 2).should eq(3)
45
+ end
46
+ end
47
+ """
48
+ When I run `rspec -rspec_helper`
49
+ Then the output should contain "1 example, 0 failures"
@@ -143,20 +143,26 @@ WARNING
143
143
  end
144
144
  end
145
145
 
146
+ MODULES_TO_AUTOLOAD = {
147
+ :Matchers => "rspec/expectations",
148
+ :Expectations => "rspec/expectations",
149
+ :Mocks => "rspec/mocks"
150
+ }
151
+
146
152
  def self.const_missing(name)
147
- case name
148
- when :Matchers
149
- # Load rspec-expectations when RSpec::Matchers is referenced. This allows
150
- # people to define custom matchers (using `RSpec::Matchers.define`) before
151
- # rspec-core has loaded rspec-expectations (since it delays the loading of
152
- # it to allow users to configure a different assertion/expectation
153
- # framework). `autoload` can't be used since it works with ruby's built-in
154
- # require (e.g. for files that are available relative to a load path dir),
155
- # but not with rubygems' extended require.
156
- require 'rspec/expectations'
157
- ::RSpec::Matchers
158
- else super
159
- end
153
+ # Load rspec-expectations when RSpec::Matchers is referenced. This allows
154
+ # people to define custom matchers (using `RSpec::Matchers.define`) before
155
+ # rspec-core has loaded rspec-expectations (since it delays the loading of
156
+ # it to allow users to configure a different assertion/expectation
157
+ # framework). `autoload` can't be used since it works with ruby's built-in
158
+ # require (e.g. for files that are available relative to a load path dir),
159
+ # but not with rubygems' extended require.
160
+ #
161
+ # As of rspec 2.14.1, we no longer require `rspec/mocks` and
162
+ # `rspec/expectations` when `rspec` is required, so we want
163
+ # to make them available as an autoload. For more info, see:
164
+ require MODULES_TO_AUTOLOAD.fetch(name) { return super }
165
+ ::RSpec.const_get(name)
160
166
  end
161
167
  end
162
168
 
@@ -20,10 +20,11 @@ module RSpec
20
20
 
21
21
  def configure(config)
22
22
  config.filter_manager = filter_manager
23
- process_options_into config
24
23
 
24
+ config.libs = options[:libs] || []
25
25
  config.setup_load_path_and_require(options[:requires] || [])
26
26
 
27
+ process_options_into config
27
28
  load_formatters_into config
28
29
  end
29
30
 
@@ -46,13 +47,13 @@ module RSpec
46
47
  private
47
48
 
48
49
  NON_FORCED_OPTIONS = [
49
- :debug, :requires, :libs, :profile, :drb, :files_or_directories_to_run,
50
+ :debug, :requires, :profile, :drb, :libs, :files_or_directories_to_run,
50
51
  :line_numbers, :full_description, :full_backtrace, :tty
51
52
  ].to_set
52
53
 
53
54
  MERGED_OPTIONS = [:requires, :libs].to_set
54
55
 
55
- UNPROCESSABLE_OPTIONS = [:formatters, :requires].to_set
56
+ UNPROCESSABLE_OPTIONS = [:libs, :formatters, :requires].to_set
56
57
 
57
58
  def force?(key)
58
59
  !NON_FORCED_OPTIONS.include?(key)
@@ -68,7 +69,7 @@ module RSpec
68
69
  def process_options_into(config)
69
70
  opts = options.reject { |k, _| UNPROCESSABLE_OPTIONS.include? k }
70
71
 
71
- order(opts.keys, :libs, :default_path, :pattern).each do |key|
72
+ order(opts.keys, :default_path, :pattern).each do |key|
72
73
  force?(key) ? config.force(key => opts[key]) : config.send("#{key}=", opts[key])
73
74
  end
74
75
  end
@@ -8,10 +8,12 @@ module RSpec
8
8
  # Temporarily support old and new APIs while we transition the other
9
9
  # rspec libs to use a hash for the 2nd arg and no version arg
10
10
  data = Hash === replacement_or_hash ? replacement_or_hash : { :replacement => replacement_or_hash }
11
+ call_site = caller.find { |line| line !~ %r{/lib/rspec/(core|mocks|expectations|matchers|rails)/} }
12
+
11
13
  RSpec.configuration.reporter.deprecation(
12
14
  {
13
15
  :deprecated => deprecated,
14
- :call_site => caller(0)[2]
16
+ :call_site => call_site
15
17
  }.merge(data)
16
18
  )
17
19
  end
@@ -141,7 +141,14 @@ module RSpec::Core
141
141
  elsif argument == false
142
142
  false
143
143
  else
144
- argument.to_i
144
+ begin
145
+ Integer(argument)
146
+ rescue ArgumentError
147
+ Kernel.warn "Non integer specified as profile count, seperate " +
148
+ "your path from options with -- e.g. " +
149
+ "`rspec --profile -- #{argument}`"
150
+ true
151
+ end
145
152
  end
146
153
  end
147
154
 
@@ -1,7 +1,7 @@
1
1
  module RSpec
2
2
  module Core
3
3
  module Version
4
- STRING = '2.14.3'
4
+ STRING = '2.14.4'
5
5
  end
6
6
  end
7
7
  end
@@ -29,6 +29,14 @@ describe RSpec::Core::ConfigurationOptions, :isolated_directory => true, :isolat
29
29
  opts.configure(config)
30
30
  end
31
31
 
32
+ it "sends loads requires before loading specs" do
33
+ opts = config_options_object(*%w[-rspec_helper])
34
+ config = double("config").as_null_object
35
+ expect(config).to receive(:setup_load_path_and_require).ordered
36
+ expect(config).to receive(:files_or_directories_to_run=).ordered
37
+ opts.configure(config)
38
+ end
39
+
32
40
  it "sets up load path and requires before formatter" do
33
41
  opts = config_options_object(*%w[--require a/path -f a/formatter])
34
42
  config = double("config").as_null_object
@@ -14,7 +14,7 @@ describe RSpec::Core::Deprecation do
14
14
  end
15
15
 
16
16
  it "adds the call site" do
17
- expect(RSpec.configuration.reporter).to receive(:deprecation).with(hash_including :call_site => caller(0)[1])
17
+ expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
18
18
  RSpec.deprecate("deprecated_method")
19
19
  end
20
20
 
@@ -31,7 +31,7 @@ describe RSpec::Core::Deprecation do
31
31
  end
32
32
 
33
33
  it "adds the call site" do
34
- expect(RSpec.configuration.reporter).to receive(:deprecation).with(hash_including :call_site => caller(0)[1])
34
+ expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
35
35
  RSpec.deprecate("deprecated_method")
36
36
  end
37
37
  end
@@ -205,6 +205,32 @@ module RSpec::Core
205
205
  end
206
206
  end
207
207
 
208
+ describe '--profile' do
209
+ it 'sets profile_examples to true by default' do
210
+ options = Parser.parse!(%w[--profile])
211
+ expect(options[:profile_examples]).to eq true
212
+ end
213
+
214
+ it 'sets profile_examples to supplied int' do
215
+ options = Parser.parse!(%w[--profile 10])
216
+ expect(options[:profile_examples]).to eq 10
217
+ end
218
+
219
+ it 'sets profile_examples to true when accidentally combined with path' do
220
+ allow(Kernel).to receive(:warn)
221
+ options = Parser.parse!(%w[--profile some/path])
222
+ expect(options[:profile_examples]).to eq true
223
+ end
224
+
225
+ it 'warns when accidentally combined with path' do
226
+ expect(Kernel).to receive(:warn) do |msg|
227
+ expect(msg).to match "Non integer specified as profile count"
228
+ end
229
+ options = Parser.parse!(%w[--profile some/path])
230
+ expect(options[:profile_examples]).to eq true
231
+ end
232
+ end
233
+
208
234
  describe '--warning' do
209
235
  it 'enables warnings' do
210
236
  options = Parser.parse!(%w[--warnings])
@@ -52,4 +52,23 @@ describe RSpec do
52
52
  expect(RSpec.world).not_to equal(world_before_reset)
53
53
  end
54
54
  end
55
+
56
+ # This is hard to test :(. Best way I could come up with was starting
57
+ # fresh ruby process w/o this stuff already loaded.
58
+ it "loads mocks and expectations when the constants are referenced" do
59
+ code = "$LOAD_PATH.replace(#{$LOAD_PATH.inspect}); " +
60
+ 'require "rspec"; ' +
61
+ "puts RSpec::Mocks.name; " +
62
+ "puts RSpec::Expectations.name"
63
+
64
+ result = `ruby -e '#{code}'`.chomp
65
+ expect(result.split("\n")).to eq(%w[ RSpec::Mocks RSpec::Expectations ])
66
+ end
67
+
68
+ it 'correctly raises an error when an invalid const is referenced' do
69
+ expect {
70
+ RSpec::NotAConst
71
+ }.to raise_error(NameError, /uninitialized constant RSpec::NotAConst/)
72
+ end
55
73
  end
74
+
@@ -23,4 +23,14 @@ module RSpecHelpers
23
23
  end
24
24
  end
25
25
 
26
+ def expect_deprecation_with_call_site(file, line)
27
+ expect(RSpec.configuration.reporter).to receive(:deprecation) do |options|
28
+ expect(options[:call_site]).to include([file, line].join(':'))
29
+ end
30
+ end
31
+
32
+ def allow_deprecation
33
+ allow(RSpec.configuration.reporter).to receive(:deprecation)
34
+ end
35
+
26
36
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rspec-core
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 2.14.3
5
+ version: 2.14.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Steven Baker
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2013-07-14 00:00:00.000000000 Z
14
+ date: 2013-07-22 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  version_requirements: !ruby/object:Gem::Requirement
@@ -383,7 +383,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
383
383
  version: '0'
384
384
  segments:
385
385
  - 0
386
- hash: -605318191614617076
386
+ hash: 409767049060748500
387
387
  none: false
388
388
  required_rubygems_version: !ruby/object:Gem::Requirement
389
389
  requirements:
@@ -392,14 +392,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
392
392
  version: '0'
393
393
  segments:
394
394
  - 0
395
- hash: -605318191614617076
395
+ hash: 409767049060748500
396
396
  none: false
397
397
  requirements: []
398
398
  rubyforge_project: rspec
399
399
  rubygems_version: 1.8.24
400
400
  signing_key:
401
401
  specification_version: 3
402
- summary: rspec-core-2.14.3
402
+ summary: rspec-core-2.14.4
403
403
  test_files:
404
404
  - features/Autotest.md
405
405
  - features/README.md