rubocop-rspec 1.41.0 → 1.42.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.
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