rubocop-rspec 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/Gemfile +0 -2
  4. data/README.md +0 -8
  5. data/Rakefile +1 -3
  6. data/lib/rubocop-rspec.rb +2 -2
  7. data/lib/rubocop/cop/rspec/any_instance.rb +1 -10
  8. data/lib/rubocop/cop/rspec/describe_class.rb +23 -15
  9. data/lib/rubocop/cop/rspec/describe_method.rb +4 -6
  10. data/lib/rubocop/cop/rspec/described_class.rb +5 -8
  11. data/lib/rubocop/cop/rspec/example_length.rb +4 -9
  12. data/lib/rubocop/cop/rspec/example_wording.rb +13 -37
  13. data/lib/rubocop/cop/rspec/file_path.rb +10 -13
  14. data/lib/rubocop/cop/rspec/focus.rb +48 -30
  15. data/lib/rubocop/cop/rspec/instance_variable.rb +0 -1
  16. data/lib/rubocop/cop/rspec/multiple_describes.rb +2 -3
  17. data/lib/rubocop/cop/rspec/not_to_not.rb +3 -5
  18. data/lib/rubocop/cop/rspec/verified_doubles.rb +7 -15
  19. data/lib/rubocop/rspec/inject.rb +0 -1
  20. data/lib/rubocop/rspec/top_level_describe.rb +0 -2
  21. data/lib/rubocop/rspec/util.rb +19 -0
  22. data/lib/rubocop/rspec/version.rb +1 -2
  23. data/lib/rubocop/rspec/wording.rb +47 -0
  24. data/rubocop-rspec.gemspec +2 -2
  25. data/spec/project_spec.rb +0 -2
  26. data/spec/rubocop/cop/rspec/any_instance_spec.rb +0 -2
  27. data/spec/rubocop/cop/rspec/describe_class_spec.rb +36 -2
  28. data/spec/rubocop/cop/rspec/describe_method_spec.rb +10 -3
  29. data/spec/rubocop/cop/rspec/described_class_spec.rb +32 -2
  30. data/spec/rubocop/cop/rspec/example_length_spec.rb +17 -3
  31. data/spec/rubocop/cop/rspec/example_wording_spec.rb +61 -62
  32. data/spec/rubocop/cop/rspec/file_path_spec.rb +61 -21
  33. data/spec/rubocop/cop/rspec/focus_spec.rb +11 -3
  34. data/spec/rubocop/cop/rspec/instance_variable_spec.rb +13 -2
  35. data/spec/rubocop/cop/rspec/multiple_describes_spec.rb +0 -2
  36. data/spec/rubocop/cop/rspec/not_to_not_spec.rb +0 -2
  37. data/spec/rubocop/cop/rspec/verified_doubles_spec.rb +41 -19
  38. data/spec/rubocop/rspec/util/one_spec.rb +21 -0
  39. data/spec/rubocop/rspec/wording_spec.rb +44 -0
  40. data/spec/spec_helper.rb +1 -9
  41. metadata +11 -5
@@ -1,8 +1,5 @@
1
- # encoding: utf-8
2
-
3
1
  describe RuboCop::Cop::RSpec::FilePath, :config do
4
2
  subject(:cop) { described_class.new(config) }
5
- let(:cop_config) { { 'CustomTransform' => { 'FooFoo' => 'foofoo' } } }
6
3
 
7
4
  it 'checks the path' do
8
5
  inspect_source(
@@ -28,6 +25,36 @@ describe RuboCop::Cop::RSpec::FilePath, :config do
28
25
  .to eq(['Spec path should end with `my_class*foo*_spec.rb`'])
29
26
  end
30
27
 
28
+ it 'flags foo_spec.rb.rb' do
29
+ inspect_source(
30
+ cop,
31
+ "describe MyClass, '#foo' do; end",
32
+ 'my_class/foo_spec.rb.rb'
33
+ )
34
+ expect(cop.offenses.size).to eq(1)
35
+ end
36
+
37
+ it 'flags foo_specorb' do
38
+ inspect_source(
39
+ cop,
40
+ "describe MyClass, '#foo' do; end",
41
+ 'my_class/foo_specorb'
42
+ )
43
+ expect(cop.offenses.size).to eq(1)
44
+ end
45
+
46
+ it 'checks path even when metadata is included' do
47
+ inspect_source(
48
+ cop,
49
+ "describe MyClass, '#foo', blah: :blah do; end",
50
+ 'wrong_class_foo_spec.rb'
51
+ )
52
+ expect(cop.offenses.size).to eq(1)
53
+ expect(cop.offenses.map(&:line).sort).to eq([1])
54
+ expect(cop.messages)
55
+ .to eq(['Spec path should end with `my_class*foo*_spec.rb`'])
56
+ end
57
+
31
58
  it 'checks class spec paths' do
32
59
  inspect_source(
33
60
  cop,
@@ -112,8 +139,8 @@ describe RuboCop::Cop::RSpec::FilePath, :config do
112
139
  it 'handles alphanumeric class names' do
113
140
  inspect_source(
114
141
  cop,
115
- 'describe IPV6 do; end',
116
- 'ipv6_spec.rb'
142
+ 'describe IPv4AndIPv6 do; end',
143
+ 'i_pv4_and_i_pv6_spec.rb'
117
144
  )
118
145
  expect(cop.offenses).to be_empty
119
146
  end
@@ -181,39 +208,52 @@ describe RuboCop::Cop::RSpec::FilePath, :config do
181
208
  expect(cop.offenses).to be_empty
182
209
  end
183
210
 
184
- it 'allows flexibility with predicates' do
211
+ it 'allows bang method' do
185
212
  inspect_source(
186
213
  cop,
187
- "describe Some::Class, '#thing?' do; end",
188
- 'some/class/thing_predicate_spec.rb'
214
+ "describe Some::Class, '#bang!' do; end",
215
+ 'some/class/bang_spec.rb'
189
216
  )
190
217
  expect(cop.offenses).to be_empty
191
218
  end
192
219
 
193
- it 'allows flexibility with operators' do
220
+ it 'allows flexibility with predicates' do
194
221
  inspect_source(
195
222
  cop,
196
- "describe MyClass, '#<=>' do; end",
197
- 'my_class/spaceship_operator_spec.rb'
223
+ "describe Some::Class, '#thing?' do; end",
224
+ 'some/class/thing_predicate_spec.rb'
198
225
  )
199
226
  expect(cop.offenses).to be_empty
200
227
  end
201
228
 
202
- it 'respects custom module name transformation' do
229
+ it 'allows flexibility with operators' do
203
230
  inspect_source(
204
231
  cop,
205
- "describe FooFoo::Some::Class, '#bar' do; end",
206
- 'foofoo/some/class/bar_spec.rb'
232
+ "describe MyLittleClass, '#<=>' do; end",
233
+ 'my_little_class/spaceship_operator_spec.rb'
207
234
  )
208
235
  expect(cop.offenses).to be_empty
209
236
  end
210
237
 
211
- it 'ignores routing specs' do
212
- inspect_source(
213
- cop,
214
- 'describe MyController, type: :routing do; end',
215
- 'foofoo/some/class/bar_spec.rb'
216
- )
217
- expect(cop.offenses).to be_empty
238
+ context 'when configured' do
239
+ let(:cop_config) { { 'CustomTransform' => { 'FooFoo' => 'foofoo' } } }
240
+
241
+ it 'respects custom module name transformation' do
242
+ inspect_source(
243
+ cop,
244
+ "describe FooFoo::Some::Class, '#bar' do; end",
245
+ 'foofoo/some/class/bar_spec.rb'
246
+ )
247
+ expect(cop.offenses).to be_empty
248
+ end
249
+
250
+ it 'ignores routing specs' do
251
+ inspect_source(
252
+ cop,
253
+ 'describe MyController, "#foo", type: :routing do; end',
254
+ 'foofoo/some/class/bar_spec.rb'
255
+ )
256
+ expect(cop.offenses).to be_empty
257
+ end
218
258
  end
219
259
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  describe RuboCop::Cop::RSpec::Focus do
4
2
  subject(:cop) { described_class.new }
5
3
 
@@ -12,7 +10,7 @@ describe RuboCop::Cop::RSpec::Focus do
12
10
  inspect_source(
13
11
  cop,
14
12
  [
15
- "#{block_type} 'test', focus: true do",
13
+ "#{block_type} 'test', meta: true, focus: true do",
16
14
  'end'
17
15
  ]
18
16
  )
@@ -48,6 +46,16 @@ describe RuboCop::Cop::RSpec::Focus do
48
46
  end
49
47
  end
50
48
 
49
+ it 'does not flag a method that is focused twice' do
50
+ inspect_source(cop, 'fit "foo", :focus do; end')
51
+ expect(cop.offenses.size).to be(1)
52
+ end
53
+
54
+ it 'ignores non-rspec code with :focus blocks' do
55
+ inspect_source(cop, 'some_method "foo", focus: true do; end')
56
+ expect(cop.offenses).to be_empty
57
+ end
58
+
51
59
  [
52
60
  :fdescribe, :fcontext,
53
61
  :focus, :fexample, :fit, :fspecify,
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  describe RuboCop::Cop::RSpec::InstanceVariable do
4
2
  subject(:cop) { described_class.new }
5
3
 
@@ -18,6 +16,19 @@ describe RuboCop::Cop::RSpec::InstanceVariable do
18
16
  expect(cop.messages).to eq(['Use `let` instead of an instance variable'])
19
17
  end
20
18
 
19
+ it 'ignores non-spec blocks' do
20
+ inspect_source(
21
+ cop,
22
+ [
23
+ 'not_rspec do',
24
+ ' before { @foo = [] }',
25
+ ' it { expect(@foo).to be_empty }',
26
+ 'end'
27
+ ]
28
+ )
29
+ expect(cop.offenses).to be_empty
30
+ end
31
+
21
32
  it 'finds an instance variable inside a shared example' do
22
33
  inspect_source(
23
34
  cop,
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  describe RuboCop::Cop::RSpec::MultipleDescribes do
4
2
  subject(:cop) { described_class.new }
5
3
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  describe RuboCop::Cop::RSpec::NotToNot, :config do
4
2
  subject(:cop) { described_class.new(config) }
5
3
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  describe RuboCop::Cop::RSpec::VerifiedDoubles, :config do
4
2
  subject(:cop) { described_class.new(config) }
5
3
 
@@ -11,26 +9,33 @@ describe RuboCop::Cop::RSpec::VerifiedDoubles, :config do
11
9
  .to eq(['Prefer using verifying doubles over normal doubles.'])
12
10
  expect(cop.highlights).to eq(['double("Widget")'])
13
11
  expect(cop.offenses.map(&:line).sort).to eq([2])
12
+ expect(cop.offenses.map(&:to_s).sort).to all(
13
+ eql('C: 2: 9: Prefer using verifying doubles over normal doubles.')
14
+ )
14
15
  end
15
16
 
16
- it 'finds a `spy` instead of an `instance_spy`' do
17
- inspect_source(cop, ['it do',
18
- ' foo = spy("Widget")',
19
- 'end'])
20
- expect(cop.messages)
21
- .to eq(['Prefer using verifying doubles over normal doubles.'])
22
- expect(cop.highlights).to eq(['spy("Widget")'])
23
- expect(cop.offenses.map(&:line).sort).to eq([2])
24
- end
17
+ context 'when configuration does not specify IgnoreSymbolicNames' do
18
+ let(:cop_config) { Hash.new }
25
19
 
26
- it 'find doubles whose name is a symbol' do
27
- inspect_source(cop, ['it do',
28
- ' foo = double(:widget)',
29
- 'end'])
30
- expect(cop.messages)
31
- .to eq(['Prefer using verifying doubles over normal doubles.'])
32
- expect(cop.highlights).to eq(['double(:widget)'])
33
- expect(cop.offenses.map(&:line).sort).to eq([2])
20
+ it 'find doubles whose name is a symbol' do
21
+ inspect_source(cop, ['it do',
22
+ ' foo = double(:widget)',
23
+ 'end'])
24
+ expect(cop.messages)
25
+ .to eq(['Prefer using verifying doubles over normal doubles.'])
26
+ expect(cop.highlights).to eq(['double(:widget)'])
27
+ expect(cop.offenses.map(&:line).sort).to eq([2])
28
+ end
29
+
30
+ it 'finds a `spy` instead of an `instance_spy`' do
31
+ inspect_source(cop, ['it do',
32
+ ' foo = spy("Widget")',
33
+ 'end'])
34
+ expect(cop.messages)
35
+ .to eq(['Prefer using verifying doubles over normal doubles.'])
36
+ expect(cop.highlights).to eq(['spy("Widget")'])
37
+ expect(cop.offenses.map(&:line).sort).to eq([2])
38
+ end
34
39
  end
35
40
 
36
41
  context 'when configured to ignore symbolic names' do
@@ -42,6 +47,16 @@ describe RuboCop::Cop::RSpec::VerifiedDoubles, :config do
42
47
  'end'])
43
48
  expect(cop.messages).to be_empty
44
49
  end
50
+
51
+ it 'still flags doubles whose name is a string' do
52
+ inspect_source(cop, ['it do',
53
+ ' foo = double("widget")',
54
+ 'end'])
55
+
56
+ expect(cop.messages.first).to eq(
57
+ 'Prefer using verifying doubles over normal doubles.'
58
+ )
59
+ end
45
60
  end
46
61
 
47
62
  it 'ignores doubles without a name' do
@@ -50,4 +65,11 @@ describe RuboCop::Cop::RSpec::VerifiedDoubles, :config do
50
65
  'end'])
51
66
  expect(cop.messages).to be_empty
52
67
  end
68
+
69
+ it 'ignores instance_doubles' do
70
+ inspect_source(cop, ['it do',
71
+ ' foo = instance_double("Foo")',
72
+ 'end'])
73
+ expect(cop.messages).to be_empty
74
+ end
53
75
  end
@@ -0,0 +1,21 @@
1
+ describe RuboCop::RSpec::Util, '.one' do
2
+ let(:first) { instance_double(Object) }
3
+ let(:array) { instance_double(Array, one?: true, first: first) }
4
+ let(:client) { Class.new.extend(described_class) }
5
+
6
+ it 'returns first element' do
7
+ expect(client.one(array)).to be(first)
8
+ end
9
+
10
+ it 'fails if the list is empty' do
11
+ expect { client.one([]) }
12
+ .to raise_error(described_class::SizeError)
13
+ .with_message('expected size to be exactly 1 but size was 0')
14
+ end
15
+
16
+ it 'fails if the list has more than one element' do
17
+ expect { client.one([1, 2]) }
18
+ .to raise_error(described_class::SizeError)
19
+ .with_message('expected size to be exactly 1 but size was 2')
20
+ end
21
+ end
@@ -0,0 +1,44 @@
1
+ describe RuboCop::RSpec::Wording do
2
+ let(:replacements) do
3
+ { 'have' => 'has', 'not' => 'does not' }
4
+ end
5
+
6
+ let(:ignores) do
7
+ %w(only really)
8
+ end
9
+
10
+ expected_rewrites =
11
+ {
12
+ 'should return something' => 'returns something',
13
+ 'should not return something' => 'does not return something',
14
+ 'should do nothing' => 'does nothing',
15
+ 'should have sweets' => 'has sweets',
16
+ 'should worry about the future' => 'worries about the future',
17
+ 'should pay for pizza' => 'pays for pizza',
18
+ 'should obey my orders' => 'obeys my orders',
19
+ 'should deploy the app' => 'deploys the app',
20
+ 'should buy the product' => 'buys the product',
21
+ 'should miss me' => 'misses me',
22
+ 'should fax the document' => 'faxes the document',
23
+ 'should amass debt' => 'amasses debt',
24
+ 'should echo the input' => 'echoes the input',
25
+ 'should alias the method' => 'aliases the method',
26
+ 'should search the internet' => 'searches the internet',
27
+ 'should wish me luck' => 'wishes me luck',
28
+ 'should really only return one item' => 'really only returns one item',
29
+ "shouldn't return something" => 'does not return something'
30
+ }
31
+
32
+ expected_rewrites.each do |old, new|
33
+ it %(rewrites "#{old}" as "#{new}") do
34
+ rewrite =
35
+ described_class.new(
36
+ old,
37
+ replace: replacements,
38
+ ignore: ignores
39
+ ).rewrite
40
+
41
+ expect(rewrite).to eql(new)
42
+ end
43
+ end
44
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,6 @@
1
- # encoding: utf-8
2
-
3
1
  require 'rubocop'
4
2
 
5
- rubocop_path = File.join(File.dirname(__FILE__), '../vendor/rubocop')
6
-
7
- unless File.directory?(rubocop_path)
8
- raise "Can't run specs without a local RuboCop checkout. Look in the README."
9
- end
10
-
11
- Dir["#{rubocop_path}/spec/support/**/*.rb"].each { |f| require f }
3
+ require 'rubocop/rspec/support'
12
4
 
13
5
  if ENV['CI']
14
6
  require 'codeclimate-test-reporter'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian MacLeod
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-07-20 00:00:00.000000000 Z
12
+ date: 2016-08-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubocop
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 0.41.2
20
+ version: 0.42.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 0.41.2
27
+ version: 0.42.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -100,7 +100,9 @@ files:
100
100
  - lib/rubocop/cop/rspec/verified_doubles.rb
101
101
  - lib/rubocop/rspec/inject.rb
102
102
  - lib/rubocop/rspec/top_level_describe.rb
103
+ - lib/rubocop/rspec/util.rb
103
104
  - lib/rubocop/rspec/version.rb
105
+ - lib/rubocop/rspec/wording.rb
104
106
  - rubocop-rspec.gemspec
105
107
  - spec/project_spec.rb
106
108
  - spec/rubocop/cop/rspec/any_instance_spec.rb
@@ -115,6 +117,8 @@ files:
115
117
  - spec/rubocop/cop/rspec/multiple_describes_spec.rb
116
118
  - spec/rubocop/cop/rspec/not_to_not_spec.rb
117
119
  - spec/rubocop/cop/rspec/verified_doubles_spec.rb
120
+ - spec/rubocop/rspec/util/one_spec.rb
121
+ - spec/rubocop/rspec/wording_spec.rb
118
122
  - spec/spec_helper.rb
119
123
  homepage: http://github.com/nevir/rubocop-rspec
120
124
  licenses:
@@ -128,7 +132,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
132
  requirements:
129
133
  - - ">="
130
134
  - !ruby/object:Gem::Version
131
- version: 2.0.0
135
+ version: 2.2.0
132
136
  required_rubygems_version: !ruby/object:Gem::Requirement
133
137
  requirements:
134
138
  - - ">="
@@ -154,4 +158,6 @@ test_files:
154
158
  - spec/rubocop/cop/rspec/multiple_describes_spec.rb
155
159
  - spec/rubocop/cop/rspec/not_to_not_spec.rb
156
160
  - spec/rubocop/cop/rspec/verified_doubles_spec.rb
161
+ - spec/rubocop/rspec/util/one_spec.rb
162
+ - spec/rubocop/rspec/wording_spec.rb
157
163
  - spec/spec_helper.rb