rubocop-rspec 2.13.2 → 2.14.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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +402 -383
  3. data/CODE_OF_CONDUCT.md +4 -4
  4. data/MIT-LICENSE.md +1 -2
  5. data/config/default.yml +65 -4
  6. data/lib/rubocop/cop/rspec/capybara/negation_matcher.rb +106 -0
  7. data/lib/rubocop/cop/rspec/capybara/specific_actions.rb +85 -0
  8. data/lib/rubocop/cop/rspec/capybara/specific_matcher.rb +5 -82
  9. data/lib/rubocop/cop/rspec/change_by_zero.rb +1 -1
  10. data/lib/rubocop/cop/rspec/context_wording.rb +4 -2
  11. data/lib/rubocop/cop/rspec/example_wording.rb +32 -0
  12. data/lib/rubocop/cop/rspec/factory_bot/consistent_parentheses_style.rb +99 -0
  13. data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +2 -2
  14. data/lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb +1 -19
  15. data/lib/rubocop/cop/rspec/implicit_subject.rb +86 -19
  16. data/lib/rubocop/cop/rspec/let_before_examples.rb +15 -1
  17. data/lib/rubocop/cop/rspec/mixin/capybara_help.rb +80 -0
  18. data/lib/rubocop/cop/rspec/mixin/css_selector.rb +48 -1
  19. data/lib/rubocop/cop/rspec/mixin/skip_or_pending.rb +23 -0
  20. data/lib/rubocop/cop/rspec/no_expectation_example.rb +42 -9
  21. data/lib/rubocop/cop/rspec/pending.rb +2 -11
  22. data/lib/rubocop/cop/rspec/rails/inferred_spec_type.rb +135 -0
  23. data/lib/rubocop/cop/rspec/repeated_include_example.rb +1 -1
  24. data/lib/rubocop/cop/rspec/sort_metadata.rb +102 -0
  25. data/lib/rubocop/cop/rspec/subject_declaration.rb +1 -1
  26. data/lib/rubocop/cop/rspec_cops.rb +5 -0
  27. data/lib/rubocop/rspec/factory_bot/language.rb +20 -0
  28. data/lib/rubocop/rspec/version.rb +1 -1
  29. data/lib/rubocop-rspec.rb +2 -0
  30. metadata +9 -2
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Sort RSpec metadata alphabetically.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # describe 'Something', :b, :a
11
+ # context 'Something', foo: 'bar', baz: true
12
+ # it 'works', :b, :a, foo: 'bar', baz: true
13
+ #
14
+ # # good
15
+ # describe 'Something', :a, :b
16
+ # context 'Something', baz: true, foo: 'bar'
17
+ # it 'works', :a, :b, baz: true, foo: 'bar'
18
+ #
19
+ class SortMetadata < Base
20
+ extend AutoCorrector
21
+ include RangeHelp
22
+
23
+ MSG = 'Sort metadata alphabetically.'
24
+
25
+ # @!method rspec_metadata(node)
26
+ def_node_matcher :rspec_metadata, <<~PATTERN
27
+ (block
28
+ (send
29
+ #rspec? {#Examples.all #ExampleGroups.all #SharedGroups.all #Hooks.all #Includes.all}
30
+ _ ${send str sym}* (hash $...)?)
31
+ ...)
32
+ PATTERN
33
+
34
+ # @!method rspec_configure(node)
35
+ def_node_matcher :rspec_configure, <<~PATTERN
36
+ (block (send #rspec? :configure) (args (arg $_)) ...)
37
+ PATTERN
38
+
39
+ # @!method metadata_in_block(node)
40
+ def_node_search :metadata_in_block, <<~PATTERN
41
+ (send (lvar %) #Hooks.all _ ${send str sym}* (hash $...)?)
42
+ PATTERN
43
+
44
+ def on_block(node)
45
+ rspec_configure(node) do |block_var|
46
+ metadata_in_block(node, block_var) do |symbols, pairs|
47
+ investigate(symbols, pairs.flatten)
48
+ end
49
+ end
50
+
51
+ rspec_metadata(node) do |symbols, pairs|
52
+ investigate(symbols, pairs.flatten)
53
+ end
54
+ end
55
+
56
+ alias on_numblock on_block
57
+
58
+ private
59
+
60
+ def investigate(symbols, pairs)
61
+ return if sorted?(symbols, pairs)
62
+
63
+ crime_scene = crime_scene(symbols, pairs)
64
+ add_offense(crime_scene) do |corrector|
65
+ corrector.replace(crime_scene, replacement(symbols, pairs))
66
+ end
67
+ end
68
+
69
+ def crime_scene(symbols, pairs)
70
+ metadata = symbols + pairs
71
+
72
+ range_between(
73
+ metadata.first.loc.expression.begin_pos,
74
+ metadata.last.loc.expression.end_pos
75
+ )
76
+ end
77
+
78
+ def replacement(symbols, pairs)
79
+ (sort_symbols(symbols) + sort_pairs(pairs)).map(&:source).join(', ')
80
+ end
81
+
82
+ def sorted?(symbols, pairs)
83
+ symbols == sort_symbols(symbols) && pairs == sort_pairs(pairs)
84
+ end
85
+
86
+ def sort_pairs(pairs)
87
+ pairs.sort_by { |pair| pair.key.source.downcase }
88
+ end
89
+
90
+ def sort_symbols(symbols)
91
+ symbols.sort_by do |symbol|
92
+ if %i[str sym].include?(symbol.type)
93
+ symbol.value.to_s.downcase
94
+ else
95
+ symbol.source.downcase
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -25,7 +25,7 @@ module RuboCop
25
25
 
26
26
  # @!method offensive_subject_declaration?(node)
27
27
  def_node_matcher :offensive_subject_declaration?, <<~PATTERN
28
- (send nil? ${#Subjects.all #Helpers.all} {(sym :subject) (str "subject")} ...)
28
+ (send nil? ${#Subjects.all #Helpers.all} ({sym str} #Subjects.all) ...)
29
29
  PATTERN
30
30
 
31
31
  def on_send(node)
@@ -2,11 +2,14 @@
2
2
 
3
3
  require_relative 'rspec/capybara/current_path_expectation'
4
4
  require_relative 'rspec/capybara/feature_methods'
5
+ require_relative 'rspec/capybara/negation_matcher'
6
+ require_relative 'rspec/capybara/specific_actions'
5
7
  require_relative 'rspec/capybara/specific_finders'
6
8
  require_relative 'rspec/capybara/specific_matcher'
7
9
  require_relative 'rspec/capybara/visibility_matcher'
8
10
 
9
11
  require_relative 'rspec/factory_bot/attribute_defined_statically'
12
+ require_relative 'rspec/factory_bot/consistent_parentheses_style'
10
13
  require_relative 'rspec/factory_bot/create_list'
11
14
  require_relative 'rspec/factory_bot/factory_class_name'
12
15
  require_relative 'rspec/factory_bot/syntax_methods'
@@ -18,6 +21,7 @@ begin
18
21
  rescue LoadError
19
22
  # Rails/HttpStatus cannot be loaded if rack/utils is unavailable.
20
23
  end
24
+ require_relative 'rspec/rails/inferred_spec_type'
21
25
 
22
26
  require_relative 'rspec/align_left_let_brace'
23
27
  require_relative 'rspec/align_right_let_brace'
@@ -97,6 +101,7 @@ require_relative 'rspec/scattered_setup'
97
101
  require_relative 'rspec/shared_context'
98
102
  require_relative 'rspec/shared_examples'
99
103
  require_relative 'rspec/single_argument_message_chain'
104
+ require_relative 'rspec/sort_metadata'
100
105
  require_relative 'rspec/stubbed_mock'
101
106
  require_relative 'rspec/subject_declaration'
102
107
  require_relative 'rspec/subject_stub'
@@ -7,6 +7,26 @@ module RuboCop
7
7
  module Language
8
8
  extend RuboCop::NodePattern::Macros
9
9
 
10
+ METHODS = %i[
11
+ attributes_for
12
+ attributes_for_list
13
+ attributes_for_pair
14
+ build
15
+ build_list
16
+ build_pair
17
+ build_stubbed
18
+ build_stubbed_list
19
+ build_stubbed_pair
20
+ create
21
+ create_list
22
+ create_pair
23
+ generate
24
+ generate_list
25
+ null
26
+ null_list
27
+ null_pair
28
+ ].to_set.freeze
29
+
10
30
  # @!method factory_bot?(node)
11
31
  def_node_matcher :factory_bot?, <<~PATTERN
12
32
  (const {nil? cbase} {:FactoryGirl :FactoryBot})
@@ -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 = '2.13.2'
7
+ STRING = '2.14.0'
8
8
  end
9
9
  end
10
10
  end
data/lib/rubocop-rspec.rb CHANGED
@@ -23,6 +23,8 @@ require_relative 'rubocop/cop/rspec/mixin/empty_line_separation'
23
23
  require_relative 'rubocop/cop/rspec/mixin/inside_example_group'
24
24
  require_relative 'rubocop/cop/rspec/mixin/namespace'
25
25
  require_relative 'rubocop/cop/rspec/mixin/css_selector'
26
+ require_relative 'rubocop/cop/rspec/mixin/skip_or_pending'
27
+ require_relative 'rubocop/cop/rspec/mixin/capybara_help'
26
28
 
27
29
  require_relative 'rubocop/rspec/concept'
28
30
  require_relative 'rubocop/rspec/example_group'
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: 2.13.2
4
+ version: 2.14.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: 2022-09-22 00:00:00.000000000 Z
13
+ date: 2022-10-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -58,6 +58,8 @@ files:
58
58
  - lib/rubocop/cop/rspec/before_after_all.rb
59
59
  - lib/rubocop/cop/rspec/capybara/current_path_expectation.rb
60
60
  - lib/rubocop/cop/rspec/capybara/feature_methods.rb
61
+ - lib/rubocop/cop/rspec/capybara/negation_matcher.rb
62
+ - lib/rubocop/cop/rspec/capybara/specific_actions.rb
61
63
  - lib/rubocop/cop/rspec/capybara/specific_finders.rb
62
64
  - lib/rubocop/cop/rspec/capybara/specific_matcher.rb
63
65
  - lib/rubocop/cop/rspec/capybara/visibility_matcher.rb
@@ -87,6 +89,7 @@ files:
87
89
  - lib/rubocop/cop/rspec/expect_in_hook.rb
88
90
  - lib/rubocop/cop/rspec/expect_output.rb
89
91
  - lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
92
+ - lib/rubocop/cop/rspec/factory_bot/consistent_parentheses_style.rb
90
93
  - lib/rubocop/cop/rspec/factory_bot/create_list.rb
91
94
  - lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
92
95
  - lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb
@@ -110,12 +113,14 @@ files:
110
113
  - lib/rubocop/cop/rspec/message_expectation.rb
111
114
  - lib/rubocop/cop/rspec/message_spies.rb
112
115
  - lib/rubocop/cop/rspec/missing_example_group_argument.rb
116
+ - lib/rubocop/cop/rspec/mixin/capybara_help.rb
113
117
  - lib/rubocop/cop/rspec/mixin/comments_help.rb
114
118
  - lib/rubocop/cop/rspec/mixin/css_selector.rb
115
119
  - lib/rubocop/cop/rspec/mixin/empty_line_separation.rb
116
120
  - lib/rubocop/cop/rspec/mixin/final_end_location.rb
117
121
  - lib/rubocop/cop/rspec/mixin/inside_example_group.rb
118
122
  - lib/rubocop/cop/rspec/mixin/namespace.rb
123
+ - lib/rubocop/cop/rspec/mixin/skip_or_pending.rb
119
124
  - lib/rubocop/cop/rspec/mixin/top_level_group.rb
120
125
  - lib/rubocop/cop/rspec/mixin/variable.rb
121
126
  - lib/rubocop/cop/rspec/multiple_describes.rb
@@ -132,6 +137,7 @@ files:
132
137
  - lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb
133
138
  - lib/rubocop/cop/rspec/rails/have_http_status.rb
134
139
  - lib/rubocop/cop/rspec/rails/http_status.rb
140
+ - lib/rubocop/cop/rspec/rails/inferred_spec_type.rb
135
141
  - lib/rubocop/cop/rspec/receive_counts.rb
136
142
  - lib/rubocop/cop/rspec/receive_never.rb
137
143
  - lib/rubocop/cop/rspec/repeated_description.rb
@@ -145,6 +151,7 @@ files:
145
151
  - lib/rubocop/cop/rspec/shared_context.rb
146
152
  - lib/rubocop/cop/rspec/shared_examples.rb
147
153
  - lib/rubocop/cop/rspec/single_argument_message_chain.rb
154
+ - lib/rubocop/cop/rspec/sort_metadata.rb
148
155
  - lib/rubocop/cop/rspec/stubbed_mock.rb
149
156
  - lib/rubocop/cop/rspec/subject_declaration.rb
150
157
  - lib/rubocop/cop/rspec/subject_stub.rb