rspec-its 1.0.0 → 1.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e89242dc146a5c9573f8d63e6562cdfb2d737af
4
- data.tar.gz: 633f5d342cec24bf1ccf5333aea83790450aaed8
3
+ metadata.gz: 4627e0d122f6f6d60961135154b6068ff823fa63
4
+ data.tar.gz: 245f30f1298a86c8da41930d50bef0f01bee090c
5
5
  SHA512:
6
- metadata.gz: 228935be4ec664600e892ad3db85744beb98d4838926ae799c8004a34477e0edb62a80f488a8b85addf19cc0863207907f94867f29d9afdda3fd5beb13072549
7
- data.tar.gz: d3d25104450cdfd1d699d3737d1dfabf3481c2cbc31ae216d6926af99e5b16d199912f6720067d92036242e75ca2245fa28d79c237bfb9d03ed879a8e049be2a
6
+ metadata.gz: 47f4f6c32e9df24cfc6710fe5c96e81d82b5dcb3e4ee487065e20809e27ca64b7bf64a7516ef80bf82b74c6d113f3950a80aec890f410277f29df7530911b88a
7
+ data.tar.gz: d8716722becc4400ae94f15ef310336e52cedcd2cb4041de1f9c3fe22904121e23e3cbceb9ff3b6323eab48e7992f03c95a1c45a55a4de395dcee262b63011b8
@@ -5,16 +5,16 @@ rvm:
5
5
  - 1.8.7
6
6
  - 1.9.2
7
7
  - 1.9.3
8
+ - 2.0.0
9
+ - 2.1.0
8
10
  - ree
9
11
  - jruby-18mode
10
- - jruby-19mode
12
+ - jruby
11
13
  - rbx
12
- - 2.0.0
13
- - 2.1.0
14
14
  env:
15
15
  - BRANCH=master
16
16
  - BRANCH=2-99-maintenance
17
17
  matrix:
18
18
  allow_failures:
19
- - rvm: rbx-19mode
20
- - rvm: rbx-18mode
19
+ - rvm: jruby-18mode
20
+
@@ -1,5 +1,11 @@
1
+ ### 1.0.1 / 2014-04-13
2
+ [full changelog](http://github.com/rspec/rspec-its/compare/v1.0.0...v1.0.1)
3
+
4
+ Bug fixes:
5
+ * Maintain implicit subject in all cases (addresses problem with latest RSpec 3 version)
6
+
1
7
  ### 1.0.0 / 2014-02-07
2
- [full changelog](http://github.com/rspec/rspec-its/compare/v1.0.0.pre...master)
8
+ [full changelog](http://github.com/rspec/rspec-its/compare/v1.0.0.pre...v1.0.0)
3
9
 
4
10
  Breaking Changes:
5
11
 
data/Gemfile CHANGED
@@ -3,20 +3,18 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in rspec-its.gemspec
4
4
  gemspec
5
5
 
6
- %w[rspec rspec-core rspec-expectations rspec-mocks].each do |lib|
6
+ %w[rspec rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|
7
+ branch = ENV.fetch('BRANCH','master')
8
+ next if branch == '2-99-maintenance' && lib == 'rspec-support'
7
9
  library_path = File.expand_path("../../#{lib}", __FILE__)
8
10
  if File.exist?(library_path)
9
11
  gem lib, :path => library_path
10
12
  else
11
13
  gem lib, :git => "git://github.com/rspec/#{lib}.git",
12
- :branch => ENV.fetch('BRANCH','master')
14
+ :branch => branch
13
15
  end
14
16
  end
15
17
 
16
- # only pull rspec-support from master
17
-
18
- gem "rspec-support", :git => "git://github.com/rspec/rspec-support.git"
19
-
20
18
  # test coverage
21
19
  # gem 'simplecov', :require => false
22
20
 
data/README.md CHANGED
@@ -18,7 +18,7 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- Use the `its` method to generate a nested example group with
21
+ Use the `its` method to generate a nested example group with
22
22
  a single example that specifies the expected value of an attribute of the
23
23
  subject using `should`, `should_not` or `is_expected`.
24
24
 
@@ -83,3 +83,16 @@ Feature: attribute of subject
83
83
  """
84
84
  When I run rspec
85
85
  Then the examples should all pass
86
+
87
+ Scenario: failures are correctly reported as coming from the `its` line
88
+ Given a file named "example_spec.rb" with:
89
+ """ruby
90
+ describe Array do
91
+ context "when first created" do
92
+ its(:size) { should_not eq(0) }
93
+ end
94
+ end
95
+ """
96
+ When I run rspec
97
+ Then the output should contain "Failure/Error: its(:size) { should_not eq(0) }"
98
+ And the output should not match /#[^\n]*rspec[\x2f]its/
@@ -79,7 +79,7 @@ module RSpec
79
79
  # its(:age) { should eq(25) }
80
80
  # end
81
81
  def its(attribute, &block)
82
- describe(attribute) do
82
+ describe(attribute.to_s) do
83
83
  if Array === attribute
84
84
  let(:__its_subject) { subject[*attribute] }
85
85
  else
@@ -103,7 +103,9 @@ module RSpec
103
103
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(__its_subject, matcher, message)
104
104
  end
105
105
 
106
- example(&block)
106
+ its_caller = caller.select {|file_line| file_line !~ %r(/lib/rspec/its) }
107
+ example(nil, :caller => its_caller, &block)
108
+
107
109
  end
108
110
  end
109
111
 
@@ -112,6 +114,7 @@ end
112
114
 
113
115
  RSpec.configure do |rspec|
114
116
  rspec.extend RSpec::Its
117
+ rspec.backtrace_exclusion_patterns << %r(/lib/rspec/its)
115
118
  end
116
119
 
117
120
  RSpec::SharedContext.send(:include, RSpec::Its)
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Its
3
- VERSION = "1.0.0"
3
+ VERSION = "1.0.1"
4
4
  end
5
5
  end
@@ -3,179 +3,188 @@ require 'spec_helper'
3
3
  module RSpec
4
4
  describe Its do
5
5
  describe "#its" do
6
- subject do
7
- Class.new do
8
- def initialize
9
- @call_count = 0
10
- end
11
-
12
- def call_count
13
- @call_count += 1
14
- end
15
- end.new
16
- end
17
-
18
- context "with a call counter" do
19
- its(:call_count) { should eq(1) }
6
+ context "with implicit subject" do
7
+ context "preserves described_class" do
8
+ its(:symbol) { expect(described_class).to be Its}
9
+ its([]) { expect(described_class).to be Its }
10
+ end
20
11
  end
21
-
22
- context "with nil value" do
12
+ context "with explicit subject" do
23
13
  subject do
24
14
  Class.new do
25
- def nil_value
26
- nil
15
+ def initialize
16
+ @call_count = 0
27
17
  end
28
- end.new
29
- end
30
- its(:nil_value) { should be_nil }
31
- end
32
18
 
33
- context "with nested attributes" do
34
- subject do
35
- Class.new do
36
- def name
37
- "John"
19
+ def call_count
20
+ @call_count += 1
38
21
  end
39
22
  end.new
40
23
  end
41
- its("name") { should eq("John") }
42
- its("name.size") { should eq(4) }
43
- its("name.size.class") { should eq(Fixnum) }
44
24
 
45
- context "using should_not" do
46
- its("name") { should_not eq("Paul") }
25
+ context "with a call counter" do
26
+ its(:call_count) { should eq(1) }
47
27
  end
48
28
 
49
- context "using is_expected" do
50
- its("name") { is_expected.to eq("John") }
29
+ context "with nil value" do
30
+ subject do
31
+ Class.new do
32
+ def nil_value
33
+ nil
34
+ end
35
+ end.new
36
+ end
37
+ its(:nil_value) { should be_nil }
51
38
  end
52
39
 
53
- end
40
+ context "with nested attributes" do
41
+ subject do
42
+ Class.new do
43
+ def name
44
+ "John"
45
+ end
46
+ end.new
47
+ end
48
+ its("name") { should eq("John") }
49
+ its("name.size") { should eq(4) }
50
+ its("name.size.class") { should eq(Fixnum) }
54
51
 
55
- context "when it responds to #[]" do
56
- subject do
57
- Class.new do
58
- def [](*objects)
59
- objects.map do |object|
60
- "#{object.class}: #{object.to_s}"
61
- end.join("; ")
62
- end
52
+ context "using should_not" do
53
+ its("name") { should_not eq("Paul") }
54
+ end
55
+
56
+ context "using is_expected" do
57
+ its("name") { is_expected.to eq("John") }
58
+ end
63
59
 
64
- def name
65
- "George"
66
- end
67
- end.new
68
60
  end
69
- its([:a]) { should eq("Symbol: a") }
70
- its(['a']) { should eq("String: a") }
71
- its([:b, 'c', 4]) { should eq("Symbol: b; String: c; Fixnum: 4") }
72
- its(:name) { should eq("George") }
73
- context "when referring to an attribute that doesn't exist" do
74
- context "it raises an error" do
75
- its(:age) do
76
- expect do
77
- should eq(64)
78
- end.to raise_error(NoMethodError)
61
+
62
+ context "when it responds to #[]" do
63
+ subject do
64
+ Class.new do
65
+ def [](*objects)
66
+ objects.map do |object|
67
+ "#{object.class}: #{object.to_s}"
68
+ end.join("; ")
69
+ end
70
+
71
+ def name
72
+ "George"
73
+ end
74
+ end.new
75
+ end
76
+ its([:a]) { should eq("Symbol: a") }
77
+ its(['a']) { should eq("String: a") }
78
+ its([:b, 'c', 4]) { should eq("Symbol: b; String: c; Fixnum: 4") }
79
+ its(:name) { should eq("George") }
80
+ context "when referring to an attribute that doesn't exist" do
81
+ context "it raises an error" do
82
+ its(:age) do
83
+ expect do
84
+ should eq(64)
85
+ end.to raise_error(NoMethodError)
86
+ end
79
87
  end
80
88
  end
81
89
  end
82
- end
83
90
 
84
- context "when it does not respond to #[]" do
85
- subject { Object.new }
91
+ context "when it does not respond to #[]" do
92
+ subject { Object.new }
86
93
 
87
- context "it raises an error" do
88
- its([:a]) do
89
- expect do
90
- should eq("Symbol: a")
91
- end.to raise_error(NoMethodError)
94
+ context "it raises an error" do
95
+ its([:a]) do
96
+ expect do
97
+ should eq("Symbol: a")
98
+ end.to raise_error(NoMethodError)
99
+ end
92
100
  end
93
101
  end
94
- end
95
102
 
96
- context "calling and overriding super" do
97
- it "calls to the subject defined in the parent group" do
98
- group = RSpec::Core::ExampleGroup.describe(Array) do
99
- subject { [1, 'a'] }
103
+ context "calling and overriding super" do
104
+ it "calls to the subject defined in the parent group" do
105
+ group = RSpec::Core::ExampleGroup.describe(Array) do
106
+ subject { [1, 'a'] }
100
107
 
101
- its(:last) { should eq("a") }
108
+ its(:last) { should eq("a") }
102
109
 
103
- describe '.first' do
104
- def subject; super().first; end
110
+ describe '.first' do
111
+ def subject; super().first; end
105
112
 
106
- its(:next) { should eq(2) }
113
+ its(:next) { should eq(2) }
114
+ end
107
115
  end
116
+
117
+ expect(group.run(NullFormatter.new)).to be_truthy
108
118
  end
119
+ end
109
120
 
110
- expect(group.run(NullFormatter.new)).to be_truthy
121
+ context "with nil subject" do
122
+ subject do
123
+ Class.new do
124
+ def initialize
125
+ @counter = -1
126
+ end
127
+ def nil_if_first_time
128
+ @counter += 1
129
+ @counter == 0 ? nil : true
130
+ end
131
+ end.new
132
+ end
133
+ its(:nil_if_first_time) { should be(nil) }
111
134
  end
112
- end
113
135
 
114
- context "with nil subject" do
115
- subject do
116
- Class.new do
117
- def initialize
118
- @counter = -1
119
- end
120
- def nil_if_first_time
121
- @counter += 1
122
- @counter == 0 ? nil : true
123
- end
124
- end.new
136
+ context "with false subject" do
137
+ subject do
138
+ Class.new do
139
+ def initialize
140
+ @counter = -1
141
+ end
142
+ def false_if_first_time
143
+ @counter += 1
144
+ @counter > 0
145
+ end
146
+ end.new
147
+ end
148
+ its(:false_if_first_time) { should be(false) }
125
149
  end
126
- its(:nil_if_first_time) { should be(nil) }
127
- end
128
150
 
129
- context "with false subject" do
130
- subject do
131
- Class.new do
132
- def initialize
133
- @counter = -1
134
- end
135
- def false_if_first_time
136
- @counter += 1
137
- @counter > 0
138
- end
139
- end.new
151
+ describe 'accessing `subject` in `before` and `let`' do
152
+ subject { 'my subject' }
153
+ before { @subject_in_before = subject }
154
+ let(:subject_in_let) { subject }
155
+ let!(:eager_loaded_subject_in_let) { subject }
156
+
157
+ # These examples read weird, because we're actually
158
+ # specifying the behaviour of `its` itself
159
+ its(nil) { expect(subject).to eq('my subject') }
160
+ its(nil) { expect(@subject_in_before).to eq('my subject') }
161
+ its(nil) { expect(subject_in_let).to eq('my subject') }
162
+ its(nil) { expect(eager_loaded_subject_in_let).to eq('my subject') }
140
163
  end
141
- its(:false_if_first_time) { should be(false) }
142
- end
143
164
 
144
- describe 'accessing `subject` in `before` and `let`' do
145
- subject { 'my subject' }
146
- before { @subject_in_before = subject }
147
- let(:subject_in_let) { subject }
148
- let!(:eager_loaded_subject_in_let) { subject }
149
-
150
- # These examples read weird, because we're actually
151
- # specifying the behaviour of `its` itself
152
- its(nil) { expect(subject).to eq('my subject') }
153
- its(nil) { expect(@subject_in_before).to eq('my subject') }
154
- its(nil) { expect(subject_in_let).to eq('my subject') }
155
- its(nil) { expect(eager_loaded_subject_in_let).to eq('my subject') }
156
- end
165
+ describe "in shared_context" do
166
+ shared_context "shared stuff" do
167
+ subject {Array}
168
+ its(:name) {should eq "Array"}
169
+ end
157
170
 
158
- describe "in shared_context" do
159
- shared_context "shared stuff" do
160
- subject {Array}
161
- its(:name) {should eq "Array"}
171
+ include_context "shared stuff"
162
172
  end
163
173
 
164
- include_context "shared stuff"
165
- end
174
+ describe "when extending SharedContext" do
175
+ it 'works with an implicit subject' do
176
+ shared = Module.new do
177
+ extend RSpec::SharedContext
178
+ its(:size) { should eq 0 }
179
+ end
180
+ group = RSpec::Core::ExampleGroup.describe(Array) do
181
+ include shared
182
+ end
166
183
 
167
- describe "when extending SharedContext" do
168
- it 'works with an implicit subject' do
169
- shared = Module.new do
170
- extend RSpec::SharedContext
171
- its(:size) { should eq 0 }
172
- end
173
- group = RSpec::Core::ExampleGroup.describe(Array) do
174
- include shared
184
+ group.run(NullFormatter.new)
185
+ # Using to_h[:status].to_sym in following instead of .status due to need to run in RSpec 2.99
186
+ expect(group.children.first.examples.first.execution_result.to_h[:status].to_sym).to eq(:passed)
175
187
  end
176
-
177
- group.run(NullFormatter.new)
178
- expect(group.children.first.examples.first.execution_result).to include(:status => "passed")
179
188
  end
180
189
  end
181
190
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-its
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Alfvin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-07 00:00:00.000000000 Z
11
+ date: 2014-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core