rubocop-rspec 1.41.0 → 1.42.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/rubocop/cop/rspec/align_left_let_brace.rb +11 -18
  4. data/lib/rubocop/cop/rspec/align_right_let_brace.rb +11 -18
  5. data/lib/rubocop/cop/rspec/be.rb +1 -1
  6. data/lib/rubocop/cop/rspec/be_eql.rb +5 -5
  7. data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +18 -16
  8. data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +8 -9
  9. data/lib/rubocop/cop/rspec/context_method.rb +5 -7
  10. data/lib/rubocop/cop/rspec/cop.rb +1 -1
  11. data/lib/rubocop/cop/rspec/described_class.rb +10 -7
  12. data/lib/rubocop/cop/rspec/dialect.rb +4 -11
  13. data/lib/rubocop/cop/rspec/empty_hook.rb +5 -9
  14. data/lib/rubocop/cop/rspec/empty_line_after_example.rb +5 -3
  15. data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +5 -5
  16. data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +4 -1
  17. data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +5 -5
  18. data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +4 -1
  19. data/lib/rubocop/cop/rspec/example_wording.rb +6 -7
  20. data/lib/rubocop/cop/rspec/expect_actual.rb +7 -10
  21. data/lib/rubocop/cop/rspec/expect_change.rb +9 -34
  22. data/lib/rubocop/cop/rspec/expect_in_hook.rb +2 -2
  23. data/lib/rubocop/cop/rspec/expect_output.rb +1 -1
  24. data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +18 -18
  25. data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +10 -16
  26. data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +6 -7
  27. data/lib/rubocop/cop/rspec/hook_argument.rb +11 -17
  28. data/lib/rubocop/cop/rspec/hooks_before_examples.rb +12 -13
  29. data/lib/rubocop/cop/rspec/implicit_expect.rb +6 -14
  30. data/lib/rubocop/cop/rspec/implicit_subject.rb +8 -5
  31. data/lib/rubocop/cop/rspec/instance_spy.rb +17 -11
  32. data/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb +2 -5
  33. data/lib/rubocop/cop/rspec/it_behaves_like.rb +4 -5
  34. data/lib/rubocop/cop/rspec/leading_subject.rb +13 -13
  35. data/lib/rubocop/cop/rspec/let_before_examples.rb +12 -10
  36. data/lib/rubocop/cop/rspec/message_chain.rb +6 -5
  37. data/lib/rubocop/cop/rspec/message_expectation.rb +1 -1
  38. data/lib/rubocop/cop/rspec/message_spies.rb +1 -2
  39. data/lib/rubocop/cop/rspec/multiple_subjects.rb +17 -18
  40. data/lib/rubocop/cop/rspec/named_subject.rb +1 -1
  41. data/lib/rubocop/cop/rspec/not_to_not.rb +4 -5
  42. data/lib/rubocop/cop/rspec/predicate_matcher.rb +23 -53
  43. data/lib/rubocop/cop/rspec/rails/http_status.rb +4 -8
  44. data/lib/rubocop/cop/rspec/receive_counts.rb +14 -16
  45. data/lib/rubocop/cop/rspec/receive_never.rb +10 -10
  46. data/lib/rubocop/cop/rspec/return_from_stub.rb +8 -19
  47. data/lib/rubocop/cop/rspec/scattered_let.rb +7 -10
  48. data/lib/rubocop/cop/rspec/shared_context.rb +7 -20
  49. data/lib/rubocop/cop/rspec/shared_examples.rb +5 -8
  50. data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +14 -17
  51. data/lib/rubocop/cop/rspec/yield.rb +13 -10
  52. data/lib/rubocop/rspec/blank_line_separation.rb +0 -8
  53. data/lib/rubocop/rspec/version.rb +1 -1
  54. metadata +4 -4
@@ -31,6 +31,7 @@ module RuboCop
31
31
  # it { is_expected.to have_http_status :error }
32
32
  #
33
33
  class HttpStatus < Cop
34
+ extend AutoCorrector
34
35
  include ConfigurableEnforcedStyle
35
36
 
36
37
  def_node_matcher :http_status, <<-PATTERN
@@ -42,14 +43,9 @@ module RuboCop
42
43
  checker = checker_class.new(ast_node)
43
44
  return unless checker.offensive?
44
45
 
45
- add_offense(checker.node, message: checker.message)
46
- end
47
- end
48
-
49
- def autocorrect(node)
50
- lambda do |corrector|
51
- checker = checker_class.new(node)
52
- corrector.replace(node.loc.expression, checker.preferred_style)
46
+ add_offense(checker.node, message: checker.message) do |corrector|
47
+ corrector.replace(checker.node, checker.preferred_style)
48
+ end
53
49
  end
54
50
  end
55
51
 
@@ -24,6 +24,8 @@ module RuboCop
24
24
  # expect(foo).to receive(:bar).at_most(:twice).times
25
25
  #
26
26
  class ReceiveCounts < Cop
27
+ extend AutoCorrector
28
+
27
29
  MSG = 'Use `%<alternative>s` instead of `%<original>s`.'
28
30
 
29
31
  def_node_matcher :receive_counts, <<-PATTERN
@@ -38,27 +40,23 @@ module RuboCop
38
40
 
39
41
  offending_range = range(node, offending_node)
40
42
 
41
- add_offense(
42
- offending_node,
43
- message: message_for(offending_node, offending_range.source),
44
- location: offending_range
45
- )
43
+ msg = message_for(offending_node, offending_range.source)
44
+ add_offense(offending_range, message: msg) do |corrector|
45
+ autocorrect(corrector, offending_node, offending_range)
46
+ end
46
47
  end
47
48
  end
48
49
 
49
- def autocorrect(node)
50
- lambda do |corrector|
51
- replacement = matcher_for(
52
- node.method_name,
53
- node.first_argument.source.to_i
54
- )
50
+ private
55
51
 
56
- original = range(node.parent, node)
57
- corrector.replace(original, replacement)
58
- end
59
- end
52
+ def autocorrect(corrector, node, range)
53
+ replacement = matcher_for(
54
+ node.method_name,
55
+ node.first_argument.source.to_i
56
+ )
60
57
 
61
- private
58
+ corrector.replace(range, replacement)
59
+ end
62
60
 
63
61
  def message_for(node, source)
64
62
  alternative = matcher_for(
@@ -14,6 +14,7 @@ module RuboCop
14
14
  # expect(foo).not_to receive(:bar)
15
15
  #
16
16
  class ReceiveNever < Cop
17
+ extend AutoCorrector
17
18
  MSG = 'Use `not_to receive` instead of `never`.'
18
19
 
19
20
  def_node_search :method_on_stub?, '(send nil? :receive ...)'
@@ -21,18 +22,17 @@ module RuboCop
21
22
  def on_send(node)
22
23
  return unless node.method_name == :never && method_on_stub?(node)
23
24
 
24
- add_offense(
25
- node,
26
- location: :selector
27
- )
25
+ add_offense(node.loc.selector) do |corrector|
26
+ autocorrect(corrector, node)
27
+ end
28
28
  end
29
29
 
30
- def autocorrect(node)
31
- lambda do |corrector|
32
- corrector.replace(node.parent.loc.selector, 'not_to')
33
- range = node.loc.dot.with(end_pos: node.loc.selector.end_pos)
34
- corrector.remove(range)
35
- end
30
+ private
31
+
32
+ def autocorrect(corrector, node)
33
+ corrector.replace(node.parent.loc.selector, 'not_to')
34
+ range = node.loc.dot.with(end_pos: node.loc.selector.end_pos)
35
+ corrector.remove(range)
36
36
  end
37
37
  end
38
38
  end
@@ -34,6 +34,7 @@ module RuboCop
34
34
  # allow(Foo).to receive(:bar) { bar.baz }
35
35
  #
36
36
  class ReturnFromStub < Cop
37
+ extend AutoCorrector
37
38
  include ConfigurableEnforcedStyle
38
39
 
39
40
  MSG_AND_RETURN = 'Use `and_return` for static values.'
@@ -59,24 +60,14 @@ module RuboCop
59
60
  check_block_body(node)
60
61
  end
61
62
 
62
- def autocorrect(node)
63
- if style == :block
64
- AndReturnCallCorrector.new(node)
65
- else
66
- BlockBodyCorrector.new(node)
67
- end
68
- end
69
-
70
63
  private
71
64
 
72
65
  def check_and_return_call(node)
73
66
  and_return_value(node) do |and_return, args|
74
67
  unless dynamic?(args)
75
- add_offense(
76
- and_return,
77
- location: :selector,
78
- message: MSG_BLOCK
79
- )
68
+ add_offense(and_return.loc.selector, message: MSG_BLOCK) do |corr|
69
+ AndReturnCallCorrector.new(and_return).call(corr)
70
+ end
80
71
  end
81
72
  end
82
73
  end
@@ -84,11 +75,9 @@ module RuboCop
84
75
  def check_block_body(block)
85
76
  body = block.body
86
77
  unless dynamic?(body) # rubocop:disable Style/GuardClause
87
- add_offense(
88
- block,
89
- location: :begin,
90
- message: MSG_AND_RETURN
91
- )
78
+ add_offense(block.loc.begin, message: MSG_AND_RETURN) do |corrector|
79
+ BlockBodyCorrector.new(block).call(corrector)
80
+ end
92
81
  end
93
82
  end
94
83
 
@@ -153,7 +142,7 @@ module RuboCop
153
142
  return if heredoc?
154
143
 
155
144
  corrector.replace(
156
- block.loc.expression,
145
+ block,
157
146
  "#{block.send_node.source}.and_return(#{body.source})"
158
147
  )
159
148
  end
@@ -27,6 +27,8 @@ module RuboCop
27
27
  # end
28
28
  #
29
29
  class ScatteredLet < Cop
30
+ extend AutoCorrector
31
+
30
32
  MSG = 'Group all let/let! blocks in the example group together.'
31
33
 
32
34
  def on_block(node)
@@ -35,15 +37,6 @@ module RuboCop
35
37
  check_let_declarations(node.body)
36
38
  end
37
39
 
38
- def autocorrect(node)
39
- lambda do |corrector|
40
- first_let = find_first_let(node.parent)
41
- RuboCop::RSpec::Corrector::MoveNode.new(
42
- node, corrector, processed_source
43
- ).move_after(first_let)
44
- end
45
- end
46
-
47
40
  private
48
41
 
49
42
  def check_let_declarations(body)
@@ -53,7 +46,11 @@ module RuboCop
53
46
  lets.each_with_index do |node, idx|
54
47
  next if node.sibling_index == first_let.sibling_index + idx
55
48
 
56
- add_offense(node)
49
+ add_offense(node) do |corrector|
50
+ RuboCop::RSpec::Corrector::MoveNode.new(
51
+ node, corrector, processed_source
52
+ ).move_after(first_let)
53
+ end
57
54
  end
58
55
  end
59
56
 
@@ -51,6 +51,8 @@ module RuboCop
51
51
  # end
52
52
  #
53
53
  class SharedContext < Cop
54
+ extend AutoCorrector
55
+
54
56
  MSG_EXAMPLES = "Use `shared_examples` when you don't "\
55
57
  'define context.'
56
58
 
@@ -68,22 +70,14 @@ module RuboCop
68
70
 
69
71
  def on_block(node)
70
72
  context_with_only_examples(node) do
71
- add_shared_item_offense(node.send_node, MSG_EXAMPLES)
73
+ add_offense(node.send_node, message: MSG_EXAMPLES) do |corrector|
74
+ corrector.replace(node.send_node.loc.selector, 'shared_examples')
75
+ end
72
76
  end
73
77
 
74
78
  examples_with_only_context(node) do
75
- add_shared_item_offense(node.send_node, MSG_CONTEXT)
76
- end
77
- end
78
-
79
- def autocorrect(node)
80
- lambda do |corrector|
81
- context_with_only_examples(node.parent) do
82
- corrector.replace(node.loc.selector, 'shared_examples')
83
- end
84
-
85
- examples_with_only_context(node.parent) do
86
- corrector.replace(node.loc.selector, 'shared_context')
79
+ add_offense(node.send_node, message: MSG_CONTEXT) do |corrector|
80
+ corrector.replace(node.send_node.loc.selector, 'shared_context')
87
81
  end
88
82
  end
89
83
  end
@@ -97,13 +91,6 @@ module RuboCop
97
91
  def examples_with_only_context(node)
98
92
  shared_example(node) { yield if context?(node) && !examples?(node) }
99
93
  end
100
-
101
- def add_shared_item_offense(node, message)
102
- add_offense(
103
- node,
104
- message: message
105
- )
106
- end
107
94
  end
108
95
  end
109
96
  end
@@ -21,6 +21,8 @@ module RuboCop
21
21
  # include_examples 'foo bar baz'
22
22
  #
23
23
  class SharedExamples < Cop
24
+ extend AutoCorrector
25
+
24
26
  def_node_matcher :shared_examples,
25
27
  (SharedGroups::ALL + Includes::ALL).send_pattern
26
28
 
@@ -30,14 +32,9 @@ module RuboCop
30
32
  next unless ast_node&.sym_type?
31
33
 
32
34
  checker = Checker.new(ast_node)
33
- add_offense(checker.node, message: checker.message)
34
- end
35
- end
36
-
37
- def autocorrect(node)
38
- lambda do |corrector|
39
- checker = Checker.new(node)
40
- corrector.replace(node.loc.expression, checker.preferred_style)
35
+ add_offense(checker.node, message: checker.message) do |corrector|
36
+ corrector.replace(checker.node, checker.preferred_style)
37
+ end
41
38
  end
42
39
  end
43
40
 
@@ -17,6 +17,8 @@ module RuboCop
17
17
  # allow(foo).to receive("bar.baz")
18
18
  #
19
19
  class SingleArgumentMessageChain < Cop
20
+ extend AutoCorrector
21
+
20
22
  MSG = 'Use `%<recommended>s` instead of calling '\
21
23
  '`%<called>s` with a single argument.'
22
24
 
@@ -30,22 +32,23 @@ module RuboCop
30
32
  message_chain(node) do |arg|
31
33
  return if valid_usage?(arg)
32
34
 
33
- add_offense(node, location: :selector)
34
- end
35
- end
35
+ method = node.method_name
36
+ msg = format(MSG, recommended: replacement(method), called: method)
36
37
 
37
- def autocorrect(node)
38
- lambda do |corrector|
39
- corrector.replace(node.loc.selector, replacement(node.method_name))
40
- message_chain(node) do |arg|
41
- autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg)
42
- autocorrect_array_arg(corrector, arg) if arg.array_type?
38
+ add_offense(node.loc.selector, message: msg) do |corrector|
39
+ autocorrect(corrector, node, method, arg)
43
40
  end
44
41
  end
45
42
  end
46
43
 
47
44
  private
48
45
 
46
+ def autocorrect(corrector, node, method, arg)
47
+ corrector.replace(node.loc.selector, replacement(method))
48
+ autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg)
49
+ autocorrect_array_arg(corrector, arg) if arg.array_type?
50
+ end
51
+
49
52
  def valid_usage?(node)
50
53
  return true unless node.literal? || node.array_type?
51
54
 
@@ -63,7 +66,7 @@ module RuboCop
63
66
  def autocorrect_hash_arg(corrector, arg)
64
67
  key, value = *arg.children.first
65
68
 
66
- corrector.replace(arg.loc.expression, key_to_arg(key))
69
+ corrector.replace(arg, key_to_arg(key))
67
70
  corrector.insert_after(arg.parent.loc.end,
68
71
  ".and_return(#{value.source})")
69
72
  end
@@ -71,7 +74,7 @@ module RuboCop
71
74
  def autocorrect_array_arg(corrector, arg)
72
75
  value = arg.children.first
73
76
 
74
- corrector.replace(arg.loc.expression, value.source)
77
+ corrector.replace(arg, value.source)
75
78
  end
76
79
 
77
80
  def key_to_arg(node)
@@ -82,12 +85,6 @@ module RuboCop
82
85
  def replacement(method)
83
86
  method.equal?(:receive_message_chain) ? 'receive' : 'stub'
84
87
  end
85
-
86
- def message(node)
87
- method = node.method_name
88
-
89
- format(MSG, recommended: replacement(method), called: method)
90
- end
91
88
  end
92
89
  end
93
90
  end
@@ -12,6 +12,7 @@ module RuboCop
12
12
  # # good
13
13
  # expect(foo).to be(:bar).and_yield(1)
14
14
  class Yield < Cop
15
+ extend AutoCorrector
15
16
  include RangeHelp
16
17
 
17
18
  MSG = 'Use `.and_yield`.'
@@ -27,22 +28,24 @@ module RuboCop
27
28
 
28
29
  block_arg(node.arguments) do |block|
29
30
  if calling_block?(node.body, block)
30
- add_offense(node, location: block_range(node))
31
- end
32
- end
33
- end
31
+ range = block_range(node)
34
32
 
35
- def autocorrect(node)
36
- lambda do |corrector|
37
- node_range = range_with_surrounding_space(
38
- range: block_range(node), side: :left
39
- )
40
- corrector.replace(node_range, generate_replacement(node.body))
33
+ add_offense(range) do |corrector|
34
+ autocorrect(corrector, node, range)
35
+ end
36
+ end
41
37
  end
42
38
  end
43
39
 
44
40
  private
45
41
 
42
+ def autocorrect(corrector, node, range)
43
+ corrector.replace(
44
+ range_with_surrounding_space(range: range, side: :left),
45
+ generate_replacement(node.body)
46
+ )
47
+ end
48
+
46
49
  def calling_block?(node, block)
47
50
  if node.begin_type?
48
51
  node.each_child_node.all? { |child| block_call?(child, block) }
@@ -32,14 +32,6 @@ module RuboCop
32
32
 
33
33
  node.equal?(node.parent.children.last)
34
34
  end
35
-
36
- def autocorrect(node)
37
- lambda do |corrector|
38
- missing_separating_line(node) do |location|
39
- corrector.insert_after(location.end, "\n")
40
- end
41
- end
42
- end
43
35
  end
44
36
  end
45
37
  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.41.0'
7
+ STRING = '1.42.0'
8
8
  end
9
9
  end
10
10
  end
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.41.0
4
+ version: 1.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Backus
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-07-03 00:00:00.000000000 Z
13
+ date: 2020-07-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: 0.68.1
21
+ version: 0.87.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 0.68.1
28
+ version: 0.87.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: rack
31
31
  requirement: !ruby/object:Gem::Requirement