rubocop-rspec 1.7.0 → 1.8.0

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: cc482ce2af79693a4824889cb1f4e418936466f9
4
- data.tar.gz: f0f1ff329a1a1cf4642f38c64258370ae4b269f6
3
+ metadata.gz: 6bfc346a6e12eab244a17f9fc8401bfb1c4c8d86
4
+ data.tar.gz: f0b9285af75fab2774940505d868ef097936d8ec
5
5
  SHA512:
6
- metadata.gz: 871f9e04aaa056cbe3d0b3b73ef22b0ebcf6b1d2c242d94dc823e73a5b93a87683ffc24844a81bfe82849a85baf66d27800a07c7e069b62329da563c3467ef46
7
- data.tar.gz: 866bf67d2e134be5e153ad066f7c6c04eec42647e2aad769745a4a4708005a93a437cf0427389170a57c00463bd02a66a05995e5d1f5362cfb38d0d7c025c8c6
6
+ metadata.gz: ed95fbfc52c82a0f4c7674a675e805ca1649c8088734fc19c31d73c70eb2c15cee292d36579184ff2f61beb13492543d9cac5b19abb3190de23ebbfc168dd0a1
7
+ data.tar.gz: b225fca79ccc76547a283c140b2e5add1430c13dcb5bd3db74a0b68d7fa7a4546be8aa5d1ad9e67387969f9c72bd3ce8702e6255d7a048e542a9ff975ddfa596
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Master (unreleased)
4
4
 
5
+ ## 1.8.0 (2016-10-27)
6
+
7
+ * Optionally ignore method names in the `describe` argument when running the `FilePath` cop. ([@bquorning][])
8
+ * Fix regression in how `FilePath` converts alphanumeric class names into paths. ([@bquorning][])
9
+ * Add `ImplicitExpect` cop for enforcing `should` vs. `is_expected.to`. ([@backus][])
10
+ * Disable `MessageExpectation` cop in the default configuration. ([@bquorning][])
11
+
5
12
  ## 1.7.0 (2016-08-24)
6
13
 
7
14
  * Add support for checking all example groups with `ExampleLength`. ([@backus][])
data/README.md CHANGED
@@ -1,10 +1,11 @@
1
1
  # RuboCop RSpec
2
2
 
3
+ [![Join the chat at https://gitter.im/rubocop-rspec/Lobby](https://badges.gitter.im/rubocop-rspec/Lobby.svg)](https://gitter.im/rubocop-rspec/Lobby)
3
4
  [![Gem Version](https://badge.fury.io/rb/rubocop-rspec.svg)](https://rubygems.org/gems/rubocop-rspec)
4
- [![Dependency Status](https://gemnasium.com/nevir/rubocop-rspec.svg)](https://gemnasium.com/nevir/rubocop-rspec)
5
- [![Build Status](https://secure.travis-ci.org/nevir/rubocop-rspec.svg?branch=master)](http://travis-ci.org/nevir/rubocop-rspec)
6
- [![Coverage Status](https://codeclimate.com/github/nevir/rubocop-rspec/badges/coverage.svg)](https://codeclimate.com/github/nevir/rubocop-rspec/coverage)
7
- [![Code Climate](https://codeclimate.com/github/nevir/rubocop-rspec.svg)](https://codeclimate.com/github/nevir/rubocop-rspec)
5
+ [![Dependency Status](https://gemnasium.com/backus/rubocop-rspec.svg)](https://gemnasium.com/backus/rubocop-rspec)
6
+ [![Build Status](https://secure.travis-ci.org/backus/rubocop-rspec.svg?branch=master)](http://travis-ci.org/backus/rubocop-rspec)
7
+ [![Coverage Status](https://codeclimate.com/github/backus/rubocop-rspec/badges/coverage.svg)](https://codeclimate.com/github/backus/rubocop-rspec/coverage)
8
+ [![Code Climate](https://codeclimate.com/github/backus/rubocop-rspec/badges/gpa.svg)](https://codeclimate.com/github/backus/rubocop-rspec)
8
9
 
9
10
  RSpec-specific analysis for your projects, as an extension to
10
11
  [RuboCop](https://github.com/bbatsov/rubocop).
data/Rakefile CHANGED
@@ -24,10 +24,7 @@ end
24
24
 
25
25
  desc 'Run RuboCop over this gem'
26
26
  task :internal_investigation do
27
- require 'rubocop-rspec'
28
-
29
- result = RuboCop::CLI.new.run
30
- abort('RuboCop failed!') unless result.zero?
27
+ sh('bundle exec rubocop --require rubocop-rspec')
31
28
  end
32
29
 
33
30
  desc 'Build config/default.yml'
data/config/default.yml CHANGED
@@ -13,15 +13,6 @@ RSpec/BeEql:
13
13
  Description: Check for expectations where `be(...)` can replace `eql(...)`.
14
14
  Enabled: true
15
15
 
16
- RSpec/HookArgument:
17
- Description: Checks the arguments passed to `before`, `around`, and `after`.
18
- Enabled: true
19
- EnforcedStyle: implicit
20
- SupportedStyles:
21
- - implicit
22
- - each
23
- - example
24
-
25
16
  RSpec/DescribeClass:
26
17
  Description: Check that the first argument to the top level describe is a constant.
27
18
  Enabled: true
@@ -35,6 +26,16 @@ RSpec/DescribeMethod:
35
26
  Description: Checks that the second argument to `describe` specifies a method.
36
27
  Enabled: true
37
28
 
29
+ RSpec/EmptyExampleGroup:
30
+ Description: Checks if an example group does not include any tests.
31
+ Enabled: true
32
+ CustomIncludeMethods: []
33
+
34
+ RSpec/ExampleLength:
35
+ Description: Checks for long examples.
36
+ Enabled: true
37
+ Max: 5
38
+
38
39
  RSpec/ExampleWording:
39
40
  Description: Checks that example descriptions do not start with "should".
40
41
  Enabled: true
@@ -44,87 +45,95 @@ RSpec/ExampleWording:
44
45
  not: does not
45
46
  IgnoredWords: []
46
47
 
47
- RSpec/EmptyExampleGroup:
48
- Description: Checks if an example group does not include any tests.
49
- Enabled: true
50
- CustomIncludeMethods: []
51
-
52
48
  RSpec/ExpectActual:
53
49
  Description: Checks for `expect(...)` calls containing literal values.
54
50
  Enabled: true
55
51
 
56
- RSpec/MessageChain:
57
- Description: Check that chains of messages are not being stubbed.
52
+ RSpec/FilePath:
53
+ Description: Checks that spec file paths are consistent with the test subject.
58
54
  Enabled: true
55
+ CustomTransform:
56
+ RuboCop: rubocop
57
+ RSpec: rspec
58
+ IgnoreMethods: false
59
59
 
60
- RSpec/MultipleDescribes:
61
- Description: Checks for multiple top level describes.
60
+ RSpec/Focus:
61
+ Description: Checks if examples are focused.
62
62
  Enabled: true
63
63
 
64
- RSpec/MultipleExpectations:
65
- Description: Checks if examples contain too many `expect` calls.
64
+ RSpec/HookArgument:
65
+ Description: Checks the arguments passed to `before`, `around`, and `after`.
66
66
  Enabled: true
67
- Max: 1
67
+ EnforcedStyle: implicit
68
+ SupportedStyles:
69
+ - implicit
70
+ - each
71
+ - example
68
72
 
69
- RSpec/NestedGroups:
70
- Description: Checks for nested example groups.
73
+ RSpec/ImplicitExpect:
74
+ Description: Check that a consistent implicit expectation style is used.
71
75
  Enabled: true
72
- MaxNesting: 2
76
+ EnforcedStyle: is_expected
77
+ SupportedStyles:
78
+ - is_expected
79
+ - should
73
80
 
74
81
  RSpec/InstanceVariable:
75
82
  Description: Checks for instance variable usage in specs.
76
83
  AssignmentOnly: false
77
84
  Enabled: true
78
85
 
79
- RSpec/LetSetup:
80
- Description: Checks unreferenced `let!` calls being used for test setup.
81
- Enabled: true
82
-
83
86
  RSpec/LeadingSubject:
84
87
  Description: Checks for `subject` definitions that come after `let` definitions.
85
88
  Enabled: true
86
89
 
87
- RSpec/FilePath:
88
- Description: Checks that spec file paths are consistent with the test subject.
89
- Enabled: true
90
- CustomTransform:
91
- RuboCop: rubocop
92
- RSpec: rspec
93
-
94
- RSpec/VerifiedDoubles:
95
- Description: Prefer using verifying doubles over normal doubles.
96
- Enabled: true
97
- IgnoreSymbolicNames: false
98
-
99
- RSpec/NotToNot:
100
- Description: Checks for consistent method usage for negating expectations.
101
- EnforcedStyle: not_to
102
- SupportedStyles:
103
- - not_to
104
- - to_not
105
- Enabled: true
106
-
107
- RSpec/Focus:
108
- Description: Checks if examples are focused.
90
+ RSpec/LetSetup:
91
+ Description: Checks unreferenced `let!` calls being used for test setup.
109
92
  Enabled: true
110
93
 
111
- RSpec/ExampleLength:
112
- Description: Checks for long examples.
94
+ RSpec/MessageChain:
95
+ Description: Check that chains of messages are not being stubbed.
113
96
  Enabled: true
114
- Max: 5
115
97
 
116
98
  RSpec/MessageExpectation:
117
99
  Description: Checks for consistent message expectation style.
118
- Enabled: true
100
+ Enabled: false
119
101
  EnforcedStyle: allow
120
102
  SupportedStyles:
121
103
  - allow
122
104
  - expect
123
105
 
106
+ RSpec/MultipleDescribes:
107
+ Description: Checks for multiple top level describes.
108
+ Enabled: true
109
+
110
+ RSpec/MultipleExpectations:
111
+ Description: Checks if examples contain too many `expect` calls.
112
+ Enabled: true
113
+ Max: 1
114
+
124
115
  RSpec/NamedSubject:
125
116
  Description: Checks for explicitly referenced test subjects.
126
117
  Enabled: true
127
118
 
119
+ RSpec/NestedGroups:
120
+ Description: Checks for nested example groups.
121
+ Enabled: true
122
+ MaxNesting: 2
123
+
124
+ RSpec/NotToNot:
125
+ Description: Checks for consistent method usage for negating expectations.
126
+ EnforcedStyle: not_to
127
+ SupportedStyles:
128
+ - not_to
129
+ - to_not
130
+ Enabled: true
131
+
128
132
  RSpec/SubjectStub:
129
133
  Description: Checks for stubbed test subjects.
130
134
  Enabled: true
135
+
136
+ RSpec/VerifiedDoubles:
137
+ Description: Prefer using verifying doubles over normal doubles.
138
+ Enabled: true
139
+ IgnoreSymbolicNames: false
data/lib/rubocop-rspec.rb CHANGED
@@ -28,6 +28,7 @@ require 'rubocop/cop/rspec/expect_actual'
28
28
  require 'rubocop/cop/rspec/file_path'
29
29
  require 'rubocop/cop/rspec/focus'
30
30
  require 'rubocop/cop/rspec/hook_argument'
31
+ require 'rubocop/cop/rspec/implicit_expect'
31
32
  require 'rubocop/cop/rspec/instance_variable'
32
33
  require 'rubocop/cop/rspec/leading_subject'
33
34
  require 'rubocop/cop/rspec/let_setup'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  # Check for expectations where `be(...)` can replace `eql(...)`.
5
5
  #
6
6
  # The `be` matcher compares by identity while the `eql` matcher
7
- # compares using `eql?`. Integers, floats, booleans, and symbols
7
+ # compares using `eql?`. Integers, floats, booleans, symbols, and nil
8
8
  # can be compared by identity and therefore the `be` matcher is
9
9
  # preferable as it is a more strict test.
10
10
  #
@@ -16,6 +16,7 @@ module RuboCop
16
16
  # expect(foo).to eql(true)
17
17
  # expect(foo).to eql(false)
18
18
  # expect(foo).to eql(:bar)
19
+ # expect(foo).to eql(nil)
19
20
  #
20
21
  # # good
21
22
  # expect(foo).to be(1)
@@ -23,6 +24,7 @@ module RuboCop
23
24
  # expect(foo).to be(true)
24
25
  # expect(foo).to be(false)
25
26
  # expect(foo).to be(:bar)
27
+ # expect(foo).to be(nil)
26
28
  #
27
29
  # This cop only looks for instances of `expect(...).to eql(...)`. We
28
30
  # do not check `to_not` or `not_to` since `!eql?` is more strict
@@ -38,7 +40,7 @@ module RuboCop
38
40
  MSG = 'Prefer `be` over `eql`'.freeze
39
41
 
40
42
  def_node_matcher :eql_type_with_identity, <<-PATTERN
41
- (send _ :to $(send nil :eql {true false int float sym}))
43
+ (send _ :to $(send nil :eql {true false int float sym nil_type?}))
42
44
  PATTERN
43
45
 
44
46
  def on_send(node)
@@ -8,19 +8,43 @@ module RuboCop
8
8
  # Checks the path of the spec file and enforces that it reflects the
9
9
  # described class/module and its optionally called out method.
10
10
  #
11
+ # With the configuration option `IgnoreMethods` the called out method will
12
+ # be ignored when determining the enforced path.
13
+ #
11
14
  # With the configuration option `CustomTransform` modules or classes can
12
15
  # be specified that should not as usual be transformed from CamelCase to
13
16
  # snake_case (e.g. 'RuboCop' => 'rubocop' ).
14
17
  #
15
18
  # @example
16
- # my_class/method_spec.rb # describe MyClass, '#method'
19
+ # # bad
20
+ # whatever_spec.rb # describe MyClass
21
+ #
22
+ # # bad
23
+ # my_class_spec.rb # describe MyClass, '#method'
24
+ #
25
+ # # good
26
+ # my_class_spec.rb # describe MyClass
27
+ #
28
+ # # good
17
29
  # my_class_method_spec.rb # describe MyClass, '#method'
30
+ #
31
+ # # good
32
+ # my_class/method_spec.rb # describe MyClass, '#method'
33
+ #
34
+ # @example when configuration is `IgnoreMethods: true`
35
+ # # bad
36
+ # whatever_spec.rb # describe MyClass
37
+ #
38
+ # # good
18
39
  # my_class_spec.rb # describe MyClass
40
+ #
41
+ # # good
42
+ # my_class_spec.rb # describe MyClass, '#method'
43
+ #
19
44
  class FilePath < Cop
20
45
  include RuboCop::RSpec::SpecOnly, RuboCop::RSpec::TopLevelDescribe
21
46
 
22
47
  MESSAGE = 'Spec path should end with `%s`'.freeze
23
- METHOD_STRING_MATCHER = /^[\#\.].+/
24
48
  ROUTING_PAIR = s(:pair, s(:sym, :type), s(:sym, :routing))
25
49
 
26
50
  def on_top_level_describe(node, args)
@@ -46,7 +70,7 @@ module RuboCop
46
70
 
47
71
  def matcher(object, method)
48
72
  path = File.join(parts(object))
49
- if method && method.type.equal?(:str)
73
+ if method && method.type.equal?(:str) && !ignore_methods?
50
74
  path += '*' + method.str_content.gsub(/\W+/, '')
51
75
  end
52
76
 
@@ -65,8 +89,8 @@ module RuboCop
65
89
 
66
90
  def camel_to_underscore(string)
67
91
  string
68
- .gsub(/([^A-Z])([A-Z]+)/, '\\1_\\2')
69
- .gsub(/([A-Z])([A-Z\d][^A-Z\d]+)/, '\\1_\\2')
92
+ .gsub(/([^A-Z])([A-Z]+)/, '\1_\2')
93
+ .gsub(/([A-Z])([A-Z][^A-Z\d]+)/, '\1_\2')
70
94
  .downcase
71
95
  end
72
96
 
@@ -74,6 +98,10 @@ module RuboCop
74
98
  Regexp.new(glob.sub('.', '\\.').gsub('*', '.*') + '$')
75
99
  end
76
100
 
101
+ def ignore_methods?
102
+ cop_config['IgnoreMethods']
103
+ end
104
+
77
105
  def custom_transform
78
106
  cop_config['CustomTransform'] || {}
79
107
  end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Check that a consistent implicit expectation style is used.
7
+ #
8
+ # This cop can be configured using the `EnforcedStyle` option
9
+ # and supports the `--auto-gen-config` flag.
10
+ #
11
+ # @example `EnforcedStyle: is_expected`
12
+ #
13
+ # # bad
14
+ # it { should be_truthy }
15
+ #
16
+ # # good
17
+ # it { is_expected.to be_truthy }
18
+ #
19
+ # @example `EnforcedStyle: should`
20
+ #
21
+ # # bad
22
+ # it { is_expected.to be_truthy }
23
+ #
24
+ # # good
25
+ # it { should be_truthy }
26
+ #
27
+ class ImplicitExpect < Cop
28
+ include RuboCop::RSpec::SpecOnly, ConfigurableEnforcedStyle
29
+
30
+ MSG = 'Prefer `%<good>s` over `%<bad>s`.'.freeze
31
+
32
+ def_node_matcher :implicit_expect, <<-PATTERN
33
+ {
34
+ (send nil ${:should :should_not} ...)
35
+ (send (send nil $:is_expected) {:to :to_not :not_to} ...)
36
+ }
37
+ PATTERN
38
+
39
+ alternatives = {
40
+ 'is_expected.to' => 'should',
41
+ 'is_expected.not_to' => 'should_not',
42
+ 'is_expected.to_not' => 'should_not'
43
+ }
44
+
45
+ ENFORCED_REPLACEMENTS = alternatives.merge(alternatives.invert).freeze
46
+
47
+ def on_send(node)
48
+ return unless (source_range = offending_expect(node))
49
+
50
+ expectation_source = source_range.source
51
+
52
+ if expectation_source.start_with?(style.to_s)
53
+ correct_style_detected
54
+ else
55
+ opposite_style_detected
56
+
57
+ add_offense(node, source_range, offense_message(expectation_source))
58
+ end
59
+ end
60
+
61
+ def autocorrect(node)
62
+ lambda do |corrector|
63
+ offense = offending_expect(node)
64
+ replacement = replacement_source(offense.source)
65
+
66
+ corrector.replace(offense, replacement)
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def offending_expect(node)
73
+ case implicit_expect(node)
74
+ when :is_expected
75
+ is_expected_range(node.loc)
76
+ when :should, :should_not
77
+ node.loc.selector
78
+ end
79
+ end
80
+
81
+ def is_expected_range(source_map) # rubocop:disable PredicateName
82
+ Parser::Source::Range.new(
83
+ source_map.expression.source_buffer,
84
+ source_map.expression.begin_pos,
85
+ source_map.selector.end_pos
86
+ )
87
+ end
88
+
89
+ def offense_message(offending_source)
90
+ MSG % {
91
+ good: replacement_source(offending_source),
92
+ bad: offending_source
93
+ }
94
+ end
95
+
96
+ def replacement_source(offending_source)
97
+ ENFORCED_REPLACEMENTS.fetch(offending_source)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module RSpec
5
5
  # Version information for the RSpec RuboCop plugin.
6
6
  module Version
7
- STRING = '1.7.0'.freeze
7
+ STRING = '1.8.0'.freeze
8
8
  end
9
9
  end
10
10
  end
@@ -10,14 +10,18 @@ Gem::Specification.new do |spec|
10
10
  Code style checking for RSpec files.
11
11
  A plugin for the RuboCop code style enforcing & linting tool.
12
12
  end_description
13
- spec.homepage = 'http://github.com/nevir/rubocop-rspec'
14
- spec.authors = ['Ian MacLeod', 'Nils Gemeinhardt']
15
- spec.email = ['ian@nevir.net', 'git@nilsgemeinhardt.de']
13
+ spec.homepage = 'http://github.com/backus/rubocop-rspec'
14
+ spec.authors = ['John Backus', 'Ian MacLeod', 'Nils Gemeinhardt']
15
+ spec.email = [
16
+ 'johncbackus@gmail.com',
17
+ 'ian@nevir.net',
18
+ 'git@nilsgemeinhardt.de'
19
+ ]
16
20
  spec.licenses = ['MIT']
17
21
 
18
22
  spec.version = RuboCop::RSpec::Version::STRING
19
23
  spec.platform = Gem::Platform::RUBY
20
- spec.required_ruby_version = '>= 2.2.0'
24
+ spec.required_ruby_version = '>= 2.1.0'
21
25
 
22
26
  spec.require_paths = ['lib']
23
27
  spec.files = Dir[
@@ -20,7 +20,7 @@ describe 'config/default.yml' do
20
20
 
21
21
  def cop_configuration(config_key)
22
22
  cop_names.map do |cop_name|
23
- cop_config = default_config.fetch(cop_name)
23
+ cop_config = default_config[cop_name]
24
24
 
25
25
  cop_config.fetch(config_key) do
26
26
  raise "Expected #{cop_name} to have #{config_key} configuration key"
@@ -47,6 +47,6 @@ describe 'config/default.yml' do
47
47
  end
48
48
 
49
49
  it 'includes Enabled: true for every cop' do
50
- expect(cop_configuration('Enabled')).to all(be(true))
50
+ expect(cop_configuration('Enabled')).to all(be(true).or(be(false)))
51
51
  end
52
52
  end
@@ -35,6 +35,13 @@ describe RuboCop::Cop::RSpec::BeEql do
35
35
  RUBY
36
36
  end
37
37
 
38
+ it 'registers an offense for `eql` when argument is nil' do
39
+ expect_violation(<<-RUBY)
40
+ it { expect(foo).to eql(nil) }
41
+ ^^^ Prefer `be` over `eql`
42
+ RUBY
43
+ end
44
+
38
45
  it 'does not register an offense for `eql` when argument is a string' do
39
46
  expect_no_violations(<<-RUBY)
40
47
  it { expect(foo).to eql('foo') }
@@ -47,13 +54,7 @@ describe RuboCop::Cop::RSpec::BeEql do
47
54
  RUBY
48
55
  end
49
56
 
50
- it 'autocorrects offense to use `be`' do
51
- corrected =
52
- autocorrect_source(
53
- cop,
54
- ['it { expect(foo).to eql(1) }'],
55
- 'spec/foo_spec.rb'
56
- )
57
- expect(corrected).to eq 'it { expect(foo).to be(1) }'
58
- end
57
+ include_examples 'autocorrect',
58
+ 'it { expect(foo).to eql(1) }',
59
+ 'it { expect(foo).to be(1) }'
59
60
  end
@@ -195,25 +195,15 @@ describe RuboCop::Cop::RSpec::DescribedClass, :config do
195
195
  RUBY
196
196
  end
197
197
 
198
- it 'autocorrects an offenses' do
199
- new_source = autocorrect_source(
200
- cop,
201
- [
202
- 'describe MyClass do',
203
- ' include MyClass',
204
- ' subject { MyClass.do_something }',
205
- ' before { MyClass.do_something }',
206
- 'end'
207
- ], 'spec/foo_spec.rb'
208
- )
209
- expect(new_source).to eq(
210
- [
211
- 'describe MyClass do',
212
- ' include described_class',
213
- ' subject { described_class.do_something }',
214
- ' before { described_class.do_something }',
215
- 'end'
216
- ].join("\n")
217
- )
218
- end
198
+ include_examples 'autocorrect',
199
+ 'describe(Foo) { include Foo }',
200
+ 'describe(Foo) { include described_class }'
201
+
202
+ include_examples 'autocorrect',
203
+ 'describe(Foo) { subject { Foo.do_something } }',
204
+ 'describe(Foo) { subject { described_class.do_something } }'
205
+
206
+ include_examples 'autocorrect',
207
+ 'describe(Foo) { before { Foo.do_something } }',
208
+ 'describe(Foo) { before { described_class.do_something } }'
219
209
  end
@@ -44,39 +44,18 @@ describe RuboCop::Cop::RSpec::ExampleWording, :config do
44
44
  RUBY
45
45
  end
46
46
 
47
- it 'corrects `it "should only have"` to it "only has"' do
48
- corrected =
49
- autocorrect_source(
50
- cop,
51
- 'it "should only have trait" do end',
52
- 'spec/foo_spec.rb'
53
- )
54
-
55
- expect(corrected).to eql('it "only has trait" do end')
56
- end
47
+ include_examples 'autocorrect',
48
+ 'it "should only have trait" do end',
49
+ 'it "only has trait" do end'
57
50
  end
58
51
 
59
52
  context 'when configuration is empty' do
60
- it 'only does not correct "have"' do
61
- corrected =
62
- autocorrect_source(
63
- cop,
64
- 'it "should have trait" do end',
65
- 'spec/foo_spec.rb'
66
- )
67
-
68
- expect(corrected).to eql('it "haves trait" do end')
69
- end
70
-
71
- it 'only does not make an exception for the word "only"' do
72
- corrected =
73
- autocorrect_source(
74
- cop,
75
- 'it "should only fail" do end',
76
- 'spec/foo_spec.rb'
77
- )
53
+ include_examples 'autocorrect',
54
+ 'it "should have trait" do end',
55
+ 'it "haves trait" do end'
78
56
 
79
- expect(corrected).to eql('it "onlies fail" do end')
80
- end
57
+ include_examples 'autocorrect',
58
+ 'it "should only fail" do end',
59
+ 'it "onlies fail" do end'
81
60
  end
82
61
  end
@@ -116,8 +116,8 @@ describe RuboCop::Cop::RSpec::FilePath, :config do
116
116
  it 'handles alphanumeric class names' do
117
117
  inspect_source(
118
118
  cop,
119
- 'describe IPv4AndIPv6 do; end',
120
- 'i_pv4_and_i_pv6_spec.rb'
119
+ 'describe IPV4AndIPV6 do; end',
120
+ 'ipv4_and_ipv6_spec.rb'
121
121
  )
122
122
  expect(cop.offenses).to be_empty
123
123
  end
@@ -212,7 +212,7 @@ describe RuboCop::Cop::RSpec::FilePath, :config do
212
212
  expect(cop.offenses).to be_empty
213
213
  end
214
214
 
215
- context 'when configured' do
215
+ context 'when configured with CustomTransform' do
216
216
  let(:cop_config) { { 'CustomTransform' => { 'FooFoo' => 'foofoo' } } }
217
217
 
218
218
  it 'respects custom module name transformation' do
@@ -233,4 +233,17 @@ describe RuboCop::Cop::RSpec::FilePath, :config do
233
233
  expect(cop.offenses).to be_empty
234
234
  end
235
235
  end
236
+
237
+ context 'when configured with IgnoreMethods' do
238
+ let(:cop_config) { { 'IgnoreMethods' => true } }
239
+
240
+ it 'does not care about the described method' do
241
+ inspect_source(
242
+ cop,
243
+ "describe MyClass, '#look_here_a_method' do; end",
244
+ 'my_class_spec.rb'
245
+ )
246
+ expect(cop.offenses).to be_empty
247
+ end
248
+ end
236
249
  end
@@ -32,43 +32,17 @@ describe RuboCop::Cop::RSpec::HookArgument, :config do
32
32
  end
33
33
  end
34
34
 
35
- shared_examples 'generated config' do |source, detected_style|
36
- it 'generates a todo based on the detected style' do
37
- inspect_source(cop, source, 'foo_spec.rb')
38
-
39
- expect(cop.config_to_allow_offenses)
40
- .to eq('EnforcedStyle' => detected_style)
41
- end
42
- end
43
-
44
35
  shared_examples 'hook autocorrect' do |output|
45
- it 'autocorrects :each to EnforcedStyle' do
46
- corrected =
47
- autocorrect_source(cop, 'before(:each) { }', 'spec/foo_spec.rb')
48
-
49
- expect(corrected).to eql(output)
50
- end
51
-
52
- it 'autocorrects :example to EnforcedStyle' do
53
- corrected =
54
- autocorrect_source(cop, 'before(:example) { }', 'spec/foo_spec.rb')
55
-
56
- expect(corrected).to eql(output)
57
- end
58
-
59
- it 'autocorrects :implicit to EnforcedStyle' do
60
- corrected =
61
- autocorrect_source(cop, 'before { }', 'spec/foo_spec.rb')
62
-
63
- expect(corrected).to eql(output)
64
- end
36
+ include_examples 'autocorrect', 'before(:each) { }', output
37
+ include_examples 'autocorrect', 'before(:example) { }', output
38
+ include_examples 'autocorrect', 'before { }', output
65
39
  end
66
40
 
67
41
  shared_examples 'an example hook' do
68
42
  include_examples 'ignored hooks'
69
- include_examples 'generated config', 'before(:each) { foo }', 'each'
70
- include_examples 'generated config', 'before(:example) { foo }', 'example'
71
- include_examples 'generated config', 'before { foo }', 'implicit'
43
+ include_examples 'detects style', 'before(:each) { foo }', 'each'
44
+ include_examples 'detects style', 'before(:example) { foo }', 'example'
45
+ include_examples 'detects style', 'before { foo }', 'implicit'
72
46
  end
73
47
 
74
48
  context 'when EnforcedStyle is :implicit' do
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe RuboCop::Cop::RSpec::ImplicitExpect, :config do
4
+ subject(:cop) { described_class.new(config) }
5
+
6
+ context 'when EnforcedStyle is is_expected' do
7
+ let(:cop_config) do
8
+ { 'EnforcedStyle' => 'is_expected' }
9
+ end
10
+
11
+ it 'flags it { should }' do
12
+ expect_violation(<<-RUBY)
13
+ it { should be_truthy }
14
+ ^^^^^^ Prefer `is_expected.to` over `should`.
15
+ RUBY
16
+ end
17
+
18
+ it 'flags it { should_not }' do
19
+ expect_violation(<<-RUBY)
20
+ it { should_not be_truthy }
21
+ ^^^^^^^^^^ Prefer `is_expected.to_not` over `should_not`.
22
+ RUBY
23
+ end
24
+
25
+ it 'approves of is_expected.to' do
26
+ expect_no_violations('it { is_expected.to be_truthy }')
27
+ end
28
+
29
+ it 'approves of is_expected.to_not' do
30
+ expect_no_violations('it { is_expected.to_not be_truthy }')
31
+ end
32
+
33
+ it 'approves of is_expected.to_not' do
34
+ expect_no_violations('it { is_expected.not_to be_truthy }')
35
+ end
36
+
37
+ include_examples 'detects style', 'it { should be_truthy }', 'should'
38
+ include_examples 'autocorrect',
39
+ 'it { should be_truthy }',
40
+ 'it { is_expected.to be_truthy }'
41
+
42
+ include_examples 'autocorrect',
43
+ 'it { should_not be_truthy }',
44
+ 'it { is_expected.to_not be_truthy }'
45
+ end
46
+
47
+ context 'when EnforcedStyle is should' do
48
+ let(:cop_config) do
49
+ { 'EnforcedStyle' => 'should' }
50
+ end
51
+
52
+ it 'flags it { is_expected.to }' do
53
+ expect_violation(<<-RUBY)
54
+ it { is_expected.to be_truthy }
55
+ ^^^^^^^^^^^^^^ Prefer `should` over `is_expected.to`.
56
+ RUBY
57
+ end
58
+
59
+ it 'flags it { is_expected.to_not }' do
60
+ expect_violation(<<-RUBY)
61
+ it { is_expected.to_not be_truthy }
62
+ ^^^^^^^^^^^^^^^^^^ Prefer `should_not` over `is_expected.to_not`.
63
+ RUBY
64
+ end
65
+
66
+ it 'flags it { is_expected.not_to }' do
67
+ expect_violation(<<-RUBY)
68
+ it { is_expected.not_to be_truthy }
69
+ ^^^^^^^^^^^^^^^^^^ Prefer `should_not` over `is_expected.not_to`.
70
+ RUBY
71
+ end
72
+
73
+ it 'approves of should' do
74
+ expect_no_violations('it { should be_truthy }')
75
+ end
76
+
77
+ it 'approves of should_not' do
78
+ expect_no_violations('it { should_not be_truthy }')
79
+ end
80
+
81
+ include_examples 'detects style',
82
+ 'it { is_expected.to be_truthy }',
83
+ 'is_expected'
84
+
85
+ include_examples 'detects style',
86
+ 'it { should be_truthy }',
87
+ 'should'
88
+
89
+ include_examples 'autocorrect',
90
+ 'it { is_expected.to be_truthy }',
91
+ 'it { should be_truthy }'
92
+
93
+ include_examples 'autocorrect',
94
+ 'it { is_expected.to_not be_truthy }',
95
+ 'it { should_not be_truthy }'
96
+
97
+ include_examples 'autocorrect',
98
+ 'it { is_expected.not_to be_truthy }',
99
+ 'it { should_not be_truthy }'
100
+ end
101
+ end
@@ -35,7 +35,7 @@ describe RuboCop::Cop::RSpec::NestedGroups, :config do
35
35
  RUBY
36
36
  end
37
37
 
38
- context 'when MaxNesting is configured as 2' do
38
+ context 'when MaxNesting is configured as 3' do
39
39
  let(:cop_config) { { 'MaxNesting' => '3' } }
40
40
 
41
41
  it 'only flags third level of nesting' do
@@ -17,15 +17,9 @@ describe RuboCop::Cop::RSpec::NotToNot, :config do
17
17
  RUBY
18
18
  end
19
19
 
20
- it 'auto-corrects `to_not` to `not_to`' do
21
- corrected =
22
- autocorrect_source(
23
- cop,
24
- ['it { expect(0).to_not equal 1 }'],
25
- 'spec/foo_spec.rb'
26
- )
27
- expect(corrected).to eq 'it { expect(0).not_to equal 1 }'
28
- end
20
+ include_examples 'autocorrect',
21
+ 'it { expect(0).to_not equal 1 }',
22
+ 'it { expect(0).not_to equal 1 }'
29
23
  end
30
24
 
31
25
  context 'when AcceptedMethod is `to_not`' do
@@ -44,14 +38,8 @@ describe RuboCop::Cop::RSpec::NotToNot, :config do
44
38
  RUBY
45
39
  end
46
40
 
47
- it 'auto-corrects `not_to` to `to_not`' do
48
- corrected =
49
- autocorrect_source(
50
- cop,
51
- ['it { expect(0).not_to equal 1 }'],
52
- 'spec/foo_spec.rb'
53
- )
54
- expect(corrected).to eq 'it { expect(0).to_not equal 1 }'
55
- end
41
+ include_examples 'autocorrect',
42
+ 'it { expect(0).not_to equal 1 }',
43
+ 'it { expect(0).to_not equal 1 }'
56
44
  end
57
45
  end
@@ -0,0 +1,7 @@
1
+ RSpec.shared_examples 'autocorrect' do |original, corrected|
2
+ it "autocorrects `#{original}` to `#{corrected}`" do
3
+ autocorrected = autocorrect_source(cop, original, 'spec/foo_spec.rb')
4
+
5
+ expect(autocorrected).to eql(corrected)
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ RSpec.shared_examples 'detects style' do |source, detected_style|
2
+ it 'generates a todo based on the detected style' do
3
+ inspect_source(cop, source, 'foo_spec.rb')
4
+
5
+ expect(cop.config_to_allow_offenses)
6
+ .to eq('EnforcedStyle' => detected_style)
7
+ end
8
+ end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
+ - John Backus
7
8
  - Ian MacLeod
8
9
  - Nils Gemeinhardt
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2016-08-24 00:00:00.000000000 Z
13
+ date: 2016-10-27 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rubocop
@@ -127,6 +128,7 @@ description: |2
127
128
  Code style checking for RSpec files.
128
129
  A plugin for the RuboCop code style enforcing & linting tool.
129
130
  email:
131
+ - johncbackus@gmail.com
130
132
  - ian@nevir.net
131
133
  - git@nilsgemeinhardt.de
132
134
  executables: []
@@ -154,6 +156,7 @@ files:
154
156
  - lib/rubocop/cop/rspec/file_path.rb
155
157
  - lib/rubocop/cop/rspec/focus.rb
156
158
  - lib/rubocop/cop/rspec/hook_argument.rb
159
+ - lib/rubocop/cop/rspec/implicit_expect.rb
157
160
  - lib/rubocop/cop/rspec/instance_variable.rb
158
161
  - lib/rubocop/cop/rspec/leading_subject.rb
159
162
  - lib/rubocop/cop/rspec/let_setup.rb
@@ -194,6 +197,7 @@ files:
194
197
  - spec/rubocop/cop/rspec/file_path_spec.rb
195
198
  - spec/rubocop/cop/rspec/focus_spec.rb
196
199
  - spec/rubocop/cop/rspec/hook_argument_spec.rb
200
+ - spec/rubocop/cop/rspec/implicit_expect_spec.rb
197
201
  - spec/rubocop/cop/rspec/instance_variable_spec.rb
198
202
  - spec/rubocop/cop/rspec/leading_subject_spec.rb
199
203
  - spec/rubocop/cop/rspec/let_setup_spec.rb
@@ -212,10 +216,12 @@ files:
212
216
  - spec/rubocop/rspec/spec_only_spec.rb
213
217
  - spec/rubocop/rspec/util/one_spec.rb
214
218
  - spec/rubocop/rspec/wording_spec.rb
219
+ - spec/shared/autocorrect_behavior.rb
220
+ - spec/shared/detects_style_behavior.rb
215
221
  - spec/shared/rspec_only_cop_behavior.rb
216
222
  - spec/spec_helper.rb
217
223
  - spec/support/expect_violation.rb
218
- homepage: http://github.com/nevir/rubocop-rspec
224
+ homepage: http://github.com/backus/rubocop-rspec
219
225
  licenses:
220
226
  - MIT
221
227
  metadata: {}
@@ -227,7 +233,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
227
233
  requirements:
228
234
  - - ">="
229
235
  - !ruby/object:Gem::Version
230
- version: 2.2.0
236
+ version: 2.1.0
231
237
  required_rubygems_version: !ruby/object:Gem::Requirement
232
238
  requirements:
233
239
  - - ">="
@@ -256,6 +262,7 @@ test_files:
256
262
  - spec/rubocop/cop/rspec/file_path_spec.rb
257
263
  - spec/rubocop/cop/rspec/focus_spec.rb
258
264
  - spec/rubocop/cop/rspec/hook_argument_spec.rb
265
+ - spec/rubocop/cop/rspec/implicit_expect_spec.rb
259
266
  - spec/rubocop/cop/rspec/instance_variable_spec.rb
260
267
  - spec/rubocop/cop/rspec/leading_subject_spec.rb
261
268
  - spec/rubocop/cop/rspec/let_setup_spec.rb
@@ -274,6 +281,8 @@ test_files:
274
281
  - spec/rubocop/rspec/spec_only_spec.rb
275
282
  - spec/rubocop/rspec/util/one_spec.rb
276
283
  - spec/rubocop/rspec/wording_spec.rb
284
+ - spec/shared/autocorrect_behavior.rb
285
+ - spec/shared/detects_style_behavior.rb
277
286
  - spec/shared/rspec_only_cop_behavior.rb
278
287
  - spec/spec_helper.rb
279
288
  - spec/support/expect_violation.rb