rspec-core 2.14.3 → 2.14.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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